0

小数点以下6桁までの後に小数点以下12桁の浮動小数点値を保存すると、固定値が表示されます.ガベージ値の場合、コンパイラごとに異なるはずですが、本で出力を見て実際に試してみると、両方とも同じ結果。

#include <stdio.h>

int main(void)
{
    float a = 1.234567890000;

    printf("%.12f\n", a);
    return 0;
}

出力:

1.234567880630   // In my book it also represents same output.
4

4 に答える 4

3

それがガベージ値である場合、コンパイラごとに異なるはずですが、私の本で出力を見て実際に試してみると、どちらも同じ結果です。

あなたのコンパイラとあなたが使用している本の両方が浮動小数点数にIEEE 754標準を使用し、値を処理するための同様のメカニズムを持っている可能性が非常に高いです。そのため、他の多くのコンパイラやシステムと同様に、おそらく同じ答えが得られるでしょう。

主な問題は、浮動小数点値の格納方法と機能にあります。32 ビットの float 値では小数点以下 12 桁を正確に表すには十分な精度がないため、入力したものとは異なる出力が得られます。

于 2012-08-06T17:18:30.970 に答える
1

コンパイラが浮動小数点数の IEEE 754 標準を実装することを期待してください。float ( binary32 ビット) の場合、数字は 23 ビット、符号は 1 ビットです。これにより、7.x の 10 進数が得られます。だからあなたが見るものは正しいです。

さらに精度が必要な場合は、桁に 52 ビットを使用し、34 桁の精度を提供する double を使用します。

于 2012-08-06T17:24:36.553 に答える
1

浮動小数点を使用している場合は、これも啓発的な記事であり、多くの驚きから救われるかもしれません:すべてのコンピューター科学者が浮動小数点演算について知っておくべきこと.

数学とは異なり、0.1 の 10 倍が 1 になることはめったにないことを覚えておいてください。

于 2012-08-06T17:27:00.777 に答える
0

浮動小数点数 (ほとんどのシステムで) は、その値を 32 ビットで格納します。これらのビットは、符号、指数、および「有効桁数」(値の主要部分) の間で分割されます。これにより、ほとんどの値に対して 7 桁から 8 桁の 10 進精度が得られます。あなたが見ている12桁のうち。

double は 64 ビットを使用し、ほとんどの値に対して 15 ~ 16 桁の精度を提供します。

コンパイラは値を丸めて格納する必要があるため、7 ~ 9 桁目あたりで奇数の値が得られます。丸め方法はほぼ標準であるため、コンパイラは通常、同じ丸め結果を返します。

C/C++ では通常、コンパイラが「最小」サイズを提供する必要があることに注意してください。ただし、値は CPU レジスタなどのより大きなストレージに格納される可能性があるため、マイレージは下位ビットで異なります。

于 2012-08-06T17:16:41.983 に答える