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

C語言牛頓迭代法求平方根:完整程式碼、收斂條件與初值選擇指南

     編輯:C 語言問答

演算法原理

求 √a 等價解 f(x) = x² - a = 0。
牛頓迭代公式:x_{n+1} = x_n - f(x_n)/f'(x_n) = (x_n + a/x_n) / 2。

完整程式碼 (含輸入驗證、邊界處理)


#include 
#include 

double sqrt_newton(double a) {
    if (a < 0) return NAN;
    if (a == 0) return 0;
    double x = a;          // 初值:a 本身 (a>=1) 或 1 (a<1)
    if (x < 1) x = 1;
    double prev;
    do {
        prev = x;
        x = (x + a / x) * 0.5;
    } while (fabs(x - prev) > 1e-10); // 相對/絕對誤差雙重判斷更強健
    return x;
}

int main() {
    double a;
    printf("請輸入非負數: ");
    if (scanf("%lf", &a) != 1 || a < 0) {
        printf("輸入錯誤\n");
        return 1;
    }
    double result = sqrt_newton(a);
    printf("√%.10f = %.10f\n", a, result);
    printf("庫函數 sqrt = %.10f\n", sqrt(a));
    printf("誤差 = %.2e\n", fabs(result - sqrt(a)));
    return 0;
}

關鍵細節

對比:標準庫 sqrt vs 手寫

  • sqrt:硬體指令 (SSE sqrtpd) 或高度優化軟體實作,**生產碼必須用標準庫**。
  • 手寫牛頓法:教學、面試、無標準庫環境 (裸機/啟動載入器)、自訂精度/迭代觀察。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved
細節處理方式
初值選擇x = a (a≥1) 或 x = 1 (a<1),避免除零、加速收斂
終止條件fabs(x - prev) > EPS,EPS=1e-10 (double) 足夠
特殊值a=0 直接回 0;a<0 回 NAN 並設 errno=EDOM
除零保護迭代中 x 永不為 0 (單調遞減趨近 √a > 0)
效能二次收斂,雙精度通常 5~6 次迭代達機器精度