Floating point 方案中的浮点精度与舍入误差消除

Floating point 方案中的浮点精度与舍入误差消除,floating-point,lisp,scheme,rounding,precision,Floating Point,Lisp,Scheme,Rounding,Precision,我有一个程序,它将浮点值返回到小数点后三位 >(gpa ’(A A+ B+ B)) 3.665 有没有办法在方案中把这一数字提高到3.67 我使用的是5e7版本和SLIB3B3、附加的(simply.scm、functions.scm、ttt.scm、match.scm、database.scm)以及我使用的答案库 顺便说一句,今天早上我把它输入了我的电脑 > (* 1 (- 0.5 0.4 0.1)) -27.755575615628913e-18 不,不,不 你如何处理这种不

我有一个程序,它将浮点值返回到小数点后三位

>(gpa ’(A A+ B+ B))
3.665
有没有办法在方案中把这一数字提高到3.67

我使用的是5e7版本和SLIB3B3、附加的(simply.scm、functions.scm、ttt.scm、match.scm、database.scm)以及我使用的答案库

顺便说一句,今天早上我把它输入了我的电脑

> (* 1 (- 0.5 0.4 0.1))
-27.755575615628913e-18
不,不,不

你如何处理这种不准确的情况?

试试看

(define (round-off z n)
  (let ((power (expt 10 n)))
    (/ (round (* power z)) power)))

> (round-off 3.665 2)
3.66
> (round-off 3.6677 2)
3.67
注3.665轮至3.66轮,而非3.67轮。(平均数向下四舍五入;赔率向上四舍五入)

至于你的第二个问题。使用准确的数字:

> (* 1 (- #e0.5 #e0.4 #e0.1))
0

> #e0.5
1/2

@又好又干净(我的是乱七八糟的),我喜欢
(/(round(*100 z))100
摆脱了不精确性,是一个我可以重用的功能(用我选择的任何功能!)。将
round
更改为
celing
,因为它适合我的工作+1.Is
#e
SCM(R5RS)抛出了一个错误,坚持我使用
(*1(-(不精确->精确0.5)(不精确->精确0.4)(不精确->精确0.1))
。我从未使用过Racket。
#e
读卡器语法可能在R5RS.@+1之后,表示无球拍。我讨厌它的比特(完全免责声明,我是新的计划)。我使用R6RS Ikarus。盗窃罪(R5RS,R6RS,ERRR5RS)也很好。伊卡洛斯速度惊人。