输出精度高于双精度
Output precision is higher than double precision
我正在打印一些来自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.
相关文章:
- 如何防止 c++ 在从浮点型转换为双精度型(不适用于 IO)时添加额外的小数?
- 正在将csv文件读取为双精度矢量
- 我可以信任表示整数的浮点或双精度来保持精度吗
- 如何在C++中的同一函数中使用字符串和双精度
- 特征::矩阵<双精度,1,3> 结构类型函数中的返回类型函数
- 当使用比格式支持的精度更高的精度来显示数字时,会写出什么数据
- 检查是否以特定精度给出双精度
- 高精度双精度的 Sprintf 格式化问题
- 双倍精度太高
- 如何在没有浮点数/双精度数的情况下生成均匀和高斯分布的伪随机数
- 将字符串转换为双精度 - 精度丢失
- 如何打印出精度更高的双数
- 将字符串解析为浮点时精度更高
- 如何通过谷歌glog打印完全双倍精度
- C++:高精度随机双精度数
- 如何获得高分辨率时间戳作为双精度
- 乘以10的倍数时丢失双倍精度
- 如何在C++中以高精度生成随机双精度数
- 将浮点数相乘并保持/获得双精度精度
- 如果双位数精度≈15.955(16),为什么可以打印50位?