// 返回x的平方根的倒数,很诡异的算法
float InvSqrt(float f32Num)
{
float f32Half = 0.5f * f32Num;
int i32Num = *(int*) &f32Num; // store floating-point bits in integer
i32Num = 0x5f3759d5 - (i32Num >> 1); // initial guess for Newton's method
f32Num = *(float*) &i32Num; // convert new bits into float
f32Num = f32Num * (1.5f - f32Half * f32Num * f32Num); // One round of Newton's method
return f32Num;
}
struct Point
{
int i32PixelX;
int i32PixelY;
Point(int i32PixelX, int i32PixelY)
{
this->i32PixelX = i32PixelX;
this->i32PixelY = i32PixelY;
}
};
// 求两点间的距离
float Distance(Point* pstPoint1, Point* pstPoint2)
{
int i32XDist = pstPoint1->i32PixelX - pstPoint2->i32PixelX;
int i32YDist = pstPoint1->i32PixelY - pstPoint2->i32PixelY;
float f32Num = (float) (i32XDist * i32XDist + i32YDist * i32YDist);
return InvSqrt(f32Num) * f32Num;
}
// 浮点数四舍五入,默认保留3位小数
float FloatRound(float f32Num, int i32Precision/* = 3*/)
{
int i32Multiple = 1;
for (int i = 0; i < i32Precision; i++)
{
i32Multiple *= 10;
}
if (f32Num > 0)
{
return (int)((f32Num * i32Multiple) + 0.5) / (float)i32Multiple;
}
else
{
f32Num = -f32Num;
return -((int)((f32Num * i32Multiple) + 0.5) / (float)i32Multiple);
}
}
int main(int argc, char* argv[])
{
float f32Value = 4;
float f32InvSqrt = InvSqrt(f32Value);
float f32Sqrt = f32InvSqrt * f32Value;
Point stPoint1(3, 0);
Point stPoint2(0, 4);
float f32Dist = Distance(&stPoint1, &stPoint2);
printf("%f, %f, %f\n", f32InvSqrt, f32Sqrt, f32Dist);
float f1 = FloatRound((float)0.2544, 3);
float f2 = FloatRound(0.2545, 3);
if (f1 < f2)
{
printf("ok\n");
}
return 0;
}
float InvSqrt(float f32Num)
{
float f32Half = 0.5f * f32Num;
int i32Num = *(int*) &f32Num; // store floating-point bits in integer
i32Num = 0x5f3759d5 - (i32Num >> 1); // initial guess for Newton's method
f32Num = *(float*) &i32Num; // convert new bits into float
f32Num = f32Num * (1.5f - f32Half * f32Num * f32Num); // One round of Newton's method
return f32Num;
}
struct Point
{
int i32PixelX;
int i32PixelY;
Point(int i32PixelX, int i32PixelY)
{
this->i32PixelX = i32PixelX;
this->i32PixelY = i32PixelY;
}
};
// 求两点间的距离
float Distance(Point* pstPoint1, Point* pstPoint2)
{
int i32XDist = pstPoint1->i32PixelX - pstPoint2->i32PixelX;
int i32YDist = pstPoint1->i32PixelY - pstPoint2->i32PixelY;
float f32Num = (float) (i32XDist * i32XDist + i32YDist * i32YDist);
return InvSqrt(f32Num) * f32Num;
}
// 浮点数四舍五入,默认保留3位小数
float FloatRound(float f32Num, int i32Precision/* = 3*/)
{
int i32Multiple = 1;
for (int i = 0; i < i32Precision; i++)
{
i32Multiple *= 10;
}
if (f32Num > 0)
{
return (int)((f32Num * i32Multiple) + 0.5) / (float)i32Multiple;
}
else
{
f32Num = -f32Num;
return -((int)((f32Num * i32Multiple) + 0.5) / (float)i32Multiple);
}
}
int main(int argc, char* argv[])
{
float f32Value = 4;
float f32InvSqrt = InvSqrt(f32Value);
float f32Sqrt = f32InvSqrt * f32Value;
Point stPoint1(3, 0);
Point stPoint2(0, 4);
float f32Dist = Distance(&stPoint1, &stPoint2);
printf("%f, %f, %f\n", f32InvSqrt, f32Sqrt, f32Dist);
float f1 = FloatRound((float)0.2544, 3);
float f2 = FloatRound(0.2545, 3);
if (f1 < f2)
{
printf("ok\n");
}
return 0;
}