繁体   English   中英

输出精度高于双精度

[英]Output precision is higher than double precision

我正在打印一些来自C ++程序的数​​据,以便由ParaView处理/可视化,但我遇到浮点数问题。 Paraview支持Float32和Float64数据类型。 Float64相当于两倍,典型限制为+/- 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 Snow Leopard,我用GCC 4.2和GCC 4.6测试了上面的标志-m32-m64-ffloat-store (不确定这是否有用)。

实际上我的输出很好,但对于ParaView则没有。 我只是想知道为什么我有这个区别。 我很可能忽略了与浮点数相关的东西,这可能很重要。 请问你能给我一些关于双打输出/数值行为的线索吗?

次正规数,即具有最小可能指数和分数中前导零的数字, 可以小于1E-308,低至1E-324 您可以使用std :: numeric_limits过滤掉它们。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM