% Function DECODE-FLOAT, SCALE-FLOAT, FLOAT-RADIX, FLOAT-SIGN, FLOAT-DIGITS, FLOAT-PRECISION, INTEGER-DECODE-FLOAT
Function DECODE-FLOAT
, SCALE-FLOAT
, FLOAT-RADIX
,
FLOAT-SIGN
, FLOAT-DIGITS
, FLOAT-PRECISION
, INTEGER-DECODE-FLOAT
decode-float
float => significand, exponent, sign
scale-float
float integer => scaled-float
float-radix
float => float-radix
float-sign
float-1 &optional
float-2 => signed-float
float-digits
float => digits1
float-precision
float => digits2
integer-decode-float
float => significand, exponent, integer-sign
digits1 - 非負の整数
digits2 - 非負の整数
exponent - 整数
float - 浮動小数
float-1 - 浮動小数
float-2 - 浮動小数
float-radix - 整数
integer - 非負の整数
integer-sign - 整数の-1
か、整数の1
scaled-float - 浮動小数
sign - floatと同じ型の浮動小数であり、数値として1.0
か-1.0
と等しいもの
signed-float - 浮動小数
significand - 浮動小数
decode-float
は、floatの特性を反映した3つの値を計算します。
最初の値はfloatと同じ型で表現された仮数です。
2つめの値は基数(この定義ではbとして表記される)に基づいた
指数の表現であり、
最初の結果と乗算した結果がfloatの絶対値となるよう
生成されるような値でなければなりません。
もしfloatがゼロのときは、
どのような整数値でも返却できますが、
scale-float
で示されるものと同一になるように提供されます。
3つめの値はfloatと同じ型の値であり、
floatがゼロ以上なら1.0
、それ以外なら-1.0
になります。
decode-float
はfloatををbのべき乗で割り、
その値が1/b
(包む)と1
(含まない)の間になるようにし、
その商を最初の値として返します.
しかし、もしfloatがゼロのときは、
その結果はfloatの絶対値
(つまり負のゼロのときは、その仮数が正のゼロとして考えられます)
と等しくなります。
scale-float
は、
(* float (expt (float b float) integer))
を返却します。
ただしbは浮動小数表現の基数です。
floatは1/b
と1
の間である必要はありません。
float-radix
は、floatの基数を返却します。
float-sign
は、
数をzとしたとき、
zとfloat-1が同じ符号を持ち、
zとfloat-2が同じ絶対値を持つような
zを返却します。
もしfloat-2が指定されなかったとき、
その値は(float 1 float-1)
になります。
もし実装が負のゼロと正のゼロを区別するときは、
(float-sign -0.0) => -1.0
になります。
float-digits
は、
floatの表現で使用されている浮動小数型の、
基数bの値の数(個数)を返却します
(隠しビットのような暗黙的な数も含まれます)。
float-precision
は、
floatの値内部に現れる基数bの値の仮数の数(個数)を返却します。
もしfloatが浮動小数のゼロのとき、結果は整数のゼロです。
正規化された浮動小数の場合は、
float-digits
とfloat-precision
の結果は同じです。
しかし、非正規化かゼロの場合におけるprecision
(精度)は、
表現された値の数(個数)より小さくなります。
integer-decode-float
は、floatの特性を反映した3つの値を計算します。
最初の値は整数としてスケールが調整された仮数であり、
最後の2つの値はdecode-float
によって返却されるものと同じです。
もしfloatがゼロのときは、
integer-decode-float
は最初の値にゼロを返却します。
2つめの値は、decode-float
として
最初の値と同じ関係のような値を生成します。
次のような関係が成り立ちます。
(multiple-value-bind (signif expon sign)
(integer-decode-float f)
(scale-float (float signif f) expon)) == (abs f)
;; 下記の例の目的は実装の詳細を公開することではありますが、
;; これらの全ての例は非常に実装依存であることに注意してください。
;; 結果はおそらく広く変化します。ここに示した値は、
;; ある特定の実装を選んだもので一貫しています。
(decode-float .5) => 0.5, 0, 1.0
(decode-float 1.0) => 0.5, 1, 1.0
(scale-float 1.0 1) => 2.0
(scale-float 10.01 -2) => 2.5025
(scale-float 23.0 0) => 23.0
(float-radix 1.0) => 2
(float-sign 5.0) => 1.0
(float-sign -5.0) => -1.0
(float-sign 0.0) => 1.0
(float-sign 1.0 0.0) => 0.0
(float-sign 1.0 -10.0) => 10.0
(float-sign -1.0 10.0) => -10.0
(float-digits 1.0) => 24
(float-precision 1.0) => 24
(float-precision least-positive-single-float) => 1
(integer-decode-float 1.0) => 8388608, -23, 1
なし。
実装が表現している浮動小数
関数decode-float
,
float-radix
,
float-digits
,
float-precision
,
integer-decode-float
は、
最初の引数のみが浮動小数でないときエラーを通知するべきです。
関数scale-float
は、
最初の引数が浮動小数ではないか、
あるいは2番目の引数が整数でないときに
エラーを通知するべきです。
関数float-sign
は、
最初の引数が浮動小数ではないか、
あるいは2番目の引数が指定されていたものの浮動小数ではないときに
エラーを通知するべきです。
なし。
decode-float
かinteger-decode-float
の最初の結果と、
2つめの結果を基数のべき乗としたものの積は、
3つめの結果とfloatによって得られたその値と正確に等しくなります。
(multiple-value-bind (signif expon sign)
(decode-float f)
(scale-float signif expon))
== (abs f)
そして下記が成り立ちます。
(multiple-value-bind (signif expon sign)
(decode-float f)
(* (scale-float signif expon) sign))
== f