1

C/C++ での倍精度浮動小数点値の表記法は何ですか?

.5double または float 値を表していますか?

2.0ffloat および double として解析されると確信して2.0いますが、.5 はどうですか?

http://c.comsci.us/etymology/literals.html

4

2 に答える 2

9

二重です。float を取得するには、末尾に f を付けます。

参照ドキュメントへのリンクは次のとおりです: http://en.cppreference.com/w/cpp/language/floating_literal

于 2012-11-07T19:35:22.457 に答える
1

技術的には、double 定数を使用して float を初期化すると、float 定数を使用して初期化する場合とは異なる結果になる可能性があります (つまり、2 つの丸め誤差が累積されます)。

次に例を示します。

#include <stdio.h>
int main() {
    double d=8388609.499999999068677425384521484375;
    float f1=8388609.499999999068677425384521484375f;
    float f2=8388609.499999999068677425384521484375;
    float f3=(float) d;
    printf("f1=%f f2=%f f3=%f\n",f1,f2,f3);
}

gcc 4.2.1 i686 で

f1=8388609.000000 f2=8388610.000000 f3=8388610.000000

定数は正確に基数 2 です。

100000000000000000000001.011111111111111111111111111111

基数 2 の表現には 54 ビットが必要ですが、double には 53 ビットしかありません。

100000000000000000000001.10000000000000000000000000000

ベース 2 表現には 25 ビットが必要ですが、float には 24 ビットしかないため、この double を float に変換すると、別の丸めが最も近い float に発生し、偶数に結び付けられ、次のようになります。

100000000000000000000010.

最初の数値を浮動小数点数に直接変換すると、単一の丸めは異なります。

100000000000000000000001.

ご覧のとおり、f2 を初期化するとき、gcc は 10 進数表現を double に変換してから float に変換します (動作が標準によって決定されているかどうかを確認することは興味深いでしょう)。

ただし、これは特別に作成された数値であるため、ほとんどの場合、このような違いは発生しません。

于 2012-11-07T22:40:19.943 に答える