3

Pythonの次のコードスニペットについて考えてみます。

m = int(math.sqrt(n))

n = 25の場合、m = 5になるはずです(私のシェルではそうなります)。しかし、私のCの経験から、sqrt関数は実際の値よりもわずかに低い値を返す可能性があり、丸めた後、m=5ではなくm=4になる可能性があるため、このような式を使用することは悪い考えであることがわかります。この制限もありますかPythonに関与していますか?そして、これが事実である場合、Pythonでそのような式を書くための最良の方法は何ですか?JavaまたはC#を使用するとどうなりますか?また、不正確な点がある場合、その量を左右する要因は何ですか?

4

3 に答える 3

7

適切な丸めを行うにはround()、;を使用します。最も近い整数に丸められますが、浮動小数点数を返します。int次に、結果からを構築できます。

(おそらく、コードはパフォーマンスクリティカルではなく、それに関連する速度低下に気付くことはありませんround()。そうする場合は、とにかくnumpyを使用する必要があります。)

于 2012-08-13T07:03:45.473 に答える
3

の精度に非常に関心がある場合は、独自の関数を提供する標準ライブラリのdecimal.Decimalクラスsqrtを使用できます。クラスは、通常のPythonよりも高い精度に設定できます。とはいえ、とにかく丸めているかどうかは問題ではないかもしれません。クラスの結果は正確な数になります(ドキュメントから):sqrtDecimalfloatDecimal

[Decimalの]正確さは算術に引き継がれます。10進浮動小数点で 0.1 + 0.1 + 0.1 - 0.3は、はゼロに正確に等しくなります。バイナリ浮動小数点では、結果は5.5511151231257827e-017です。ゼロに近い間、違いは信頼できる同等性テストを妨げ、違いは蓄積する可能性があります。このため、厳密な等式不変量を持つ会計アプリケーションでは10進数が推奨されます。

于 2012-08-13T07:08:46.793 に答える
2

解決策は簡単です。整数の結果を期待している場合は、int(math.sqrt(n)+。1)を使用します。値が整数の結果より少し多いか少ない場合は、正しい値に丸められます。

于 2012-08-13T06:57:20.760 に答える