4

我从C++程序中打印一些数据以便通过ParaView进行处理/可视化,但我遇到了浮点数问题。 Paraview支持Float32和Float64数据类型。 Float64相当于典型限制+/- 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雪豹和我测试了上面GCC 4.2和GCC 4.6与标志-m32,-m64-ffloat-store(不知道这是否有用)。

其实我的输出是好的,但对于ParaView不是。我只想知道为什么我有这种差异。我很可能会忽略与浮点数有关的重要事项。请给我一些关于双打的输出/数字行为的线索吗?

+1

究竟是什么问题?我看不出前后有什么区别。 1.0e-318实际上是'IS' 9.99999e-319 – GreenScape

+0

@GreenScape:问题似乎是普通双打只能下降到〜2.2e-308,而其他所有结果都是非规格化的浮点数,下降到〜4.9e- 324。许多程序看不到非规范化的浮游物。 – PlasmaHH

回答

11

子异常数字,即分数中可能指数最小和前导零的数字,can be smaller than 1E-308, down to 1E-324。你可以使用std :: numeric_limits来过滤它们。

+0

是的,我认为这可能是解决方案,通过比较实际双重最低值和当前值。感谢您指出有关次正常号码的信息。 – iluvatar