我实现的Gamma函数Lanczos近似结果不准确是什么原因?
导致输出结果偏差的核心原因是代码存在两处实现逻辑错误,和AppleScript的数值精度无关:
错误点说明
- 指数运算优先级错误:返回值中你写的
t ^ x + 0.5会被AppleScript优先计算t ^ x再加0.5,完全不符合Lanczos近似要求的t的(x+0.5)次方的运算逻辑,这是结果偏差的最主要原因。 - 循环项偏移错误:你遍历p数组时i从2开始,对应求和项的索引偏移了1,原逻辑要求的分母是
x + 循环次数,你的代码写的x + i多了1的偏移,导致求和部分的计算完全错误。
修正后的完整代码
on gamma(x) set p to {1.0, 676.520368121885, -1259.139216722403, 771.323428777653, -176.615029162141, 12.507343278687, -0.138571095266, 9.98436957801957E-6, 1.50563273514931E-7} set E to 2.718281828459045 set pi to 3.141592653589793 -- 显式定义高精度pi,避免内置常量精度误差 set g to 7 if x < 0.5 then return pi / (sin(pi * x) * (gamma(1 - x))) end if set x to x - 1 set a to item 1 of p set t to x + g + 0.5 repeat with i from 2 to count of p set a to a + ((item i of p) / (x + i - 1)) -- 修正分母偏移 end repeat return ((2 * pi) ^ 0.5) * (t ^ (x + 0.5)) * (E ^ (-t)) * a -- 修正指数运算优先级 end gamma on sin(x) return (do shell script "python3 -c 'import math; print(math.sin(" & x & "))'") as number end sin
修正上述两处错误后,输出结果就和标准gamma函数值一致,AppleScript本身支持双精度浮点数运算,精度足够支撑Lanczos近似的计算需求。
内容的提问来源于stack exchange,提问作者gurkensaas
相关产品推荐
相关产品推荐

