首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> 更多程式語言 >> 程式設計疑難解答

C 語言「外星常數」題目:快速逆平方根 InvSqrt 精度對比

     編輯:程式設計疑難解答

題目要求:讀入 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));
}

InvSqrt 經典實現

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;
}

教學意義

  • 位級操作、IEEE 754 表示、牛頓迭代綜合應用
  • 現代編譯器 -O3 下 1/sqrtf 已自動向量化,性能優於手寫
  • 適合圖形學、物理引擎等容忍微小誤差的高性能場景
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved