Math 内置幅值函数与此代码之间的性能差异

Math 内置幅值函数与此代码之间的性能差异,math,directx,directx-10,Math,Directx,Directx 10,与下面的代码相比,使用DirectX矢量幅值数学函数是否有很大区别 float hyp = sqrt(pow(globalVector.x, 2) + pow(globalVector.y, 2)) 不足以让你关心 我建议您发布的功能有一些改进 无需调用幂函数x*x和y*y同样好而且便宜 我会通过缩放来防止舍入,如以下伪代码: if (abs(x) > abs(y)) { r = abs(y/x); hyp = x*sqrt(1 + r*r); } else { r

与下面的代码相比,使用DirectX矢量幅值数学函数是否有很大区别

float hyp = sqrt(pow(globalVector.x, 2) + pow(globalVector.y, 2))

不足以让你关心

我建议您发布的功能有一些改进

无需调用幂函数
x*x
y*y
同样好而且便宜

我会通过缩放来防止舍入,如以下伪代码:

if (abs(x) > abs(y)) {
   r = abs(y/x);
   hyp = x*sqrt(1 + r*r);
} else {
    r = abs(x/y);
    hyp = y*sqrt(1 + r*r);
}

你所说的“保护”是什么意思?你应该调查一下。如果x或y(或两者)中的任何一个非常大,则将较大的数字平方并将其与较小的数字相加可能会导致精度损失。一个双精度计数器只有大约18位精度。因此,如果你以这样一种方式来衡量问题,你永远不会平方一个非常大的数字。