-1

重複の可能性:
C の浮動小数点の問題

#include<stdio.h>
main()
{
        int a,b;
        float f;
        scanf("%2d%3d%4f",&a,&b,&f);
        printf("%d %d %f",a,b,f);
}

このプログラムを実行して 2 4 56.8 を入力すると、出力 2 4 56.799999 が得られます。

4

4 に答える 4

0

浮動小数点数ドメインの連続空間は離散レベルにマップされるため、すべての浮動小数点数を正確な値として格納することはできません。たとえば、浮動小数点数はIEEE754単精度形式で格納できます。浮動小数点数を32ビットのメモリに3つの部分に格納します。[a, b]IEEE754形式で正確に表すことができる2つの最も近い浮動小数点数であると仮定しますが、aとの間に無限の数の浮動小数点数があります。bその場合、これらの数はまたはのいずれかで近似されaますb。これはあなたが経験している不正確さを引き起こします。

数値は正規化された形式で保存されますが、非常に小さい数は正規化されていない形式で保存できます。ドキュメントをご覧ください。

たとえば、あなたの場合、56.8IEEE754単精度表現は次のようになります。

  • 符号:0(1ビット)
  • バイアスされた指数:10000100(8ビット)
  • 仮数:11000110011001100110011(23ビット)

ここで、この数値を10進数に戻すと、次のようになります。

  • 符号は0、つまり値は正です
  • 10000100 = 132バイアス量127したがって、指数= 132-127 = 5
  • 隠しビット付き仮数1.11000110011001100110011
  • 指数で小数点を調整した後(5桁右に移動):111000.110011001100110011
    • 整数部分:111000 = 2 ^ 5 + 2 ^ 4 + 2 ^ 3 = 56
    • 小数部:.110011001100110011 = 2 ^ -1 + 2 ^ -2 + 2 ^ -5 + 2 ^ -6 + 2 ^ -9 + 2 ^ -10 + 2 ^ -13 + 2 ^ -14 + 2 ^- 17 + 2 ^ -18 = 0.799999237

したがって、IEEE754単精度形式から値を取得すると、次のようになります。56.8を格納した場所で56.799999237

ここでIEEE754表現を試すことができます:http ://www.h-schmidt.net/FloatConverter/IEEE754.html

于 2012-06-12T07:08:18.100 に答える