在C言語中,double
範例用於表示浮點數,它是一種雙精度浮點數,可能供給比 float
範例更高的精度。但是,因為打算機外部表示浮點數的方法,double
範例的比較並不像整數那樣簡單直接。本篇文章將深刻探究C言語中 double
範例等於號的奧秘,闡明為什麼兩個看似相稱的 double
值在比較時可能會前去不相稱的成果。
double範例的外部表示
在打算機中,浮點數平日利用IEEE 754標準停止表示。double
範例遵守這個標準,它利用64位來表示一個數,包含標記位、指數位銜接數位。這種表示方法容許 double
範例存在15到17位十進位有效數字的精度。
示例代碼
#include <stdio.h>
#include <float.h>
int main() {
double a = 0.1;
double b = 0.2;
double c = 0.3;
double d = a + b;
printf("a + b == c: %d\n", (a + b) == c);
printf("a + b == d: %d\n", (a + b) == d);
return 0;
}
精準比較與近似相稱
因為 double
範例的精度限制,直接利用 ==
運算符來比較兩個 double
值並不老是能掉掉落正確的成果。這是因為浮點數的表示方法招致了一些數值在打算機外部無法正確表示。
示例代碼
#include <stdio.h>
#include <math.h>
int main() {
double a = 0.1;
double b = 0.2;
double epsilon = DBL_EPSILON;
printf("a == b: %d\n", fabs(a - b) < epsilon);
printf("a + b == 0.3: %d\n", fabs(a + b - 0.3) < epsilon);
return 0;
}
鄙人面的代碼中,我們利用了 fabs
函數來打算兩個 double
值之間的差的絕對值,並與 DBL_EPSILON
(表示 double
範例能表示的最小正數差)停止比較。這種方法可能改正確地斷定兩個 double
值能否近似相稱。
總結
在C言語中,因為 double
範例的外部表示跟精度限制,直接利用 ==
運算符來比較兩個 double
值可能會招致不正確的成果。為了停止改正確的比較,應當利用 fabs
函數跟 DBL_EPSILON
來斷定兩個 double
值能否近似相稱。經由過程懂得 double
範例的外部表示跟精度限制,我們可能更好地編寫可能正確處理浮點數的代碼。