为什么双精度和长双精度给出不同的答案?
why double and long double are giving different answer in the following program
这段代码正在计算一个级数的第n项,该级数定义为Tn+2=(Tn+1)^2+Tn,其中第一项和第二项在编码中分别表示为a和b。
#include<iostream>
#include<string>
using namespace std;
int main()
{
int a,b,n;
char ch[100];
cin>>a>>b>>n;
long double res[3];
res[0]=a,res[1]=b;
for(int i=n-2;i>0;i--)
{
res[2]=res[1]*res[1]+res[0];
res[0]=res[1];
res[1]=res[2];
}
sprintf(ch,"%.0Lf",res[2]);
cout<<ch;
return 0;
}
输入:0 1 10
输出:84266613096281242861568 // in case of double res[3];
84266613096281243385856 // in case of long double res[3];
correct output : 84266613096281243382112
因为它超出了整型的范围,所以我使用double/long double。
但问题是我得到双精度和长双精度的不同输出,而中间值没有一个在小数点后有非零数字,所以不应该有任何四舍五入,我猜。
而中间值在小数点后没有非零数字,所以我猜不应该有任何四舍五入。
这个假设是完全错误的。所有浮点数(如double
等)的存储方式为
mantissa * 2^exponent
具有有限位数的尾数和指数。因此,浮点数可以存储固定数量的有效数字(对于转换为十进制表示的double
,通常在16左右)。如果一个数字在小数点前有更多的数字,则会发生舍入,并且需要"忘记"的数字越多,总舍入误差就越大。
如果你想了解更多的细节,最常见的浮点实现遵循IEEE浮点标准。
相关文章:
- 如何防止 c++ 在从浮点型转换为双精度型(不适用于 IO)时添加额外的小数?
- 正在将csv文件读取为双精度矢量
- 我可以信任表示整数的浮点或双精度来保持精度吗
- 如何在C++中的同一函数中使用字符串和双精度
- 特征::矩阵<双精度,1,3> 结构类型函数中的返回类型函数
- 检查是否以特定精度给出双精度
- 转换函数,将 std::数组的双精度作为参数或双精度作为参数单独转换
- C 字符串返回字符串的整数/双精度/长整型值
- 为什么将双精度转换为 int 似乎在第 16 位数字之后将其四舍五入?
- 如何使双精度值的 C++ 和 C# 中的结果相同
- 使用浮点数和双精度数的非常小数字的数学
- 使用 Xcode 将双精度存储在数组C++中
- 在 C++ 中将双精度变量写入二进制文件
- 如何从字符串转换为双精度*
- 为什么我的数组双精度函数不起作用?
- 高精度双精度的 Sprintf 格式化问题
- C++ cout 将双精度对齐到精度 2 并正确对齐
- 将当前时间 simTime.dbl() 与以前存储的双精度值进行比较并不总是给出正确的答案......为什么?
- 单精度和双精度铸造给出了不同的答案
- 为什么双精度和长双精度给出不同的答案?