1

这是一个关于浮点运算的跨平台一致性和确定性的问题(IE 在不同的 CPU/系统上产生不同的结果)

哪一个更有可能保持跨平台一致(伪代码):

float myFloat = float ( myInteger) / float( 1024 )

或者

float myFloat = float ( myInteger ) / float( 1000 )

平台是 C# 和 AS3。

.

AS3 版本:

var myFloat:Number = myInteger  /  1000 // AS3
var myFloat:Number = myInteger  /  1024 // AS3

- 好的,我添加了 AS3 版本以进行澄清,相当于上面的“C 伪代码”。正如您在 AS3 中看到的,所有计算,即使是整数,都会自动作为浮点数执行,不需要强制转换(也不能避免它或强制运行时执行真正的整数除法)希望这可以解释为什么我“强制转换”所有内容成花车:我不是!这只是在一种目标语言中发生的事情!

4

3 回答 3

0

第一个在两个平台上可能相同,因为不存在表示问题。特别是对于小整数(最高 8 位未使用),只有一个确切的结果,并且很可能会使用该结果。

但我不会依赖它。如果您需要有保证的确定性,我建议您自己在纯整数之上实现所需的算术。例如使用定点表示。

第二个可能不一致,即使在不同的硬件或 .net 版本上使用相同的 C# 代码也是如此。请参阅相关问题C# 中的浮点数学是否一致?是真的吗?

于 2012-07-08T11:40:21.253 回答
0

我建议您阅读 IEEE 754-1985 标准。可以以 43 美元的价格购买一份副本。尽管已被 2008 版本取代,但它是对浮点的极好介绍,因为它只有 20 页,而且可读性很强。它将向您展示为什么除以 1000 和除以 1024 都是确定性的,以及为什么前者可能有错误但后者没有(下溢除外)。它还将为您理解所获得的答案以及为什么您走错了路提供了基础。

于 2012-07-08T12:54:14.413 回答
0

哪一个更有可能保持跨平台一致(伪代码):

除以 1024。 每个基于二进制的浮点系统(IEEE754、IBM、VAX、Cray)将除以 1024 应用于所有有限数将在给定的表示中产生精确的结果。原因是除以 1024 等价于

  • 将位向右移动 10 个位置,这意味着
  • 将二进制指数减 10

如果数字太小(对于IEEE754 1E-38/1E-308),你会失去一个精确的结果,但这不是操作的问题,而是数字的有限范围......它根本无法显示这么小的结果准确无误。

由于不需要舍入,因此舍入不会有任何差异(是的,虽然大多数编程语言使用舍入到偶数,但有些语言可以选择另一种舍入模式)。

于 2012-07-08T14:05:01.830 回答