4

些細な質問: int または long を別の int または long の累乗にしたい場合は、

(long)std::pow((double)a,(double)b)

十分ですか、それとも必要ですか

(long)(0.5 + std::pow((double)a,(double)b))

?

4

7 に答える 7

5

2 つの考慮事項があります。1 つ目は、浮動小数点表現の不正確さによる丸めです。この場合、これは問題になりません。ビット数が浮動小数点の有効桁数のビットよりも少ない限り、整数は完全に表現可能だからです。longが 32 ビットで仮数部が 53 ビットであればdouble、通常は問題ありません。

pow2 番目の考慮事項は、関数自体の精度です。実際の値よりも低くなる可能性がある場合は、0.5 を追加して結果を丸めることが、適切な結果を保証する唯一の方法です。

your will の期待される結果powは常に整数であるため、0.5 を追加しても問題はありません。そのバージョンをお勧めします。

于 2011-08-17T14:13:25.813 に答える
3

独自の関数を作成する必要があります。そうすれば、オーバーフローを自分で処理でき、丸め誤差を心配する必要がありません。

しかし、2つのうち、2番目を使用します。

于 2011-08-17T14:04:21.307 に答える
3

2 番目の例は、結果を切り捨てるのではなく、最も近い整数に丸めるので、より適している可能性があります。

于 2011-08-17T14:06:39.167 に答える
2

ループを使用してみませんか。とにかくオーバーフローなしで31/63を超える整数乗算はあり得ません。

于 2011-08-17T14:15:38.190 に答える
1

最初のもので十分ですが、キャストする前に結果の double 値を確認する必要があります。

于 2011-08-17T14:03:50.827 に答える
0

最初の例は有効です。static_cast<>()ただし、明確にするために、c スタイルのキャストの代わりに aを使用することをお勧めします。あなたが投稿した2番目の例は、小さな値に対して誤った結果をもたらし、余分です。

于 2011-08-17T14:03:39.250 に答える
0

次のことを行うだけで十分です。

static_cast<long>(std::pow(static_cast<double>(a), b));

これは b の値が大きいとオーバーフローすることに注意してください。

于 2011-08-17T14:06:23.583 に答える