掲題の通りです。
Number.MAX_VALUEはjavascriptで扱える最大の値で
これを超えたら無限大の扱いになると思っていたのですが、
実際そうはなりません。
こういう仕様なのでしょうか?
詳しい方、ご回答頂けますでしょうか。。。
気になる質問をクリップする
クリップした質問は、後からいつでもMYページで確認できます。
またクリップした質問に回答があった際、通知やメールを受け取ることができます。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
回答2件
0
ベストアンサー
仕様です。
Number.MAX_VALUE+1
の結果は、無限大(Infinity
)よりもNumber.MAX_VALUE
の方に近いので、Number.MAX_VALUE
に丸められてしまうからです。
(ゆえに、奇妙なことにNumber.MAX_VALUE+1 == Number.MAX_VALUE
はtrue
になります。)
このことを理解するには、計算に用いられている IEEE 754 の 64ビット倍精度 のことや、端数処理に用いられている 最近接偶数への丸め のことを知る必要があります。
やや煩雑な内容ですので、これ自体の詳しい説明は省きます。
簡単に言いますと、__JavaScript__は計算結果を丸めるときに、
最大の値(Number.MAX_VALUE
)は2の1024乗-2の971乗、
無限大(Infinity
)は2の1024乗、
であると考えて、近い方に丸めています。
ここで、Number.MAX_VALUE
とInfinity
の差は2の971乗です。
Number.MAX_VALUE
に1
を足したところで、2の971乗の差を埋めるには程遠いので、Number.MAX_VALUE
に丸められてしまうのです。
逆に考えると、Number.MAX_VALUE
に2の971乗の半分を足した数は ちょうど2つの数の半分地点になりますよね。
2の971乗の半分を足したらどうなるか、実際に試してみます。
lang
1var MAX = Number.MAX_VALUE; 2var n = Math.pow(2,971) * 0.5; // 2の971乗の半分 3console.log( MAX+n ); // Infinity
切り上げられてInfinity
になりました。
また、足す数を2の971乗の半分よりちょっと小さい値や大きい値にすると、Number.MAX_VALUE
とInfinity
がちょうど切り替わるのが分かります。
lang
1var MAX = Number.MAX_VALUE; 2var n = Math.pow(2,971) * 0.49999999; // 2の971乗の半分よりちょっと小さい 3console.log( MAX+n ); // 1.7976931348623157e+308 4console.log( MAX+n == MAX ); // true。つまり Number.MAX_VALUE の方に丸められた 5console.log( isFinite( MAX+n ) ); // 有限の数なのでもちろん true 6 7var n = Math.pow(2,971) * 0.50000001; // 2の971乗の半分よりちょっと大きい 8console.log( MAX+n ); // Infinity 9console.log( MAX+n == Infinity ); // true。つまり Infinity になった 10console.log( isFinite( MAX+n ) ); // 無限なのでもちろん false
投稿2015/05/16 16:35
編集2015/05/16 17:04総合スコア368
あなたの回答
tips
太字
斜体
打ち消し線
見出し
引用テキストの挿入
コードの挿入
リンクの挿入
リストの挿入
番号リストの挿入
表の挿入
水平線の挿入
プレビュー
質問の解決につながる回答をしましょう。 サンプルコードなど、より具体的な説明があると質問者の理解の助けになります。 また、読む側のことを考えた、分かりやすい文章を心がけましょう。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。