准确的 sqrt(1 + (x/2)^2) + x/2

bec*_*cko 1 language-agnostic floating-point numeric numerical-computing

我需要sqrt(1 + (x/2)^2) + x/2数值计算,对于 positive x。对于非常大的 值,使用此表达式直接失败x。我怎样才能重写它以获得更准确的评估?

cht*_*htz 5

对于非常大的,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)