2014-10-28 15 views
0

我在Microsoft Visual Studio 2012中構建一個應用程序,我有一個函數需要一個char數組,並且應該返回一個單精度浮點數。我將如何將字符數組轉換爲浮點數並檢查其範圍?

My功能:

Token aa_func08(char lexeme[]){ 
    Token t; /* floating point literal Token to be returned */ 
    double temp; /* floating point value of character array */ 

    temp = atof(lexeme); /* convert character array to floating point value */ 
    if ((FLT_MAX - temp <= FLT_EPSILON) || (temp - FLT_MIN <= FLT_EPSILON)) /* floating point value is outside the accepted range */ 
     return aa_table[ES](lexeme); /* return an error Token */ 
    t.code = FPL_T; /* set Token code */ 
    t.attribute.flt_value = (float)temp; /* set Token integer value to floating point literal value */ 
    return t; /* return floating point literal Token */ 
} 

我想與最大和最小值用於浮點數據類型查詢的浮點值,並且我還需要檢查char數組的長度。

我期望的輸出如下:

如果我通過:

1.999999999999999911111111111111111111111111111111111111111111111111111111111111111 

我期望能獲得:2.000000

如果我通過:

999999999999999999999999999999999999999999999999999999999999999999999999999999999.0 

我期望得到:99999999999999999999

如果我通過:

0.00000000000000000000000000000000000000000000000000000000000000000000000000000000001 

我期望能獲得:0.000000000000000000

有誰知道我能取得這樣的成績,或者至少指向我朝着正確的方向?謝謝!

EDIT

對於第一種情況,結果2.000000由32位浮點表示。另外兩個結果只是字符串lexeme被截斷爲前20個字符。因此,總而言之,如果lexeme代表有效的float,它表示爲浮點數,但如果lexeme代表無效的float(超出範圍,小數點後的缺失數字等),那麼lexeme的前20個字符是我返回(不是實際的float)。

+0

什麼是'FLT_MAX'和'FLT_MIN'? – 2014-10-28 16:51:28

+0

我會考慮看sscanf。還請查看[LOLCODE實現](https://github.com/justinmeza/lci/blob/master/tokenizer.c) – 2014-10-28 16:52:03

+1

@代碼學徒他們是在float.h中定義的常量,用於最大和最小浮點數點值。 – 2014-10-28 16:58:42

回答

1

你可能想給這個一讀:What Every Computer Scientist Should Know About Floating-Point Arithmetic

具體你不會得到「99999999999999999999」,或精度20位進行浮點類型(甚至出雙)的。其次取決於你如何轉換值,你可能得到1E-83爲「0.0000000000000000000000000000000000000000000000000000000000000000000000000000001」。您可能還想看看IEEE Floading Point

您的示例與您的目標不符,暗示其中一個或另一個會導致失望。如果您需要將字符串轉換爲32位浮點類型,則需要遵守該格式的限制。如果您需要精確度(和行爲),您的示例將描述您可能需要編寫某種自定義數字類型。

+0

我意識到這一點。基本上在'99999999999999999999'和'0.000000000000000000'的情況下,我期望的結果實際上是浮點值的字符串表示,而不是實際的浮點值。 – 2014-10-28 19:43:47

0

看起來OP的目標是檢查該號碼在float範圍使用字符串來double轉換,然後測試範圍相符。

極限測試無效。錯誤地使用了FLT_EPSILONFLT_MIN

建議簡單地比較double與+/- FLT_MAX。

volatile double d = atof(lexeme); 
if ((d > FLT_MAX) || (d < -FLT_MAX)) { 
    return aa_table[ES](lexeme); 
} 
t.code = FPL_T; 
t.attribute.flt_value = (float) d; 

不清楚OP如何處理NaN。


[編輯]現在看OP也想限制輸入爲20 char。建議:

char buf[20+1]; 
strncpy(buf, lexeme, 20); 
buf[20] = '\0'; 
volatile double d = atof(buf); 
... 

極限測試仍然是有意義的輸入可以是1.0e100,或超越FLT_MAX

+0

你的變量f來自哪裏? – 2014-10-28 19:41:11

+0

@Benjamin C. Huskisson-Snider對不起,'f'是從早期的答案中遺留下來的。答案已更新。 – chux 2014-10-28 20:17:10

相關問題