#:g1: 浮動小数点数のdescribe

Posted 2021-08-29 02:12:36 GMT

Lucid CLで浮動小数点数をdescribeすると気の効いた表示をしてくれるようなので、他の処理系はどうなのか調べてみました。
下記は、4.18695205d7describeした結果です。

Lucid CL

4.18695205E7 is a float.  It has 53 bits of precision.
The mantissa is 5619631913959424 and the exponent is -27.
(rational 4.18695205E7) is 83739041/2.
(rationalize 4.18695205E7) is 83739041/2.

Allegro CL

4.18695205d+7 is a NEW DOUBLE-FLOAT.
 The hex representation is [#x4183f706 84000000].

Armed Bear CL (ABCL)

4.18695205d7 is an object of type DOUBLE-FLOAT.

CLISP

4.18695205d7 is a float with 53 bits of mantissa (double-float).

Clozure CL

Float: 4.18695205D+7
Scientific: 4.19D+7
Log base 2: 25.319397060287525D0
Ratio equiv: 83739041/2
Nearest integer: 41869520

CMU CL

4.18695205d7 is a DOUBLE-FLOAT.

ECL

4.18695205d7 - double-float
 exponent:  -27
 mantissa:  5619631913959424

Eclipse CL

4.1869520499999996d+7 is a DOUBLE-FLOAT at #x-3E1F3100:
  ECLIPSE::SIGNIFICAND: 5619631913959424
  ECLIPSE::EXPONENT: -27
  ECLIPSE::SIGN: 1.

GCL

4.18695205E7 - long-float
 exponent:  -27
 mantissa:  5619631913959424

LispWorks

4.18695205D7 is a DOUBLE-FLOAT

MCL

Double float:    4.18695205D+7
Scientific:      4.19D+7
Log base 2:      25.319397060287525D0
Ratio equiv:     NIL
Nearest integer: NIL

NIL

※ソースコードから復元した予想結果

4.18695205D7 is a double float.
  Sign bit: 1, excess-128 exponent: #x65, fraction bits: #x13F70684000000.

SBCL

4.18695205d7
  [double-float]

Symbolics CL

4.18695205d7 is a double-precision floating-point number.
  Sign 0, exponent 2030, 52-bit fraction 037560320400000000  (not including hidden bit)
  Its exact decimal value is 41869520.5d0

VAX LISP

It is the double-float 4.18695205d7
Sign:        +
Exponent:    26 (radix 2)
Significand: 0.6239044740796089

Xerox CL

a single-float, 
   sign: cl::positive
   radix: 2
   digits: 24
   significand: 0.62390447
   exponent: 26

(describe 41869520.5d0)と入力しているのだけれど……

まとめ

やはりLucid CLの結果が充実している様子。
Spice Lisp系(CMUCL、SBCL、LispWorks)は素気ない表示ですが、古くからある処理系の、MCL系(MCL、Clozure CL)、Symbolics CLあたりは色々な情報を教えてくれるようです。

ちなみに、この記事はこちらの浮動小数点数の誤差の記事(Abstract Heresies: A Floating-point Problem)で、41869520.5d0を有理数の記述するのに、(+ 41869520 1/2)という表現をつかっているのを目にして、そういえば、describerationalizeの結果を教えてくれる処理系があったような……と調べてみたのが切っ掛けでした。
この場合は、(= 41869520.5d0 (rationalize 41869520.5d0)) → Tであることを確認し、(rationalize 41869520.5d0)と記述すれば良さそうです。


HTML generated by 3bmd in LispWorks 7.0.0

comments powered by Disqus