重複の可能性:
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 が得られます。
重複の可能性:
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 が得られます。
浮動小数点数ドメインの連続空間は離散レベルにマップされるため、すべての浮動小数点数を正確な値として格納することはできません。たとえば、浮動小数点数はIEEE754単精度形式で格納できます。浮動小数点数を32ビットのメモリに3つの部分に格納します。[a, b]
IEEE754形式で正確に表すことができる2つの最も近い浮動小数点数であると仮定しますが、a
との間に無限の数の浮動小数点数があります。b
その場合、これらの数はまたはのいずれかで近似されa
ますb
。これはあなたが経験している不正確さを引き起こします。
数値は正規化された形式で保存されますが、非常に小さい数は正規化されていない形式で保存できます。ドキュメントをご覧ください。
たとえば、あなたの場合、56.8IEEE754単精度表現は次のようになります。
ここで、この数値を10進数に戻すと、次のようになります。
したがって、IEEE754単精度形式から値を取得すると、次のようになります。56.8を格納した場所で56.799999237
ここでIEEE754表現を試すことができます:http ://www.h-schmidt.net/FloatConverter/IEEE754.html