所以我写了两个函数来计算变量x的自然对数,将增量和的上界增加到33000后,在ghci中测试的函数仍然返回不精确的结果,与从Prelude导入的默认log函数相比,这里是代码定义:
lnOfx :: Float -> Float
lnOfx x = netSum f 1 33000
where f i = 2*(1/oddTerm)*((x-1)/(x+1))**oddTerm
where oddTerm = 2*i-1
netSum f minB maxB = sum [f i | i <- [minB .. maxB]]
lnOfx2 :: Float -> Float
lnOfx2 x = netSum f 1 33000
where f i = (1/i)*((x-1)/x)**i
netSum f minB maxB = sum [f i | i <- [minB .. maxB]]
以及测试结果:
log 3
1.0986122886681098
lnOfx 3
1.0986125
lnOfx2 3
1.0986122
log 2
0.6931471805599453
lnOfx 2
0.6931472
lnOfx2 2
0.6931473
那么为什么结果会有所不同,正确计算自然对数的正确方法是什么(如 Prelude 中的 log 函数)?