[英]Converting command line arg to double fails to pass logic check in C
我在Linux機器上編寫C程序。 我正在嘗試將命令行參數轉換為雙精度,然后檢查該數字是否大於MAX_K。 它更大,我希望程序退出,但事實並非如此。 例如,我將MAX_K設置為10 ^ 18,然后輸入1000000000000000001作為參數,如果它大於1000000000000000000,則我希望程序退出,否則打印“ OK”,但程序不會退出,但打印“ OK” ”。 我嘗試將MAX_K定義為程序內部的double,結果相同。 我不明白為什么程序沒有退出,因為顯然1000000000000000001> 1000000000000000000。
這是我的代碼:
#include <stdio.h>
#include <stdlib.h>
#define MAX_K 1000000000000000000
int main(int argc, char *argv[]) {
// double MAX_K = 1000000000000000000;
double K;
if (argc != 2) {
exit(1);
}
K = strtod(argv[1], NULL);
if (K > MAX_K) {
exit(1);
}
printf("OK\n");
return 0;
}
strtod()
返回由輸入字符串表示的最接近的double
值。
給定double
的有限精度,例如“ 1000000000000000000”和“ 1000000000000000001”的輸入通常都將轉換為同一個double
。
因此,盡管輸入了“ 1000000000000000001”,但K
取值為1000000000000000000
並且沒有通過極限測試。
這是一個精度問題,而不是范圍問題。 使用雙精度值(例如“ 10000(總共300個零)000)”可以輸入,並且strtod()
將隱式轉換為最接近的double
strtod()
,這將是前15個十進制數字中所期望的。
**根據規格, DBL_DIG
至少為 10
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.