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