16

次のコード行の実行中:

int i,a;    

for(i=0;i<=4;i++)  
{    
    a=pow(10,i);    
    printf("%d\t",a);    
}   

出力を見て驚いたのは、 1 10 99 1000 9999代わりに1 10 100 1000 10000.

考えられる理由は何ですか?


上記の for ループの wheni = 2で、変数に格納されている値aがであることが浮動小数点の不正確さであると思われる場合99

しかし、代わりに書くと

a=pow(10,2);

これで a の値は になります100。そんなことがあるものか?

4

5 に答える 5

22

に設定aしましたintpow()浮動小数点数を生成します。場合によっては、100 または 10000 未満の髪の毛になることもあります (ここで見られるように)。

次に、それを整数に詰め込み、整数に切り捨てます。したがって、その小数部分が失われます。おっとっと。本当に整数の結果が必要な場合は、その操作を行うには round の方が適している可能性があります。

そこにも注意してください。十分に大きなパワーに関しては、エラーが実際にはまだ失敗を引き起こすのに十分な大きさであり、予期しない結果をもたらす可能性があります。浮動小数点数は非常に高い精度しか持たないことに注意してください。

于 2013-08-09T21:28:37.593 に答える
13

関数pow()は を返しますdoubleatype のvariable に割り当てていますint。これを行うと、浮動小数点値が「四捨五入」されず、切り捨てられます。10^2 に対して 99.99999 ...pow()のようなものを返す場合は、.9999... の部分を捨てるだけです。と言ったほうがいいa = round(pow(10, i))

于 2013-08-09T21:30:10.670 に答える
9

これは、浮動小数点の不正確さに関係しています。sを渡していますが、関数は浮動小数点パラメーターに対してのみ定義されているintため、暗黙的に浮動小数点型に変換されています。pow

于 2013-08-09T21:27:18.423 に答える
1

数学的には、整数の整数べき乗は整数です。

高品質のpow()ルーチンでは、この特定の計算で丸め誤差が発生することはありません。コードを Eclipse/Microsoft C で実行したところ、次の出力が得られました。

1   10  100 1000    10000   

このテストは、Microsoft が浮動小数点数と丸めを使用しているかどうか、または数値のタイプを検出して適切な方法を選択しているかどうかを示すものではありません。

そこで、次のコードを実行しました。

#include <stdio.h>
#include <math.h>
main ()
{
    double i,a;

    for(i=0.0; i <= 4.0 ;i++)
    {
        a=pow(10,i);
        printf("%lf\t",a);
    }
}

そして、次の出力を得ました:

1.000000    10.000000   100.000000  1000.000000 10000.000000    
于 2013-08-09T22:48:25.523 に答える