0

Currently I'm working with Clojure-on-top-of-the-JVM.

JVMの浮動小数点機能を公開するJava 言語では、(正確に) IEEE-754 32 ビット単精度(Java "float") および64 ビット倍精度(Java "double") 表現とJVM は、計算中に「拡張精度」実装 (「拡張倍精度」の場合は 80 ビット、一部のプログラミング言語では「長倍精度」とも呼ばれます) を使用する可能性があります。今のところ、半精度または 4 倍精度についての言葉はありません。

Clojure-on-top-of-ECMAScript (つまり、ClojureScript) の場合、単一の基礎となるnumber typeがあり、たまたま IEEE-754 64 ビット倍精度浮動小数点です。

Clojure-on-the-JVM の場合、浮動小数点が予想されるすべての場合で「double」の使用が推奨されるようです。与えられたものが単精度浮動小数点であるかどうかをテストする方法さえありません。float?(おそらく驚くべきことに)そのものが何らかの種類の浮動小数点値であるかどうかをテストするためです。不自然なことに、「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