些細な質問: int または long を別の int または long の累乗にしたい場合は、
(long)std::pow((double)a,(double)b)
十分ですか、それとも必要ですか
(long)(0.5 + std::pow((double)a,(double)b))
?
2 つの考慮事項があります。1 つ目は、浮動小数点表現の不正確さによる丸めです。この場合、これは問題になりません。ビット数が浮動小数点の有効桁数のビットよりも少ない限り、整数は完全に表現可能だからです。long
が 32 ビットで仮数部が 53 ビットであればdouble
、通常は問題ありません。
pow
2 番目の考慮事項は、関数自体の精度です。実際の値よりも低くなる可能性がある場合は、0.5 を追加して結果を丸めることが、適切な結果を保証する唯一の方法です。
your will の期待される結果pow
は常に整数であるため、0.5 を追加しても問題はありません。そのバージョンをお勧めします。
独自の関数を作成する必要があります。そうすれば、オーバーフローを自分で処理でき、丸め誤差を心配する必要がありません。
しかし、2つのうち、2番目を使用します。
2 番目の例は、結果を切り捨てるのではなく、最も近い整数に丸めるので、より適している可能性があります。
ループを使用してみませんか。とにかくオーバーフローなしで31/63を超える整数乗算はあり得ません。
最初のもので十分ですが、キャストする前に結果の double 値を確認する必要があります。
最初の例は有効です。static_cast<>()
ただし、明確にするために、c スタイルのキャストの代わりに aを使用することをお勧めします。あなたが投稿した2番目の例は、小さな値に対して誤った結果をもたらし、余分です。
次のことを行うだけで十分です。
static_cast<long>(std::pow(static_cast<double>(a), b));
これは b の値が大きいとオーバーフローすることに注意してください。