10

http://msdn.microsoft.com/en-us/library/system.math.pow.aspxから

int value = 2;
for (int power = 0; power <= 32; power++)
    Console.WriteLine("{0}^{1} = {2:N0}",
                      value, power, (long) Math.Pow(value, power));

Math.Powは引数としてdoubleを取りますが、ここではintを渡します。

質問:doubleへの暗黙の変換が発生した場合、浮動小数点の丸め誤差の危険性はありますか?

はいの場合は、次のようなものを使用することをお勧めします。

public static int IntPow(int x, uint pow)
{
    int ret = 1;
    while (pow != 0)
    {
        if ((pow & 1) == 1)
            ret *= x;
        x *= x;
        pow >>= 1;
    }
    return ret;
}
4

4 に答える 4

7

特殊なケースでは、2 の x 乗を計算するときに、単純な左シフトを使用できます。これにより、コードが次のように簡素化されます。

public static int TwoPowX(int power)
{
    return (1<<power);
}
于 2015-07-02T06:09:24.487 に答える
5

いいえ、 への変換によって丸め誤差が発生する可能性はありませんdoubledoubleべき関数の領域に入るすべての整数を正確に表すことができます。

于 2012-06-25T21:02:29.603 に答える
4

はい、double への暗黙的な変換が行われ、結果として浮動小数点の丸めエラーが発生する可能性があります。

あなたが提案する代替方法を使用する価値があるかどうかについては、それはアプリケーションに固有です。浮動小数点の丸め誤差はまったく受け入れられませんか? int32 内に収まる数値を使用しますか (べき乗がオーバーフローするのにそれほど時間はかかりません)。

于 2012-06-25T20:20:24.237 に答える
-1
public static int IntPow(int number, uint power)
        {
            int result = 1;
            for (int i = 0; i < power; i++)
            {
                result *= number;
            }
            return result;
        }

読みやすさのために!

于 2012-06-25T21:00:59.257 に答える