2016-05-21 5 views
0

私は並べ替えと組み合わせの計算機を作った。数値の階乗を見つけるためのコードは次のとおりです。ここで私の置換計算機が小数を返すのはなぜですか?

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オフになっています。 Math.floor()を使用するとすべて動作しますが、問題の根本を見つけたいと思います。

+0

を意味する。これは、nPr(55,9)を意味する。 –

+1

これはJSでの数字の働きの詳細です。これをチェックしてください:http://stackoverflow.com/questions/3072307/what-is-the-standard-solution-in-javascript-for-handling-big-numbers-bignum – JordanHendrix

+1

階乗についてもこれを残しておきます: 'function factorial(num){ return num> 1? num * factorial(num - 1):num; } ' – JordanHendrix

答えて

2

Javascriptは自動的にすべての数値を倍精度浮動小数点数として扱うので、55階乗(1.27 * 10^73)と46階乗(5.50 * 10^57)が浮動小数点数として格納されているためです。一方、それは非常に大きいので、浮動小数点近似による近似にすぎない商の丸め誤差があります。

はダブル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の累乗であるため、この計算で期待される絶対誤差です。

関連する問題