-6

ここでは、フロート変数から128.0と129.0を2M回減算します。

#include "stdafx.h"
#include<stdlib.h> //is this the problem? Or am i doing something wrong?
int main()
{

float d1=3.0e9;
printf("\n before: %f \n",d1);
for(int i=0;i<2000000;i++) d1=d1-128.0; //doesnt change!    
printf("\n after : %f \n",d1);
for(int i=0;i<2000000;i++) d1=d1-129.0; //does change!
printf("\n after2: %f \n",d1);

//is 129 is the minimum step for sub/add ? Isnt this wrong? 
//Is this about exponential part 10^9 ?
getchar();
return 0;
 }

出力:

ここに画像の説明を入力してください

質問: 129よりも小さいオペランドを加算/サブスクライブしても、このフロートが変化しないのはなぜですか?初期フロート値3.0e9を選択したので?

初期値3.0e10を選択すると、初期化と減算の両方が機能しません。

初期値3.0e8を選択した場合、最小変更は17です。したがって、16は変更されません。:(

だから、答えてくれてありがとう、。初期値が小さくなると、精度に応じて最小ステップが小さくなります。

VC++2010エクスプレス。WindowsXP32ビット。pentium-m

4

3 に答える 3

5

それはあなたの初期値だからです。float は少量の桁しか保持できないため、演算の結果を表すことができず、最も近い値に丸められます。

于 2012-08-14T12:25:19.807 に答える
5

doubleの代わりに使用しfloatます。

次に、「精度」の概念について学びます。

タイプfloatは、小数点以下約 9 桁に適しています。32 ビット浮動小数点数の完全な説明は次のとおりです。

于 2012-08-14T12:26:10.367 に答える
5

32 ビットの floatの構造を見ると、何が起こっているかを理解できます。3.0E9IEEE754 形式の値は0x4F32D05Eで、指数値は 31 です (このオンライン計算機を使用して値を見つけることができます)。

これで、仮数用に 23 のサブユニティ 2 進数が残っています。つまり、最小の増分、つまり仮数の隣接する値との差は、2 進数で 31 − 23 = 8 の数値です。仮数部、129 は十分に見える大きさです。

于 2012-08-14T12:30:35.410 に答える