【发布时间】:2012-07-08 11:17:34
【问题描述】:
这是一个关于浮点运算的跨平台一致性和确定性的问题(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 中看到的,所有计算,即使是整数,都自动作为浮点数执行,不需要强制转换(也不能避免它或强制运行时执行真正的整数除法) 希望这可以解释为什么我将所有内容都“投射”到浮点数中:我不是!这只是在其中一种目标语言中发生的事情!
【问题讨论】:
-
您没有在问题或标签中指定任何编程语言。在许多编程语言中,这两种结构同样具有可移植性和面向未来的能力。实际上,在许多编程语言中,“伪代码”中的除法是整数除法,结果是整数结果。
-
为了清楚起见,我添加了语言和“cast to float”。在 C# 中确实会被视为整数除法,但在 AS3 中,内部所有计算都以浮点数执行,并且自动隐含强制转换。
-
啊;别再换问题了!
-
我没有改变它,只是澄清“伪代码”部分,正如我所说的那样,其中一种语言是 AS3,在 AS3
var myInt:int = 1/3 + 2/3; // = 1中没有任何“强制转换”浮动,如在 AS3 中,所有计算都在内部作为浮点数执行。因此,我添加了“更改”,我只是明确说明了 AS3 中发生的情况。当然,在 C# 中它是不同的,但由于我同时针对这两种语言,我必须在最低公分母上工作。 -
@MartinK:我不得不删除我原来的答案,因为它不再有效(因此,你改变了问题的意思!)。无论如何,我不确定 C# 和 AS3 的“最小公分母”是什么;它们是完全不同的语言,处理浮点问题的规范可能不同。
标签: c# actionscript-3 floating-point deterministic non-deterministic