題目要求:讀入 n 個浮點數,分別計算 InvSqrt(f)(Quake III 經典快速逆平方根)與標準庫 sqrt(f) 的絕對差值並輸出。
int n; scanf("%d", &n);
for (int i = 0; i < n; i++) {
float f; scanf("%f", &f);
float f1 = InvSqrt(f); // 0x5f3759df 魔數法
float f2 = sqrtf(f); // 標準庫
printf("%f\n", fabs(f1 - f2));
}
float InvSqrt(float x) {
float xhalf = 0.5f * x;
int i = *(int*)&x; // 浮點位模轉整數
i = 0x5f3759df - (i >> 1); // 牛頓法初值
x = *(float*)&i;
x = x * (1.5f - xhalf * x * x); // 一次牛頓迭代
return x;
}
-O3 下 1/sqrtf 已自動向量化,性能優於手寫