Posted 2021-08-25 01:30:35 GMT
Twitterで(abs -0.0)
の値が話題になっていたので、Common Lispの処理系はどんな風になっているのか調べてみました。
-0.0
のサポートまず、Common Lispでは-0.0
をサポートしなくても良いようです。そもそもIEEE 754のサポートも必須ではなく、過去にはその辺りの選択は多分多様だったのでしょう。
IEEE 754をサポートしている場合には、*features*
に:ieee-floating-point
が入ることが推奨されています。
ちなみに実際に下記に出てくるVAX LISPなどはIEEE 754とは微妙に違う実装のようです。
VAX LISP[TM] V3.1
Digital Equipment Corporation. 1989, 1990.
All Rights Reserved.Lisp> *features*
(EDITOR UIS COMPILER DEBUGGER :VMS VMS :DEC DEC :COMMON COMMON :VAX VAX :VAXLISP)
処理系が-0.0
をサポートしているかどうかは、
(eql -0.0 0.0)
→ nil
かどうかで判定できると規格に書いてあります。
-0.0
をサポートしていない処理系では、-0.0
は、0.0
として読み込まれるため、
(list -0.0L0 (abs -0.0L0))
の結果を確認すれば、(abs -0.0L0)
の結果が正しいかを確認できそうです。
-0.0
をサポートしている処理系ということで、LispWorksとLucid CLだけ整合性がないという結果になりました。
以上の結果が、Common Lispの規格として不整合なのかどうかはいまいち分からないのですが、LispWorksでも#C(-0.0 0)
のabs
は0.0
だったりするようなので、float
処理の場合だけ妙なことになっているのではないかと推察します。
(eql (abs #C(-0.0 0)) (abs #C(0.0 0)))
→ T(eql (abs -0.0) (abs 0.0))
→ nil
LispWorksにバグ報告してみたいような気もしますが、果してバグと言って良いのだろうか……。
■
HTML generated by 3bmd in LispWorks 7.0.0