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

C++ 快速逆平方根演算法:為什麼程式沒有任何輸出?

     編輯:程式設計疑難解答

現象:輸入數值後程式直接結束,無輸出

初學者實作經典的 InvSqrt(Quake III 快速逆平方根)並嘗試計時比較,卻發現 count_1() 和 count_2() 完全不執行。

根本原因:函數宣告 ≠ 函數呼叫

void main() {
    printf("請輸入一個值");
    scanf_s("%f", &x);
    float count_1();  // ❌ 這是「宣告」一個回傳 float 的函數原型
    float count_2();  // ❌ 同理
    system("pause");
}

C/C++ 允許在區塊內宣告函數原型,編譯器不報錯,但這兩行只是告訴編譯器「有這兩個函數」,並不會執行它們。

修正:移除回傳型別,直接呼叫

void main() {
    printf("請輸入一個值");
    scanf_s("%f", &x);
    count_1();  // ✅ 真正呼叫
    count_2();  // ✅ 真正呼叫
    system("pause");
}

補充:代碼中的其他隱患

  • InvSqrt 使用了型別雙關((int*)&x),屬於未定義行為(UB),現代編譯器優化下可能失效。建議改用 std::bit_cast (C++20) 或 memcpy。
  • clock() 精度極低,微秒級計時請用 std::chrono::high_resolution_clock。
  • void main() 非標準,應為 int main()。

正確計時範例

#include <chrono>
#include <cmath>
#include <cstdio>

float InvSqrt(float x) {
    float xhalf = 0.5f * x;
    int i = std::bit_cast<int>(x); // C++20
    i = 0x5f3759df - (i >> 1);
    x = std::bit_cast<float>(i);
    x = x * (1.5f - xhalf * x * x);
    return x;
}

int main() {
    float x;
    printf("請輸入一個值: ");
    scanf("%f", &x);

    auto t1 = std::chrono::high_resolution_clock::now();
    float r1 = 1.0f / std::sqrt(x);
    auto t2 = std::chrono::high_resolution_clock::now();
    printf("std::sqrt 耗時: %.3f μs\n",
           std::chrono::duration<double, std::micro>(t2 - t1).count());

    auto t3 = std::chrono::high_resolution_clock::now();
    float r2 = InvSqrt(x);
    auto t4 = std::chrono::high_resolution_clock::now();
    printf("InvSqrt  耗時: %.3f μs\n",
           std::chrono::duration<double, std::micro>(t4 - t3).count());

    printf("結果對比: %.6f vs %.6f\n", r1, r2);
    return 0;
}

記住:宣告不是呼叫,這是新手最容易踩的坑之一。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved