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

C語言浮點數比較:判斷輸入值是否接近 3.14159(誤差 0.0001)

     編輯:C 語言問答

題目需求

已知標準值 answer = 3.14159。輸入數值,若與標準值差的絕對值 ≤ 0.0001,輸出 "Close enough",否則輸出 "Not close enough"。

核心邏輯:絕對值比較


#include 
#include   // fabs()

int main() {
    const double ANSWER = 3.14159;
    const double EPS = 0.0001;
    double input;

    printf("請輸入一個數值: ");
    if (scanf("%lf", &input) != 1) {
        printf("輸入無效\n");
        return 1;
    }

    double diff = fabs(input - ANSWER);  // 絕對差值
    if (diff <= EPS) {
        printf("Close enough\n");
    } else {
        printf("Not close enough (差值: %.6f)\n", diff);
    }

    return 0;
}

為什麼要用 fabs() 絕對值?

輸入值input - ANSWERfabs()判斷
3.14150-0.000090.00009≤ 0.0001 ✓
3.14168+0.000090.00009≤ 0.0001 ✓
3.14140-0.000190.00019> 0.0001 ✗
3.14178+0.000190.00019> 0.0001 ✗

不取絕對值會導致負差值永遠 ≤ 0.0001,邏輯錯誤。

浮點數比較最佳實務

1. 相對誤差 + 絕對誤差雙重檢查(通用健壯比較)


int float_equal(double a, double b, double eps) {
    double diff = fabs(a - b);
    if (diff <= eps) return 1;  // 絕對誤差足夠小
    double max_abs = fabs(a) > fabs(b) ? fabs(a) : fabs(b);
    return (diff / max_abs) <= eps;  // 相對誤差足夠小
}

2. ULP (Units in the Last Place) 比較(專業級)

比較兩浮點數在 IEEE 754 表示中的整數差距,需位元操作或 nextafter。

3. 避免直接 == 比較


// 錯誤示範
if (input == 3.14159)  // 極可能失敗,因 3.14159 無法精確用二進制表示

// 正確
if (fabs(input - 3.14159) < 1e-9)

常見陷阱

陷阱後果解決
用 abs() 而非 fabs()abs() 接受 int,浮點數隱性轉型截斷小數,邏輯全錯包含 <math.h>,用 fabs()
未連結數學庫GCC 編譯報 undefined reference to 'fabs'編譯加 -lm:gcc test.c -o test -lm
EPS 設太大/太小太大誤判、太小永遠不等根據應用領域設定:科學計算 1e-9~1e-12、工程 1e-6、貨幣 0.005
忽略 NaN/Inf輸入非數字導致比較異常先檢查 isnan()/isinf()

擴充:迴圈持續輸入直到符合條件


#include 
#include 

int main() {
    const double ANSWER = 3.14159;
    const double EPS = 0.0001;
    double input;

    while (1) {
        printf("請輸入數值 (輸入 0 結束): ");
        if (scanf("%lf", &input) != 1) {
            printf("輸入無效,清空緩衝區...\n");
            while (getchar() != '\n');  // 清除錯誤輸入
            continue;
        }
        if (input == 0) break;

        if (fabs(input - ANSWER) <= EPS) {
            printf("Close enough! 正確值約 3.14159\n");
            break;
        } else {
            printf("Not close enough,差值: %.6f\n", fabs(input - ANSWER));
        }
    }
    return 0;
}

學習重點

  • 浮點數不精確:0.1、0.2、3.14159 皆無法精確用二進制浮點數表示
  • 比較必用容差:fabs(a-b) <= eps 是標準模式
  • math.h + -lm:使用 fabs、sqrt、sin 等需連結數學庫
  • 輸入驗證:scanf 回傳值檢查 + 緩衝區清理
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved