簡體   English   中英

將命令行arg轉換為double不能通過C中的邏輯檢查

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM