为什么我的排列计算器返回小数?
Why is my permutation calculator returning decimals?
我做了一个排列组合计算器。求一个数的阶乘的代码是:
function factorial(num){
total=1;
if(num==1||num==0){
return total;
}
else{
for(i=2;i<=num;i++){
total*=i;
}
return total;
}
}
这是查找排列的代码:
answer.innerHTML="Answer: "+factorial(n)/factorial(n-r);
如果我做 55P9,我的答案是 0.5 off。如果我使用 Math.floor() 一切正常,但我想找到问题的根源。
它返回小数的原因是因为 55 阶乘 (1.27 * 10^73) 和 46 阶乘 (5.50 * 10^57) 被存储为浮点数,因为 Javascript 自动将所有数字视为双精度数精度浮点数。同时,由于它太大了,由于浮点数近似只是一个近似值,所以在商中存在舍入误差。
在 MATLAB 中仔细检查:
>> factorial(55)/factorial(46)
ans =
2.3073e+15
>> ans - floor(ans)
ans =
0.5000
>> .5/(factorial(55)/factorial(46))
ans =
2.1670e-16
>> eps
ans =
2.2204e-16
正如您在此处看到的,由于浮点精度错误,MATLAB 得到了相同的结果。此外,因此,.5 是此计算预期的绝对误差,因为它应该是 2 的某个幂。
我做了一个排列组合计算器。求一个数的阶乘的代码是:
function factorial(num){
total=1;
if(num==1||num==0){
return total;
}
else{
for(i=2;i<=num;i++){
total*=i;
}
return total;
}
}
这是查找排列的代码:
answer.innerHTML="Answer: "+factorial(n)/factorial(n-r);
如果我做 55P9,我的答案是 0.5 off。如果我使用 Math.floor() 一切正常,但我想找到问题的根源。
它返回小数的原因是因为 55 阶乘 (1.27 * 10^73) 和 46 阶乘 (5.50 * 10^57) 被存储为浮点数,因为 Javascript 自动将所有数字视为双精度数精度浮点数。同时,由于它太大了,由于浮点数近似只是一个近似值,所以在商中存在舍入误差。
在 MATLAB 中仔细检查:
>> factorial(55)/factorial(46)
ans =
2.3073e+15
>> ans - floor(ans)
ans =
0.5000
>> .5/(factorial(55)/factorial(46))
ans =
2.1670e-16
>> eps
ans =
2.2204e-16
正如您在此处看到的,由于浮点精度错误,MATLAB 得到了相同的结果。此外,因此,.5 是此计算预期的绝对误差,因为它应该是 2 的某个幂。