一致性:将整数除以2的幂与10的幂?

时间:2012-07-08 11:17:34

标签: c# actionscript-3 floating-point deterministic non-deterministic

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

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

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中看到的那样,所有计算,甚至是整数,都是自动执行Floats,不需要强制转换(也不能避免它或强制运行时执行真正的整数除法) 希望这能解释为什么我会把所有东西都投入Floats:我不是!这只是在一种目标语言中发生的事情!

3 个答案:

答案 0 :(得分:0)

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

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

即使在不同的硬件或.net版本上使用相同的C#代码,第二个也可能不一致。请参阅相关问题Is floating-point math consistent in C#? Can it be?

答案 1 :(得分:0)

我建议你阅读IEEE 754-1985标准。 A copy can be purchased for $43.虽然被2008版本取代,但它是对浮点的一个很好的介绍,因为它只有20页并且非常易读。它将告诉你为什么除以1000和1024都是确定性的,为什么前者可能有错误,但后者没有错误(除了下溢的情况)。它还将为您提供理解您已经给出的答案以及您在错误轨道上的原因的基础。

答案 2 :(得分:0)

  

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

除以1024。 每个基于二进制的浮点系统(IEEE754,IBM,VAX,Cray)将1024除以所有有限数字,将产生 exact 得到给定的表示。原因是除以1024相当于

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

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

由于不需要舍入,因为舍入而没有区别(是的,虽然大多数编程语言使用舍入为偶数,但有些可以选择另一种舍入模式)。