2016-01-06 51 views
0

乘法我有這樣的代碼:問題在C

#include <stdio.h> 
#include <stdlib.h> 
#include <math.h> 
#include <string.h> 



int main(){ 

char name[]="g9.59e10.01024"; 
int a = atoi(&name[1]); 
int b = atoi(&name[3]); 
int c = atoi(&name[6]); 
int d = c-2; 
int e = pow(10,d); 
int f = (100*a+b); 

printf("%d",a); 
printf("\n"); 
printf("%d",b); 
printf("\n"); 
printf("%d",c); 
printf("\n"); 
printf("%d",d); 
printf("\n"); 
printf("%d",e); 
printf("\n"); 
printf("%d",f); 
printf("\n"); 


float mass_gal = e*f; 



printf("%f",mass_gal); 
printf("\n"); 

} 

當我運行它,我得到這個輸出:

9, 59, 10, 8, 億, 959 , 1410719488.000000

所有的數字似乎是正確的,除了最後一個應該是95900000000.爲什麼我在那裏得到一個錯誤的數字?

謝謝!

回答

0

請您將類型從float更改爲long並檢查結果,看起來問題與float的大小有關。

4

float mass_gal = e*f;中的乘法運算使用整數算術。結果大於INT_MAX並溢出(導致未定義的行爲)。然後結果被轉換並存儲在一個浮點數中。

在執行乘法之前將運算符強制浮動。

float mass_gal = (float)e * (float)f; 

結果將不準確,因爲IEEE 754單精度浮點算法只能精確地表示整數達到值2^24。

如果您不想擔心精度,請使用可表示結果的整數類型,如long long int

+0

如果我這樣做,我得到95900000256.000000,這是好的,但最終是什麼256? – Silviutz

+0

因爲即使使用float或double,類型也有限制,並且只能處理由類型支持的值。你得到這個是因爲值95900000000不是由float類型處理的。並在您的計算機上,它似乎最接近的值是95900000256.000000 – mikedu95

+0

我不知道這是如何編譯的!戰俘被定義爲雙打而不是整數。你應該關心數據類型。 – wegus