You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

Common Lisp及Antik包中如何保留精度减少双精度浮点数输出位数?

Answers to Your Common Lisp Float Formatting Questions

Hey there! Let's break down your two questions about controlling float output in Common Lisp—first the general case, then the Antik + SLY specific scenario.

1. General Common Lisp: Reducing Displayed Digits for Double-Floats

The go-to tool for formatting float output in Common Lisp is the format function. It lets you control exactly how many decimal places are shown, without altering the underlying double-precision value itself.

  • To print directly to the console (or REPL), use:

    (format t "~,4F" (exp 1d0)) ; Outputs 2.7183
    

    Here's what the format specifier means:

    • ~ starts a format directive
    • ,4 specifies we want 4 decimal places
    • F denotes fixed-point floating-point formatting
  • If you need the formatted result as a string (instead of printing it), replace t with nil:

    (format nil "~,4F" (exp 1d0)) ; Returns the string "2.7183"
    

This approach keeps the original double-float value intact—you're only changing how it's displayed.

2. Antik + Emacs/SLY: Reducing Output While Preserving Calculation Precision

Since you've already set *read-default-float-format* to 'double-float (which ensures inputs are parsed as double-precision), here are two reliable ways to shorten output without losing calculation accuracy:

Option 1: Use format with Antik results

Just like the general case, wrap Antik function calls in format to control display:

;; Example with an Antik function that returns a double-float
(format t "~,4F" (antik:some-antik-function)) ; Shows 4 decimal places

Option 2: Adjust global REPL output settings

If you want all float outputs in your SLY REPL to show fewer digits by default, set the *print-float-digits* variable. This affects how the REPL displays all floats, while calculations still use full double-precision:

(setf *print-float-digits* 4)

Now when you evaluate (exp 1d0) in the SLY REPL, it will output 2.7183 instead of the full precision string. Note this is a global setting—all subsequent float outputs in the REPL will follow this until you change it back.

A quick reminder: *read-default-float-format* only affects how the Lisp reader interprets input floats (making sure plain 1.0 is read as a double-float instead of single-float). It doesn't control output—format or *print-float-digits* handle that part.

内容的提问来源于stack exchange,提问作者dchagas

火山引擎 最新活动