請向我解釋這兩段代碼背後的輸出/概念。Float數據類型及其賦值的概念
float x;
x=(float)3.3==3.3;
printf("%f",x);
輸出上面是0.000000
float x;
x=(float)3.5==3.5;
printf("%f",x);
輸出上面是1.000000
請向我解釋這兩段代碼背後的輸出/概念。Float數據類型及其賦值的概念
float x;
x=(float)3.3==3.3;
printf("%f",x);
輸出上面是0.000000
float x;
x=(float)3.5==3.5;
printf("%f",x);
輸出上面是1.000000
在C源文本中,數字「3.3」代表非常接近數字3.3的double類型的值。良好的編譯器將「3.3」轉換爲最接近於3.3的雙精度型值,即3.29999999999999982236431605997495353221893310546875,但C標準不要求這樣做。
表達式(float) 3.3
將此double轉換爲float,它生成最接近double的float類型的值。該值爲3.2999999523162841796875。
然後表達式(float) 3.3 == 3.3
比較float值和double值。 (這隱含地將float轉換爲double,但在此轉換期間值不變。)由於值不等,所以比較的結果爲0.
因爲3.5可以完全表示爲double,所以數字「 3.5「正好產生3.5的值。這也可以用浮點數來表示,所以將其轉換爲浮點數會產生3.5。然後比較這兩個值產生1.
(此答案假定IEEE 754浮點,這是很常見的。)
3.3
在二進制浮點(它包含循環小數部分)中不完全可表示。將double
字面值3.3
轉換爲float
並返回double
以與3.3
比較失去精度,因此比較不等。
對於IEEE 64位double
和32位float
:
3.3
被表示爲0x1.a666666666666p+1
3.3f
被表示爲0x1.a66666p+1
,所以(float) 3.3
將是相同的0x1.a666660000000p+1
,這顯然不等於3.3
。3.5
另一方面是在兩種float
和double
(如0x1.cp+1
)精確表示,因此比較相等。
比較結果爲1
(等於)或0
(不等於),並且將比較結果作爲浮點數打印出來。
您能否詳細說明您答案的第一段? – 2012-08-17 09:48:48
@AmitAgarwal請查看此鏈接:http://fourier.eng.hmc.edu/e85/lectures/arithmetic_html/node11.html,然後轉至「IEEE 754示例」部分。非常好的答案btw。 – 2012-08-17 09:53:24
@AmitAgarwal見上文。 – ecatmur 2012-08-17 10:03:33
寫'3.3'和二進制'3.5'。記住'double'比'float'更精確。 – pmg 2012-08-17 09:39:26
我不知道你將bool值賦給float變量的概念是什麼。 – 2012-08-17 09:40:55
另外:**總是使用'double';不要使用'float'沒有很好的理由**(因爲老師這麼說並不是很好的理由) – pmg 2012-08-17 09:41:10