我在Fortran 90中编写了一个用于多维优化的BFGS算法版本。我已经编写了代码,在我的笔记本电脑上运行了gfortran(运行Windows Vista),它工作正常。但是当我尝试在运行Linux 6的服务器上使用相同的代码时,它会给出错误的结果。它是完全相同的代码,它编译得很好,它产生的结果是错误的。也就是说,它似乎在算法的某个早期阶段产生浮点算术误差,并且在开始产生NaN之前只产生一行数值结果。我只能假设它与服务器环境有关,但我怎样才能知道它是什么以及如何相应地更正我的代码呢?
答案 0 :(得分:1)
问题在此处描述(CERT.org): FLP00-C. Understand the limitations of floating point numbers
这种行为的原因是Linux在IA-32机器上使用x87浮点单元(FPU)的内部扩展精度模式,以提高计算过程中的准确性。存储结果时通过赋值给c进入内存,FPU自动舍入结果以适合双精度。现在,从内存中读回的值与内部表示不相等,后者具有扩展的精度。 Windows不使用扩展精度模式,因此所有计算都以双精度完成,存储在内存中的值与FPU内部的值之间没有精度差异。对于GCC,在优化时进行编译级别1或更高级别消除了不必要的存储到内存中,因此所有计算都在FPU中以扩展精度进行
解决方案在此处描述: FLP02-C. Avoid using floating point numbers when precise computation is needed 有两个示例,一个显示问题的错误示例,以及没有问题的更正示例:
“可以通过用内部添加的整数替换浮点数来修复此代码。仅在打印结果和进行除法计算平均值时才使用浮点数。”