0

ceil() 関数を使用して、浮動小数点計算の結果を最も近い整数に丸めています。あらゆる種類の異なる入力が経験されています...

int(ceil(A*B))

問題を説明するためのいくつかの例を次に示します。

int(ceil(1.01*100)) = 101
int(ceil(1.02*100)) = 102
int(ceil(1.03*100)) = 103
int(ceil(1.04*100)) = 104
int(ceil(1.05*100)) = 105
int(ceil(1.06*100)) = 106
int(ceil(1.07*100)) = 107
int(ceil(1.08*100)) = 108
int(ceil(1.09*100)) = 110 ***
int(ceil(1.10*100)) = 111 ***
int(ceil(1.11*100)) = 112 ***
int(ceil(1.12*100)) = 113 ***
int(ceil(1.13*100)) = 113

これは、実行中の浮動小数点計算に関係していることに気づきました...

1.09*100 = 109.000000.... > 109

このバグを確実にトラップする方法がわかりません

以下に概説するような「大まかな」方法がいくつかありますが、これが十分に堅牢なソリューションであるとは考えていません

int(ceil((1.09*100)-0.00000001)) = 109
4

2 に答える 2

3

あなたの問題は新しいものでもPython固有のものでもありませんが、浮動小数点計算に固有のものです。かつて Fortran 4 を使用したすべてのダイノサウルスはそれを知っています:プログラマーとしてのあなたは、計算の期待される精度 ε を知っていなければなりません。そう :

  • 次の場合、2 つの数値 x と y は等しいと見なされます。| x - y | < ε
  • x より下位の最大の整数はfloor(x + ε)
  • xより大きい最小の整数はceil(x - ε)

したがって、εの適切な値を知る方法があれば、提案されたソリューションは適切です。モジュールを作成している場合は、ユーザーがそれを指定できるようにする必要があります。

于 2014-04-30T16:08:51.010 に答える
2

問題は浮動小数点数の精度の制限に起因するということは正しいです。

decimalモジュールはあなたの友達です:

from decimal import Decimal
from math import ceil

print int(ceil(Decimal("1.10") * 100))

実際には数値を文字列として提供する必要があることに注意してください。そうしないと、最初にPythonによって浮動小数点数として解析されます(ここで、回避したい精度の問題が発生します)。

于 2014-04-30T16:08:37.353 に答える