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);

}

そのように実行すると:

./a.out 3.141593

出力は

double = -0.000000 ,float =  -0.000000

なぜ-0.00000ですか?どうすれば出力できます0.000000か?

どうすれば作れa == answerますか?


2 の補数を使用すると、なぜ -0 の値になるのでしょうか?

4

1 に答える 1

7

浮動小数点数は2の補数を使用しません。それらには符号、指数、仮数があり、数値には符号が付いたゼロがあります。おそらく、-0.0000として出力される-1.0e-15のような数値があります。%fの代わりに%eを試してください。わずかな違いは、有限精度のデータ型に無限精度の数値を格納できないこと(一部の丸めが発生)によって生じます。doubleをfloatに変更すると、追加の丸めが発生する必要があります。(3.141593はバイナリ表現では無限の周期数であることに注意してください。これは、実際には、この数が格納されているタイプによって異なります)

于 2013-03-02T14:01:32.657 に答える