2012-08-17 26 views
-1

請向我解釋這兩段代碼背後的輸出/概念。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

+2

寫'3.3'和二進制'3.5'。記住'double'比'float'更精確。 – pmg 2012-08-17 09:39:26

+0

我不知道你將bool值賦給float變量的概念是什麼。 – 2012-08-17 09:40:55

+0

另外:**總是使用'double';不要使用'float'沒有很好的理由**(因爲老師這麼說並不是很好的理由) – pmg 2012-08-17 09:41:10

回答

3

在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浮點,這是很常見的。)

0

3.3不是floatdouble:你用不同精度比較數字。

+0

那麼爲什麼3.5的結果會不一樣呢? – 2012-08-17 09:42:13

+1

在比較之前將值轉換爲相同類型 – pmg 2012-08-17 09:43:46

+0

@pmg'(float)3.3 == 3.3':在== ==左邊的操作數中,值爲3.3的數值轉換爲float,然後轉換爲double '而在右邊的操作數中不發生轉換。 – ouah 2012-08-17 09:51:01

1

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另一方面是在兩種floatdouble(如0x1.cp+1)精確表示,因此比較相等。

比較結果爲1(等於)或0(不等於),並且將比較結果作爲浮點數打印出來。

+0

您能否詳細說明您答案的第一段? – 2012-08-17 09:48:48

+0

@AmitAgarwal請查看此鏈接:http://fourier.eng.hmc.edu/e85/lectures/arithmetic_html/node11.html,然後轉至「IEEE 754示例」部分。非常好的答案btw。 – 2012-08-17 09:53:24

+0

@AmitAgarwal見上文。 – ecatmur 2012-08-17 10:03:33