【问题标题】:Are floating points deterministic across iOS devices?iOS 设备上的浮点数是否具有确定性?
【发布时间】:2014-10-18 14:57:22
【问题描述】:

我有几个关于浮点数和 iOS 设备的问题:

浮点数在给定的 iOS 设备上是否具有确定性?
浮点数是否在所有 iOS 设备上都具有确定性?

如果不是,有没有办法使它们具有确定性?我在想的是:编译器设置的更改,减少数学运算集的使用等。

如果没有办法,最好的选择是什么?
我可以改用固定点吗?这是否意味着使用 NSDecimalNumber?

干杯。

【问题讨论】:

  • 你能澄清一下你所说的确定性是什么意思吗?你有什么问题?请注意,编译器设置会影响 IEEE 浮点兼容性,因此您需要检查 Xcode 设置以确保在编译时设置了正确的标志。
  • 我希望我的代码具有确定性。我希望一个返回浮点数的操作在不同的操作系统和设备上返回完全相同的值。我不太关心结果的精度,它只需要稳定。 randomascii.wordpress.com/2013/07/16/floating-point-determinism
  • 对于任何 IEEE 浮点运算,如果输入完全相同(包括系统设置),您将获得完全相同的输出。对于 iOS,您只会冒险在具有不同大小值的整数类型的 iOS 版本之间存在差异,并且只有在较小的值发生溢出(即错误)时才会发生这种情况。
  • @Hot Licks “系统设置”是什么意思?另外,“对于任何 IEEE 浮点运算”是否意味着遵循 IEEE 标准的运算?
  • 设置可能会改变浮点处理单元使用的舍入规则。不过,我从未听说过这些是在 iPhone 上被操纵的。是的,“IEEE 浮动操作”是指 IEEE 754 标准。

标签: ios objective-c floating-point deterministic


【解决方案1】:

相同数据大小的结果应该相同。 IEEE 浮点标准规定了对不同大小的浮点数进行不同浮点运算的结果。

如果不同数据类型的定义因架构而异,您可能会遇到麻烦。

“float”的大小在 ANSI C 中没有正式定义。在某些平台上它可以是 4 个字节,而在其他平台上可以是 8 个字节。 (例如,NSInteger 在 32 位设备上是 32 位,在 64 位设备上是 64 位。我知道它是整数类型,但它是根据平台改变大小的类型的示例。)

我不知道 Apple 是否在其 32 位和 64 位平台之间更改了任何数据类型的大小。也许有确切了解的人可以在这里插话。

最新的 iOS 设备是 64 位的。我建议检查 float/CGFloat 的大小(使用 sizeof()。)如果您无法访问新的 64 位设备之一,您应该能够使用 64 位模拟器对其进行测试。

好像

【讨论】:

猜你喜欢
  • 1970-01-01
  • 2012-09-07
  • 2014-08-11
  • 1970-01-01
  • 2013-02-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-04-06
相关资源
最近更新 更多