如何在 Scheme 中实现极高的浮点精度?

How to implement extremely high floating point precision in Scheme?

提问人:N.Li 提问时间:8/16/2023 最后编辑:N.Li 更新时间:8/20/2023 访问量:80

问:

众所周知,Scheme 可以产生非常大的整数,而无需任何进一步的努力。

但是,请问如何实现极高的浮点精度呢?谢谢。

(“极高”是指规定的精度,如 1000 或点后 10000 位)

方案 精度

评论

2赞 Shawn 8/17/2023
查看您使用的方案是否具有与 GMP 等的绑定,这些绑定可作为库使用。
0赞 N.Li 8/17/2023
我还是新手,还不知道如何导入库。我会检查一下。谢谢。
0赞 N.Li 8/17/2023
是的,你的解决方案有效,Wll。但是对于 /?
0赞 Will Ness 8/17/2023
内部用于舍入。我已经发布了一个答案,其中也谈到了等等。/*

答:

1赞 Will Ness 8/17/2023 #1

作为快速 n-dirty 解决方案,您可以使用整数的比率,并不时地将中期结果四舍五入到所需的精度,因此计算不会变得非常慢。

象征性

round_prec( Ratio(a,b), prec)  =  Ratio( round(a*10^prec / b), 10^prec)

其中是符号数据,例如标记列表。Ratio(a,b)(list 'RATIO numerator denominator)

在方案中,

(define (round-prec num denom prec)
   (list 'RATIO
         (round (/ (* num (expt 10 prec)) denom))
         (expt 10 prec)))

这之所以有效,是因为可以正确地处理整数,并且我们小心翼翼地先乘以除法,然后四舍五入。/10^prec

例如,用作

> (round-prec 10 3 1)
'(RATIO 33 10)
> (round-prec 10 3 10)
'(RATIO 33333333333 10000000000)

在将其转换为常规浮点后,可以很容易地打印出,例如(exact->inexact (/ num denom))

> (exact->inexact (/ 33333333333 10000000000))
3.3333333333

您可以轻松地定义通常的数值运算,例如

mult( Ratio(a,b), Ratio(c,d)) = Ratio( (a*c), (b*d) )

sum( Ratio(a,b), Ratio(c,d)) = Ratio( (a*d + c*b), (b*d) )

等。其他函数可以使用它们的泰勒级数展开来计算。

然而,随着越来越多的舍入被执行,出现了一个关于数值精度的潜在损失的问题。因此,您很可能需要处理比所需的最终精度更多的数字。要找出给定代码真正需要多少个代码,这是一门独立的科学。因此,我认为有些库会同时生成数字及其错误间隔。

评论

0赞 N.Li 8/17/2023
谢谢,威尔。但是对于三角函数、对数等呢?
0赞 Will Ness 8/17/2023
也许是泰勒级数?当然还有外部库......
0赞 N.Li 8/17/2023
顺便说一句,您的代码还需要一个步骤:以十进制格式输出。
0赞 Will Ness 8/20/2023
我添加了浮动转换,之后您将获得通常的十进制表示形式。:)