我正在打印来自 C++ 程序的一些数据,以由 ParaView 处理/可视化,但我遇到了浮点数问题。Paraview 支持 Float32 和 Float64 数据类型。Float64 相当于 double ,典型限制为 +/-1.7e +/- 308。但是,我的代码正在打印 6.5e-318 之类的数字。这会在读取数据时在 ParaView 中引发错误。我已经验证将这些小数四舍五入为零会使 ParaView 中的错误消失。我不确定为什么我有这样的“高精度”输出,可能是因为某些数字的存储精度比双精度高。例如,以下代码在我的系统上重现了相同的行为:
#include <iostream>
int main(void)
{
const double var1 = 1.0e-318, var2 = 1.5e-318;
std::cout << 1.0e-318 << std::endl;
std::cout << var1 << std::endl;
std::cout << var1 - var2 << std::endl;
std::cout.setf(std::ios_base::fixed | std::ios_base::scientific, std::ios_base::floatfield);
std::cout << 1.0e-318 << std::endl;
std::cout << var1 << std::endl;
std::cout << var1 - var2 << std::endl;
return 0;
}
我的输出是:
9.99999e-319
9.99999e-319
-4.99999e-319
9.99999e-319
9.99999e-319
-4.99999e-319
我的系统是 Mac OS X Snow Leopard,我用 GCC 4.2和GCC 4.6 测试了上面的 flags-m32
和(不确定这是否有用)。-m64
-ffloat-store
实际上对我来说输出很好,但对 ParaView 来说不是。我只是想知道为什么我有这种差异。我很可能会忽略与浮点数相关的一些可能很重要的东西。您能否给我一些关于双打的输出/数值行为的线索?