2013-03-02 52 views
2
#include <stdio.h> 
#include <stdlib.h> 

#define answer 3.141593 

void main(int argc, char **argv) { 

     float a = (argc - 2)?: strtod(argv[1], 0);  
     printf("double = %lf ,float = %f", a-answer , a-answer); 

} 

當我運行它這樣的:什麼是-0.0000在C使用浮動和雙?

./a.out 3.141593 

輸出

double = -0.000000 ,float = -0.000000 

爲什麼它-0.00000?我怎樣才能讓它輸出0.000000

我該如何製作a == answer


怎麼會有-0值,如果它使用2的補碼?

+3

http://en.wikipedia.org/wiki/Signed_zero – Joe 2013-03-02 13:54:16

+1

通過固定類型'a'是'雙'。 – 2013-03-02 13:55:46

+2

@joe:結果不爲零。它只是打印的地方太少。 – 2013-03-02 13:56:43

回答

7

浮點數不使用2的補碼。他們有符號,指數和尾數,你的數字只有零符號,或者更可能的是,你有一些數字,如-1.0e-15,打印爲-0.0000。嘗試%e而不是%f。由於無法在有限精度數據類型中存儲具有無限精度的數字(發生一些舍入),並且將雙精度浮點數更改爲浮點數,所以必須發生額外的舍入。 (請記住,3.141593是二進制表示中的無限週期數,這實際上取決於存儲此數字的類型)