如何在float64环境下精准计算中等负x值对应的f(x)函数?
用float64精准计算中等负x值下的f(x)
当x为中等负数(-1e6至-1e2)时,原函数的计算误差来自大数值抵消:原表达式中0.5 + arctan(x/√3)/π部分会趋近于0,但arctan(x/√3)的浮点近似误差会在抵消后被放大,最终导致结果偏离真实值。
解决方案:数学等价变形
通过三角恒等式改写原函数,避免大数值抵消。令t = -x(此时t > 0),利用arctan(z) = π/2 - arctan(1/z)(z > 0),将原函数推导为:
$$
f(x) = \frac{\arctan\left(\frac{\sqrt{3}}{t}\right)}{\pi} - \frac{\sqrt{3} \cdot t}{\pi \cdot (t^2 + 3)}
$$
这个形式中,所有项都是小正数的运算,不存在大数值抵消,能最大化float64的计算精度。
实现代码
import math def g(x): if x < 0: t = -x sqrt3 = math.sqrt(3) at_term = math.atan(sqrt3 / t) / math.pi frac_term = sqrt3 * t / (math.pi * (t*t + 3)) return at_term - frac_term # 非负x直接使用原表达式 sqrt3 = math.sqrt(3) return 0.5 + math.atan(x / sqrt3)/math.pi + sqrt3 * x/(math.pi*(x*x +3))
验证结果
对于x=-10_000,新函数的计算结果为1.1026577511479050e-12,与期望的真实值完全一致,而原函数结果存在明显误差。
内容的提问来源于stack exchange,提问作者hbwales
相关产品推荐
相关产品推荐

