了解函数中的数字数据类型

潜伏者

这是我先前发布的关于双浮点数问题的跟进对于可能的基本Lisp概念,我深表歉意,但我还没有掌握。

对于此问题,我正在使用GNU CLISP 2.49 (2010-07-07)

假设我具有以下函数,该函数仅通过牛顿方法确定平方根:

(defun sr (n eps)
  (when (>= n 0)
    (do ((x (/ n 2.0) (/ (+ x (/ n x)) 2.0)))
      ((< (abs (- (* x x) n)) eps)
       x))))

我可以这样称呼它:

> (sr 2 0.00001)
1.4142157

它为我提供了单精度浮点数(默认值)。说得通。由于缺乏精确度,如果我做的eps太小,它将无法正常工作并进入无限循环:

> (sr 2 0.00000001)
[just sits there...]

如果我用双精度值来调用它,我仍然会得到单精度结果:

> (sr 2.0d0 0.00001d0)
1.4142157
> (sr 2.0d0 0.00000001d0)
[just sits there...]

但是,如果我重新定义我的功能,如下所示:

(defun sr (n eps)
  (when (>= n 0)
    (do ((x (/ n 2.0d0) (/ (+ x (/ n x)) 2.0d0)))
      ((< (abs (- (* x x) n)) eps)
       x))))

然后,无论如何进给,我都将获得双精度:

> (sr 2 0.00001)
1.4142156862745097d0

现在eps由于精度提高而给它送去了更小的工作:

> (sr 2 0.00000001)
1.4142135623746899d0

所以我的问题是:函数所应用的精度是否完全由我在它所包含的算术表达式中使用的常量中指定的精度所驱动?如果是这样,如果函数中的任何地方都没有常量该怎么办?那么,什么决定了计算的精度和结果呢?


附录

SBCL 1.0.57-1.fc17根据@JoshuaTaylor在评论中引用的文档,我刚刚对此进行了重新测试,并且得到了更多预期的结果。

雷纳·约瑟夫(Rainer Joswig)

在我看来,这是CLISP与ANSI CL标准的不兼容。

ANSI CL标准要求结果必须是所有参数中最大的类型:

CL-USER 20 > (/ 2.0d0 2.0)
1.0D0

CLISP提供:

[4]> (/ 2.0d0 2.0)
1.0

这应该是双浮点数。

您可以在CLISP中将其更改为标准ANSI CL行为

[9]> CUSTOM:*FLOATING-POINT-CONTAGION-ANSI*
NIL
[10]> (setf CUSTOM:*FLOATING-POINT-CONTAGION-ANSI* t)
T
[11]> (sr 2.0d0 0.00001d0)
1.4142156862745097d0

现在,它会返回所需的结果。

请参阅CLISP手册:12.2.4.1。浮点精确传染规则

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

了解函数中的数字数据类型

来自分类Dev

oracle 中的 LISTAGG 处理数字数据类型

来自分类Dev

SqlDataReader用于数字数据类型

来自分类Dev

将数字字符串转换为R中的数字数据类型

来自分类Dev

为什么要为.NET数字数据类型使用构造函数?

来自分类Dev

将字符串转换为数字数据类型并舍入浮点值的函数

来自分类Dev

Postgres中数字数据类型的精度和小数位数是多少?

来自分类Dev

如何在JavaScript中验证数字数据类型的长度?

来自分类Dev

如何使用xpath在xml中定位数字数据类型信息

来自分类Dev

如何将“序列值”插入到数字数据类型中?- SQL

来自分类Dev

熊猫检测非数字数据类型

来自分类Dev

rest - java 16 位数字数据类型

来自分类Dev

哪种数字数据类型的精度最高?

来自分类Dev

elasticsearch - 可以在相同索引相同类型中混合数字和数字数组数据类型吗?

来自分类Dev

outsideHeight()方法返回字符串数据类型而不是数字数据类型

来自分类Dev

了解 Gamesparks 中的数据类型

来自分类Dev

更新/修复列数据类型并记录字符串,以便在mysql innoDB数据库中按数字数据类型排序

来自分类Dev

为什么在sapply中包装as.Date()返回数字数据类型,而lapply返回日期数据类型呢?

来自分类Dev

如何对数字和非数字数据类型进行分组汇总

来自分类Dev

BigQuery:数字数据类型:不能存储超过 19 位数字

来自分类Dev

了解Java数据类型

来自分类Dev

R数据框:将2的列表转换为简单数字数据类型

来自分类Dev

了解JavaScript中的原始数据类型

来自分类Dev

如何将文本值转换为Access数字数据类型

来自分类Dev

rethinkdb协议:为什么将数字数据类型定义为Double

来自分类Dev

为什么没有0-4,294,967,294的数字数据类型

来自分类Dev

如何在嵌入符号的情况下解码数字数据类型?

来自分类Dev

Oracle 在具有数字数据类型的列中保存小数

来自分类Dev

如何使用 SQL SELECT 将数字数据类型分配给新列

Related 相关文章

  1. 1

    了解函数中的数字数据类型

  2. 2

    oracle 中的 LISTAGG 处理数字数据类型

  3. 3

    SqlDataReader用于数字数据类型

  4. 4

    将数字字符串转换为R中的数字数据类型

  5. 5

    为什么要为.NET数字数据类型使用构造函数?

  6. 6

    将字符串转换为数字数据类型并舍入浮点值的函数

  7. 7

    Postgres中数字数据类型的精度和小数位数是多少?

  8. 8

    如何在JavaScript中验证数字数据类型的长度?

  9. 9

    如何使用xpath在xml中定位数字数据类型信息

  10. 10

    如何将“序列值”插入到数字数据类型中?- SQL

  11. 11

    熊猫检测非数字数据类型

  12. 12

    rest - java 16 位数字数据类型

  13. 13

    哪种数字数据类型的精度最高?

  14. 14

    elasticsearch - 可以在相同索引相同类型中混合数字和数字数组数据类型吗?

  15. 15

    outsideHeight()方法返回字符串数据类型而不是数字数据类型

  16. 16

    了解 Gamesparks 中的数据类型

  17. 17

    更新/修复列数据类型并记录字符串,以便在mysql innoDB数据库中按数字数据类型排序

  18. 18

    为什么在sapply中包装as.Date()返回数字数据类型,而lapply返回日期数据类型呢?

  19. 19

    如何对数字和非数字数据类型进行分组汇总

  20. 20

    BigQuery:数字数据类型:不能存储超过 19 位数字

  21. 21

    了解Java数据类型

  22. 22

    R数据框:将2的列表转换为简单数字数据类型

  23. 23

    了解JavaScript中的原始数据类型

  24. 24

    如何将文本值转换为Access数字数据类型

  25. 25

    rethinkdb协议:为什么将数字数据类型定义为Double

  26. 26

    为什么没有0-4,294,967,294的数字数据类型

  27. 27

    如何在嵌入符号的情况下解码数字数据类型?

  28. 28

    Oracle 在具有数字数据类型的列中保存小数

  29. 29

    如何使用 SQL SELECT 将数字数据类型分配给新列

热门标签

归档