0

目前我正在使用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。这是事情的要旨吗?

4

1 回答 1

3

我想说 Clojure/Java 使得只使用 64 位 Java 类型 double 变得简单,原因如下:

  1. double 是您编写浮点文字数时获得的默认类型,例如 1.0
  2. double 是执行返回浮点类型的算术时返回的默认类型
  3. 对于要使用 Java 原始值的循环构造和函数参数和返回值,Clojure 支持 double 但不支持 float。

可以使用 float 数组和单独的装箱 Float 值,但您必须多做一些工作。

于 2019-09-09T19:52:02.530 回答