精度误差为双精度
Precision error in double
使用%Lf打印时会更改一个大的双精度值以下组合中的值可给出正确的结果小数前9位/小数后6位例如,用%Lf打印的十进制数之前有9位数字的值输入:3435537287.32输出:3435537287.320000
一旦我将十进制之前的数字增加到10,用%Lf打印的值就会添加垃圾值。例如,用%Lf打印的小数前10位的值输入:34355372871.3487输出:34355372871.348701从上面的输出中可以看出,输入值发生了变化。
对于g++/xlc++,是否有任何编译时选项可以使用,以便不更改值?
::代码段::
double d2 = 34355372871.3487;
double d4 = 3435537287.3487;
printf("d2 = %lfn", d2);
printf("d4 = %lfn", d4);
谢谢,Hudson
简短解释:您需要长双
long double d2 = 34355372871.3487L;
long double d4 = 3435537287.3487L;
printf("d2 = %Lfn", d2);
printf("d4 = %Lfn", d4);
详细解释:你的有效位占用了很多空间;-)以下是浮点值中使用的位。
//Type Sign Exponent Significand Total bit
//Double 1 11 52 64
//Long Double 1 15 64 80
请记住,十进制中的每个数字大约需要3.3位(log(10)/log(2))所以52位/3.3~15-16位。
它是双精度。双精度存储为64位(8字节)。
(http://en.wikipedia.org/wiki/Double-precision_floating-point_format)
它使用52位作为尾数,1位作为信号,11位作为指数。
然后,52位尾数给出15–17位有效十进制数字的精度。
由于浮点数字的精度有限,并非每个(或实际上只有少数)十进制浮点文字都与现有的二进制表示形式完全对应。
每个文字都映射到最接近的现有值。每种浮点类型都会发生这种情况,但对于精度较高的类型,这种情况就不那么明显了,因为有更多不同的数字。
相关文章:
- 如何防止 c++ 在从浮点型转换为双精度型(不适用于 IO)时添加额外的小数?
- 正在将csv文件读取为双精度矢量
- 我可以信任表示整数的浮点或双精度来保持精度吗
- 如何在C++中的同一函数中使用字符串和双精度
- 特征::矩阵<双精度,1,3> 结构类型函数中的返回类型函数
- 检查是否以特定精度给出双精度
- 转换函数,将 std::数组的双精度作为参数或双精度作为参数单独转换
- C 字符串返回字符串的整数/双精度/长整型值
- 为什么将双精度转换为 int 似乎在第 16 位数字之后将其四舍五入?
- 如何使双精度值的 C++ 和 C# 中的结果相同
- 使用浮点数和双精度数的非常小数字的数学
- 使用 Xcode 将双精度存储在数组C++中
- 在 C++ 中将双精度变量写入二进制文件
- 如何从字符串转换为双精度*
- 双倍到科学记数法转换 - 精度误差
- 精度误差为双精度
- 浮点到双精度转换的舍入误差
- c++ linux x86_64中如何控制双精度计算以避免舍入误差
- 双向量数组的log精度误差
- 由于浮点和双精度有限而产生的误差