Typescriptにおける数値リテラルおよび浮動小数点表示とは
TypeScriptにおける数値リテラルはIEEE754倍精度浮動小数点数である。
浮動小数点数とは、浮動小数点数は、1/0だけでマイナス符号や小数点がある数を表現する方法
IEEE754とは元々浮動小数点数の規格が異なっていたのを統一されたものから由来し、現在デファクトとなっているもの。
実際の計算方法などは以下のサイトを確認してほしい。
当記事ではIEEE754とは、そしてそのメリット・デメリットを記載する。
IEEE754とは
実数を32bitで表す単精度、62bitで表す倍精度がある。
Typescriptの数値型では倍精度で表す。
単精度で説明すると、以下の定義に従ってIEEE754では実数が表示される。
全体が32bit
符号部が1bit
指数部が8bit
仮数部が23bit
ここで一般的な浮動小数点数の正規化とIEEE754が異なるのは、
- 数値の1桁目をもつように正規化すること(IEEE754で表示する際その1桁目は暗黙に消される)
- 指数部分にバイアス値として127を足すこと
である。
このバイアス値について、指数部が8bitという制約があるため、8bitで表される-126~127のうち、-の表現を潰し込むために加算するのかなと想像する。
例:0.00000..........011などを1.0000....1という形にするときに指数部は-126とかになった場合でも、指数をマイナスで表さないようできる。
メリット
上記の通り、実数をマイナスなしに表現できる。
表現できる最大値も格段に大きい。
32bitで表現できる最大値をGPTくんに計算してもらった
10進数:4,294,967,295(2^256)
IEEE754:3.402823×10^38(仮数部すべて1,指数部254)
デメリット
あくまでIEEE754で表現される値は32bit(単数なら)であるため、それ以上の仮数であったり指数部をもつ値は近似値である。
例
0.1=0.00011001100110011....
の循環小数であるが、仮数部が有限であるため正確に表現できない。
このため、TypeScriptでは0.1+0.2などで0.3とならない。
参考
IEEEができた経緯、浮動小数点演算のメリット、IEEE754の定義
[浮動小数点・IEEE754の計算方法]
(https://www.seplus.jp/dokushuzemi/ec/fe/fenavi/mastering_tech/float/)
Discussion