3.2 浮点型基础

浮点数对于表示非整数的数字很有用。浮点数的范围与您使用的机器上的C double数据类型的范围相同。在 所有支持 Emacs 的计算机上,这是 IEEE binary64 浮点格式,由IEEE Std 754-2019标准化, 并在 David Goldberg 的论文“ What Every Computer Scientist Should Know About Floating-Point Arithmetic ”中进一步讨论。在现代平台上,浮点运算严格遵循 IEEE-754 标准;然而,在一些过时的平台上,特别是 32 位 x86,结果并不总是正确四舍五入。

浮点数的读取语法需要小数点、指数或两者。 在数字及其指数之前可加 可选符号 ('+' 或者 '-')。例如, '1500.0’, ‘+15e2’, ‘15.0e + 2’, ‘+1500000e-3', 和 '.15e4' 是值为 1500 的浮点数的五种表示方式。它们都是等价的。与 Common Lisp 一样,Emacs Lisp 要求浮点数中的任何小数点后至少有一位:'1500.' 是整数,而不是浮点数。

Emacs Lisp 将 -0.0 和 普通的 0 视为等价,这种等价是基于 = 比较。这个规定符合 IEEE 浮点数标准,这个标准指明 -0.0 和 0.0 在数值层面是相等的,即便有些操作符可能会区别它们。

IEEE浮点标准支持正无穷大与负无穷大浮点值。它还提供了一类称为 NaN 或“非数字”的值;在没有正确答案的情况下,数值函数会返回此类值。例如,(/ 0.0 0.0)返回 NaN。NaN 在数值上永远不等于任何值,甚至不等于它本身。NaN 带有一个符号和一个有效数,当它们的符号和有效数一致时,非数值函数将两个 NaN 视为相等。NaN 的有效数依赖于机器。

当NaN和符号的零参与,非数字功能,如 eql,equal,sxhash-eql,sxhash-equal并 gethash确定值是否是无法区分的,他们不是是否数值上相等。例如,当x和 y是相同的 NaN 时,(equal x y)返回t而 (= x y)使用数值比较并返回nil;相反,(equal 0.0 -0.0)返回nil而 (= 0.0 -0.0)返回t。

以下是这些特殊浮点值的读取语法:

无限大 ‘1.0e+INF' 和 '-1.0e+INF’

非数字 ‘0.0e + NaN' 和 '-0.0e + NaN’

以下函数用于专门处理浮点数:

Function:isnan x 如果其浮点参数为 NaN,则此谓词返回 t, 否则返回 nil。

Function:frexp x 此函数返回一个 cons cell (s . e),其中s和e分别是浮点数x的有效数和指数。

如果 x 是有限的,则 s 是介于 0.5(含)到 1.0(不含)之间的浮点数,e 是整数,并且 x = s * 2 ** e。如果 x 为零或无穷大,则 s 与 x 相同。如果 x 是 NaN,则 s 也是 NaN。如果 x 为零,则 e 为 0。

Function:ldexp s e 给定数字有效数 s 和整数指数 e ,此函数返回浮点数 s * 2 ** e。

Function:copysign x1 x2 此函数将 x2 的符号复制到 x1 的值,并返回结果。 x1 和 x2 必须是浮点数。

Function:logb x 此函数返回 x 的二进制指数。更准确地说,如果 x 是有限且非零的,则该值是 |x| 的以 2 为底的对数 , 并向下舍入为整数。如果 x 为零或无穷大,则值为无穷大;如果 x 是 NaN,则该值是 NaN。

(logb 10) ⇒ 3 (logb 10.0e20) ⇒ 69 (logb 0) ⇒ -1.0e+INF

最后更新于