目前我正在使用Clojure-on-top-of-the-JVM。
Java 语言公开了 JVM的浮点功能,它说我们得到(确切地说)IEEE-754 32 位单精度(Java “float”)和64 位双精度(Java “double”)表示和JVM 可能在计算期间使用“扩展精度”实现(“扩展双精度”为 80 位,在某些编程语言中也称为“长双精度”)。目前还没有关于半精度或四倍精度的消息。
对于Clojure-on-top-of-ECMAScript(即 ClojureScript),有一个底层数字类型,恰好是 IEEE-754 64 位双精度浮点数。
似乎在 Clojure-on-the-JVM 的情况下,在所有需要浮点的情况下都鼓励使用“double”。甚至没有办法测试给定的事物是否是单精度浮点,因为float?
(也许令人惊讶)测试该事物是否是任何类型的浮点值。不一致的是,有一个“转换为浮动”的函数,称为float
.
(defn whatf [x] [(double? x) (float? x) (type x)])
; a literal containing a decimal point is mapped to a
; "Java double" (boxed)
(whatf 0.1)
;=> [true true java.lang.Double]
; an integer is a "Java long" (boxed), as expected:
(whatf 1)
;=> [false false java.lang.Long]
; you can cast to "float", which corresponds to "Java float".
; and "double?" returns false for that:
(whatf (float 1))
;=> [false true java.lang.Float]
; you can cast to "double":
(whatf (double 1))
;=> [true true java.lang.Double]
; operations on "double" yield "double" as expected:
(whatf (*(double 1) (double 1)))
;=> [true true java.lang.Double]
; operations on "float" force to "double" immediately:
(whatf (*(float 1) (float 1)))
;=> [true true java.lang.Double]
; of course one can always cast, but what's the use of that:
(whatf (float (*(float 1) (float 1))))
[false true java.lang.Float]
因此,鼓励程序员不要考虑精度,让 Clojure 为他/她选择——而 Clojure 始终选择 IEEE binary64。这是事情的要旨吗?