提问人:N.Li 提问时间:8/16/2023 最后编辑:N.Li 更新时间:8/20/2023 访问量:80
如何在 Scheme 中实现极高的浮点精度?
How to implement extremely high floating point precision in Scheme?
答:
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
我添加了浮动转换,之后您将获得通常的十进制表示形式。:)
评论
/
*