bec*_*cko 1 language-agnostic floating-point numeric numerical-computing
我需要sqrt(1 + (x/2)^2) + x/2数值计算,对于 positive x。对于非常大的 值,使用此表达式直接失败x。我怎样才能重写它以获得更准确的评估?
对于非常大的,x您可以分解出一个x/2:
sqrt(1 + (x/2)^2) + x/2
= (x/2) * sqrt( 1/(x/2)^2 + (x/2)^2/(x/2)^2) + x/2
= (x/2) * sqrt( (2/x)^2 + 1 ) + x/2
Run Code Online (Sandbox Code Playgroud)
因为x > 2/sqrt(eps)平方根实际上将计算为 1,并且您的整个表达式将简化为x。假设你需要覆盖整个 range [0, infinity],我建议在那个时候分支并x在这种情况下返回你的原始公式,否则:
if x > 2/sqrt(eps) // eps is the machine epsilon of your float type
return x
else
return sqrt(1 + (x/2)^2) + x/2
Run Code Online (Sandbox Code Playgroud)