输出精度高于双精度

Output precision is higher than double precision

本文关键字:双精度 精度高 输出      更新时间:2023-10-16

我正在打印一些来自c++程序的数据,由ParaView处理/可视化,但我有浮点数的问题。Paraview支持Float32和Float64数据类型。Float64相当于double,典型限制为+/-1.7e +/- 308。但是,我的代码打印的是像6.5e-318这样的数字。这是在ParaView读取数据时抛出错误。我已经验证了舍入这些小数字为零使ParaView中的错误消失。我不知道为什么我有这样的"高精度"输出,也许是因为一些数字存储在比double更高的精度。例如,下面的代码在我的系统上再现了相同的行为:

#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不是。我只是想知道为什么我有这种差异。我很可能忽略了一些与浮点数相关的东西,这些东西可能很重要。你能给我一些关于双精度的输出/数值行为的提示吗?

次正常数,即分数中指数最小且前导零的数,可以小于1E-308,直至1E-324。您可以使用std::numeric_limits.

将它们过滤掉。