【发布时间】:2015-04-13 20:25:54
【问题描述】:
作为溢出浮点的一种简单方法(我在我的代码中使用双浮点数,所以我也会在这里这样做):
(setq *read-default-float-format* 'double-float)
(defun example-float-overflow (x)
(example-float-overflow (* x x)))
(example-float-overflow 4.4)
很快,x 变得越来越大。很快它就会达到 5.295234290518905e164 并溢出。哪个,这甚至是双浮点数了吗?
无论如何,在溢出之前识别点的最佳方法是什么?现在我正在做类似的事情:
(defun example-float-overflow-no-error (x)
(if (> (* x x) 1.0e20)
x
(example-float-overflow-no-error (* x x))))
(example-float-overflow 4.4)
=> 1.973525870240772e10
注意:我实际上对结果并不感兴趣,但我的其余代码依赖于它在溢出之前尽可能多地运行。
【问题讨论】:
-
可以测试
x是否大于(sqrt most-positive-double-float)。 -
为什么不在溢出发生时使用条件处理程序来检测?
-
处理
FLOATING-POINT-OVERFLOW条件。 -
当错误发生时,您可能使用
HANDLER-CASE来返回NIL。 -
限制取决于实现。这就是为什么您需要使用
MOST-POSITIVE-DOUBLE-FLOAT来确定它的原因。
标签: common-lisp