浮動小数点数内部表現シミュレーター

数値リテラル→IEEE754内部表現

すると…

IEEE754単精度では… IEEE754倍精度では… sample

IEEE754内部表現→数値リテラル

で、 符号部 、 指数部 仮数部 の値を すると…

2進
10進
16進
指数
sample

概要

浮動小数点数(IEEE754)の内部表現をシミュレートします。

補足

コメント

IPAの情報処理試験の勉強用としてと、JavaScriptで小数の計算の誤差がなぜ発生するのかきちんと理解したかったので作成しました。 おかげで「0.1 + 0.2」がなぜ0.3にならないのかが、ビット単位で把握できました。

※このページの機能は、一部の機能に若干バグがあります。ご了承ください。 このページの機能は、JavaScriptの組込みの機能も利用し処理をしており、極端に大きい・小さい数値では JavaScriptの処理で誤差が発生するため、正しく表現できない現象を確認しています。 現状で把握しているバグの発生する数値とは、「数値リテラル→IEEE754内部表現」時の「5e-324 (Number.MIN_VALUE)」と 「IEEE754内部表現→数値リテラル」時の「9007199254740992 (Number.MAX_SAFE_INTEGER + 1)」です。

9007199254740992はMAX_SAFE_INTEGERより1大きい数ですが、toStringでは完全に変換できます。 しかし、toLocaleStringだと誤差が発生し、元の値より2少ない「9007199254740990」になります。 このページでは、大きな数でも指数表現ではなく10進数で表現したいので、 内部でtoLocaleStringを使っています。結果として、「MAX_SAFE_INTEGER」は9007199254740991になり、 それより大きい「MAX_SAFE_INTEGER + 1」は9007199254740990と、大小関係が逆転する現象が発生します。 SAFE_INTEGERの範囲外なので、正しく変換できないケースがあるのは仕方がないかもしれませんが、 MAX_SAFE_INTEGERより大きな数が、MAX_SAFE_INTEGERより小さく表現されてしまうのはとても違和感があります。 JavaScriptの組込みの機能を利用せず、自前で処理すれば解消できるはずですが、今のところ対応予定はありません。

「5e-324 (Number.MIN_VALUE)」は、0.0000000000...と0が300以上続くとても小さな数です。 仮数部は通常先頭を1とするよう正規化します。しかし指数部が0の場合は特別に正規化しません。 この処理が未実装で、指数部が0の場合も正規化してしまうため正しい値に変換できません。 この処理についてはいずれ実装するかもしれません。

関連

ちょこっとアンケート&メッセージ

このページに関するちょっとした感想または、要望、バグ・間違いの指摘、 質問・その他お問合せ等は、下記の送信欄からお送りください。 返信をご希望の方は「こちらのページ」からメッセージをお送りください。

「このページはお役に立ちましたか?」のアンケートとメッセージのどちらか一方でかまいません (両方書いていただけるとよりうれしいです)。お気軽にご利用ください (感想・フィードバック・どんな用途で使用したかなどをいただけると作成・運営の励みになります!)


このページはお役に立ちましたか?