请考虑以下代码:
0.1 + 0.2 == 0.3 -> false
Run Code Online (Sandbox Code Playgroud)
0.1 + 0.2 -> 0.30000000000000004
Run Code Online (Sandbox Code Playgroud)
为什么会出现这些不准确之处?
我阅读了关于heisenbug的维基页面,但是不明白这个例子.任何人都可以详细解释一下吗?
heisenbug的一个常见示例是在使用优化编译器编译程序时出现的错误,但是在没有优化的情况下编译相同程序时则不会出现错误(通常是为了使用调试器进行检查).在调试时,优化程序通常保留在寄存器中的值通常会被推送到主存储器.例如,这可能会影响浮点比较的结果,因为存储器中的值可能比寄存器中的值具有更小的范围和精度.
我有一些编写fortran代码的经验,但我从未见过这样的东西.
我正在使用大型HPC代码(~10K行),我在其中修改子程序.我使用print语句验证一切都已正确完成并在必要时进行调试.当我用PRINT我使用的最后一个语句运行我的代码时,代码到处都给我实数.一旦我评论了最后一个PRINT语句,代码就是给我NaN一些变量.由于我的代码太大,我显然不能在这里发布,但我会发表PRINT声明:
PRINT*, "outletBC up1 ", SUM(ABS(up(nptsx,:,:)))
Run Code Online (Sandbox Code Playgroud)
哪里up是一些速度阵列.
题:
怎么可能?PRINT语句如何可能影响任何变量?