● long long int (64bit) とか long double は?

 long long int の乗算のオーバーフローや、long double の指数部・仮数部の実際の振る舞いを調べました。 これは WinXP Cygwin + GNU 環境で調べた結果です。 環境が違うと、long double の仮数部精度さえも異なることもあります。

 ソースプログラム

実行結果:

 * size of int 4         <* int のサイズは 4 byte
* range of int
-536870912
-1073741824
-2147483648
0                <* 結果が負数の int 乗算オーバーフロー

* size of long long int 8    <* long long int のサイズは 8 byte
* range of long long int
-2305843009213693952
-4611686018427387904
-9223372036854775808
0                <* 結果が負数の long long int 乗算オーバーフロー

* size of double 8
* large exponent of double   <* double の指数部が大きくなったとき
9.5136569e+307 class 4
1.1313708e+308 class 4
1.3454343e+308 class 4
1.6e+308 class 4     <* 結果が Inf になる少し手前
Inf class 1

* small exponent of double (1) <* double の指数部が小さくなったとき
4.2044821e-308 class 4
3.5355339e-308 class 4
2.9730178e-308 class 4
2.5e-308 class 4
2.102241e-308 class 3     <* FP_SUBNORMAL になりました

* small exponent of double (2)
2.4703282e-323 class 3
9.8813129e-324 class 3
4.9406565e-324 class 3
0 class 2      <* 耐え切れず、0 になりました

* mantissa precision of double  <* double 仮数部の精度
1.000000000000000000000000e+00
1.000000000000000000000000e+01
1.000000000000000000000000e+02
1.000000000000000000000000e+03
1.000000000000000000000000e+04
1.000000000000000000000000e+05
1.000000000000000000000000e+06
1.000000000000000000000000e+07
1.000000000000000000000000e+08
1.000000000000000000000000e+09
1.000000000000000000000000e+10
1.000000000000000000000000e+11
1.000000000000000000000000e+12
1.000000000000000000000000e+13
1.000000000000000000000000e+14
1.000000000000000000000000e+15
1.000000000000000000000000e+16
1.000000000000000000000000e+17
1.000000000000000000000000e+18
1.000000000000000000000000e+19
1.000000000000000000000000e+20
1.000000000000000000000000e+21
1.000000000000000000000000e+22
9.999999999999999161139200e+22   <* ボロが見えてきました
9.999999999999999832227840e+23
9.999999999999998758486016e+24
9.999999999999998758486016e+25
9.999999999999998758486016e+26
9.999999999999999583119737e+27
9.999999999999999143315086e+28
9.999999999999998791471365e+29
9.999999999999998509996388e+30
9.999999999999998735176369e+31
9.999999999999999455752310e+32
9.999999999999999455752310e+33
9.999999999999999686336611e+34
9.999999999999998948466848e+35
9.999999999999998358171037e+36
9.999999999999997885934389e+37
9.999999999999997885934389e+38    <* やっぱり 16 桁ですね

* size of long double 12       <* ここの long double は 96bit です
* mantissa precision of long double  <* long double 仮数部の精度
1.000000000000000055511151e+00
1.000000000000000055511151e+01
1.000000000000000055511151e+02
1.000000000000000055511151e+03
1.000000000000000055511151e+04
1.000000000000000055493388e+05
1.000000000000000055479177e+06
1.000000000000000055479177e+07
1.000000000000000055442797e+08
1.000000000000000055413693e+09
1.000000000000000055413693e+10
1.000000000000000055432320e+11
1.000000000000000055432320e+12
1.000000000000000055408478e+13
1.000000000000000055389404e+14
1.000000000000000055419922e+15
1.000000000000000055468750e+16
1.000000000000000055468750e+17
1.000000000000000055500000e+18
1.000000000000000055500000e+19
1.000000000000000055520000e+20
1.000000000000000055552000e+21
1.000000000000000055500800e+22
1.000000000000000055541760e+23
1.000000000000000055574528e+24
1.000000000000000055574528e+25
1.000000000000000055532585e+26
1.000000000000000055566139e+27
1.000000000000000055592983e+28
1.000000000000000055550033e+29
1.000000000000000055550033e+30
1.000000000000000055563777e+31
1.000000000000000055596763e+32
1.000000000000000055631947e+33
1.000000000000000055631947e+34
1.000000000000000055643206e+35
1.000000000000000055679235e+36
1.000000000000000055679235e+37
1.000000000000000055702293e+38
1.000000000000000055702293e+39   <* ↑普通の double より素直です

* large exponent of long double   <* long double の指数部が大きくなったとき
1.00000000e+4930
1.00000000e+4931
1.00000000e+4932
Inf
Inf

* small exponent of long double   <* long double の指数部が小さくなったとき
1.00000000e-4940
1.00000000e-4941
9.99999999e-4943           <* 仮数部の値が怪しい!
1.00000002e-4943           <* SUBNORMAL 領域なのでしょう
9.99999981e-4945
9.99998523e-4946
9.99987588e-4947
9.99878232e-4948
9.98784672e-4949
9.84203874e-4950
1.09355986e-4950
0.00000000e+00           <* 耐え切れず、0 なりました
0.00000000e+00
0.00000000e+00
0.00000000e+00


  Top に戻る