1

任意の数値は、小数点以下の桁数を使用して float に簡単に変換できます。たとえば、を使用すると、(format nil "~,2f" 6)が得られ"6.00"ます。しかし、類似の浮動小数点型仕様を使用して任意の数値を直接強制する方法はありますか? つまり、文字列ではなく数値を出力しますか? または、試してみまし(read-from-string (format nil "~,2f" 6))たが、これではフォーマットが保持されません。

数値を (他の Lisp オブジェクトと共に) 含むネストされたツリーを小数点以下 2 桁の浮動小数点数として出力したいと考えています。たとえばX -> (A 3.00 (7.10 B) (C 8.12) 0.75)、X で表される特定の数値タイプに関係なく、出力は次のように見える場合があります。set-pprint-dispatch はこの種の出力に使用されますか、それともフォーマットで十分ですか?

4

2 に答える 2

2

この種の出力には set-pprint-dispatch が使用されていますか、それともフォーマットで十分ですか?

試してみましょうSET-PPRINT-DISPATCH

CL-USER> (let ((*print-pprint-dispatch* (copy-pprint-dispatch)))
           (set-pprint-dispatch 'float (lambda (s f) (format s "~,2f" f)))
           (write '(A 3.00 (7.10 B) (C 8.12) 0.75) :pretty t))

(A 3.00 (7.10 B) (C 8.12) 0.75)  ;; standard output
(A 3.0 (7.1 B) (C 8.12) 0.75)    ;; result printed by the REPL

pretty-print ディスパッチ テーブルは変更前にコピーされるため、float に関連付けられた関数は let バインディング内からのみ呼び出されます。の戻り値がWRITEREPL に出力されると、デフォルトのディスパッチ テーブルが使用されます。グローバル変数を定義して、変更されたテーブルが必要になるたびに再計算されないようにすることができます。

:prettyの値を指定しない場合、特殊*PRINT-PRETTY*変数は pretty-printer を使用するかどうかを定義することに注意してください。詳細については、「22.2.1.4 Pretty Print ディスパッチ テーブル」を参照してください。

数字を含むネストされたツリーを印刷したい

任意の数値を float として出力したい場合は、そのREAL型でディスパッチするだけです (虚数部がゼロでない複素数は思い通りに出力できないため、でディスパッチすることはお勧めしませんnumber)。必要な強制は暗黙的に行われます。

(let ((*print-pprint-dispatch* (copy-pprint-dispatch)))
  (set-pprint-dispatch 'real (lambda (s f) (format s "~,2f" f)))
  (write '(A 3 (7.1d0 B) (C 203/25) #C(3/4 0)) :pretty t))

... 書きます:

(A 3.00 (7.10 B) (C 8.12) 0.75)
于 2016-11-24T08:34:36.600 に答える
2

数値を強制的に浮動小数点数にするにはcoerce、 orを使用しfloatます。

CL-USER 121 > (float 2/3 1.0s0)
0.6666667

CL-USER 122 > (float 2/3 1.0d0)
0.6666666666666666D0

CL-USER 123 > (coerce 2/3 'double-float)
0.6666666666666666D0

いつものように、float には精度が制限されていることに注意してください。

于 2016-11-23T19:58:32.097 に答える