質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
JavaScript

JavaScriptは、プログラミング言語のひとつです。ネットスケープコミュニケーションズで開発されました。 開発当初はLiveScriptと呼ばれていましたが、業務提携していたサン・マイクロシステムズが開発したJavaが脚光を浴びていたことから、JavaScriptと改名されました。 動きのあるWebページを作ることを目的に開発されたもので、主要なWebブラウザのほとんどに搭載されています。

Q&A

解決済

2回答

1102閲覧

isFinite(Number.MAX_VALUE+1)がfalseになりません。

777

総合スコア34

JavaScript

JavaScriptは、プログラミング言語のひとつです。ネットスケープコミュニケーションズで開発されました。 開発当初はLiveScriptと呼ばれていましたが、業務提携していたサン・マイクロシステムズが開発したJavaが脚光を浴びていたことから、JavaScriptと改名されました。 動きのあるWebページを作ることを目的に開発されたもので、主要なWebブラウザのほとんどに搭載されています。

0グッド

1クリップ

投稿2015/05/16 13:56

掲題の通りです。

Number.MAX_VALUEはjavascriptで扱える最大の値で
これを超えたら無限大の扱いになると思っていたのですが、
実際そうはなりません。

こういう仕様なのでしょうか?

詳しい方、ご回答頂けますでしょうか。。。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答2

0

ベストアンサー

仕様です。
Number.MAX_VALUE+1の結果は、無限大(Infinity)よりもNumber.MAX_VALUEの方に近いので、Number.MAX_VALUEに丸められてしまうからです。
(ゆえに、奇妙なことにNumber.MAX_VALUE+1 == Number.MAX_VALUEtrueになります。)

このことを理解するには、計算に用いられている IEEE 754 の 64ビット倍精度 のことや、端数処理に用いられている 最近接偶数への丸め のことを知る必要があります。
やや煩雑な内容ですので、これ自体の詳しい説明は省きます。

簡単に言いますと、__JavaScript__は計算結果を丸めるときに、
最大の値(Number.MAX_VALUE)は2の1024乗-2の971乗
無限大(Infinity)は2の1024乗
であると考えて、近い方に丸めています。
ここで、Number.MAX_VALUEInfinityの差は2の971乗です。
Number.MAX_VALUE1を足したところで、2の971乗の差を埋めるには程遠いので、Number.MAX_VALUEに丸められてしまうのです。

逆に考えると、Number.MAX_VALUE2の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_VALUEInfinityがちょうど切り替わるのが分かります。

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
kura

総合スコア368

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

kuraさん、ありがとうございます。

正直申し上げると
学術的な部分は理解しきれなかったですが、
仕様だとわかり安心しました。

ご提示いただいたスクリプトも
拝見し、動作させて頂きましたところ
想定通りの結果でした。

以上、よろしくお願い致します。

投稿2015/05/17 00:42

777

総合スコア34

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問