对于计算机的浮点数而言,因为浮点数的精度有限,会导致相同的数据因为相加顺序的不同产生不同的误差,进而导致最终的值不同
public:
double func(int n)
{
if(n==0)return 1;
double temp=1;
for(int i=1;i<=n;i++)
{
temp*=i;
}
return temp;
}
int climbStairs(int n) {
int temp1=n/2;
int temp2=n-temp1*2;
double num=0;
for(int i=0;i<=temp1;i++)
{
num+=func(temp1+temp2+i)/(func(temp1-i)*func(2*i+temp2));
}
return num;
}
};
num+=func(temp1+temp2+i)/(func(temp1-i)*func(2*i+temp2));
num+=func(n-i)/(func(i)*func(n-2*i));
当给climbStairs(44)时,虽然第一个式子和第二个式子所需要计算的式子相同,但第一个式子是从大数开始加,第二个式子是从小开始加;导致结果: 预测值:1134903170 第一个式子:1134903169 第二个式子:1134903170 这是因为浮点数相加时小数会先转化为大数的位数,然后尾相加。
比如假设现在有精度为3位的浮点数,100,0.2,0.4,0.4;
先加大数:100+0.2;0.2转化为002.0然后尾加为100.2,精度为3位,结果为100;
继续加就得100+0.2+0.4+0.4=100(100.2因为精度只有3位导致0.2被舍去);
但是如果从小的数开始加就变为:0.2+0.4=0.6(相同指数位);0.6+0.4=1;1+100=101(1先转化为001然后尾加为101,3位精度)
所以对浮点数进行相加时要先加小数( •̀ ω •́ )✧