在32位平台中,双倍乘法在编译时间和运行时之间有所不同

瓦吉

我正在32位和64位平台上编译并运行以下程序:

int main()
{
  double y = 8.34214e08;
  double z = 1.25823e45;

  return y * z == 8.34214e08 * 1.25823e45;
}

在64位中,结果是预期的(值相同,并且退出代码为非零),在32位中,似乎在编译时计算的值,比较的右侧和左侧之间存在少许差异边在运行时计算。

这是编译器中的错误还是有逻辑上的解释?

编辑:这与为什么将double和float进行比较会导致意外结果不同?因为这里所有的值都是双精度的。

IEEE-754允许以更高的精度进行中间计算(强调我的意思)。

(IEEE-754:2008)“语言标准还应该定义并要求实现提供提供属性,该属性分别允许或不允许对块进行值更改优化。这些优化可能包括但不限于: [...]在表达评估中使用更广泛的中间结果。”

例如,在IA-32上,双精度值可以更高的精度(80位而不是64位)存储在x87 FPU寄存器中。因此,您实际上是在比较以双精度进行的乘法和以双精度进行的乘法。

例如,在结果为x64的x64上1(不使用x87 FPU而是使用SSE),添加使用x87的gcc选项-mfpmath=387会使结果0在我的计算机上更改为

如果您想知道C是否也允许这样做,那就是:

(C99,6.3.1.p8)“浮动操作数的值和浮动表达式的结果的表示精度和范围可能比类型所需的精度和范围更大。”

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

JUnit的版本在运行时和编译时有所不同吗?

函数参数类型有所不同,没有任何编译或运行时错误

控件在运行时和设计时看起来有所不同

ThreadPool对于调试模式和运行时的行为有所不同

从Matlab和Terminal运行时,bash脚本的执行有所不同

在方法中运行时,内置type()函数的行为有所不同

为什么回显$?在此脚本中运行时是否有所不同?

为什么在本地运行和远程运行时,webbrowser lib的行为有所不同?

剪辑视图的框架在Xcode 5和Objective-C中在运行时错误时将有所不同

Xcode 8 Swift 3中,“导航栏”的警告框在运行时将有所不同

在docker容器中运行时,`strace -f`的工作方式是否有所不同?

为什么此代码在JSBin中重复运行时会有所不同?

从IntelliJ运行时,Spring的初始化方式有所不同

搜索栏的框架在运行时会有所不同

在Windows或Linux上运行时,功能的行为有所不同

是什么导致即使在未修改源和编译器标志的情况下,目标文件在编译之间也有所不同?

stdout 中的输出在 cmd 和 Python 控制台中有所不同

为什么AWS Lambda计费对于不同的运行时会有所不同?

在Delphi中编译为32位或64位时,MD5 base64哈希值有所不同-如何使它们相同?

如果大量的计算功能位于循环的条件部分,则运行时是否有所不同?

iOS 7:“标签-标签”放错视口的框架在运行时将有所不同

如果我在循环外评估数组的大小,运行时效率是否有所不同?

框架“在运行时会有所不同”。...这不是重点吗?

如何删除警告“按钮的框架在运行时会有所不同。”

为什么从jupyter笔记本运行时,龙卷风AsyncHTTPClient的行为会有所不同?

为什么在通过x-terminal-emulator运行时urxvt看起来有所不同?

Python 2 pdb:在pdb提示符下运行时,语句的行为有所不同

从node.js shell和文件运行时,JavaScript代码输出有所不同

在Google Apps脚本中,使用新的V8运行时时,断点的工作方式是否有所不同?