2016-05-09 6 views
1

[0.0, 1.0]の浮動小数点を文字列として表すと仮定します。この値はfloatstrとします。この値が区間[0, 255]の整数を表すものとします。[0、255]の範囲の値を表すために必要な小数点以下の桁数

整数にfloatstrを変換するための式(Pythonで)である: int(round(float(floatstr)*255))

正確にこの値を表すためにfloatstrに必要な小数点以下の最小数は?そうするための公式がある場合、この最小数はどのように計算されますか?

+0

あなたのロジックは、私が思うに、実際に、明確ではありません範囲(0.0,1.0)のfloatを範囲(0,255)の整数にマップする方法はたくさんあります。なぜあなたはそのようなアルゴリズムを使用していますか? – Kasramvd

+0

この範囲は、ブルートフォースで必要な値を決定するだけの十分な大きさです。 – user2357112

+0

@ Kasramvd:私はそれを線形にマッピングしています。私がそうしているのは、アプリケーションでコードを自動生成し、出力をより読みやすくするために、フロートを印刷するたびに表示される小数点の数を減らしたいからです。私は削除できる小数点の数がわからないだけです。 – exodrifter

答えて

5

明らかに2桁では切り取られません。あなたは100個の別個の値しか表現できません。 3桁はどうですか?

数字がx/255で、小数点の後に3桁の数字が表示され、実際には数字がy/1000に丸められます。 y/1000255を掛け合わせると、が1/255からy/1000の最も近い倍数の場合は、xが生成されます。

x/255 = y/1000の場合は、明らかに最も近い倍数の1/255です。それ以外の場合、x/255は、y/1000の範囲内で、y/1000に丸めなければならないため、y/1000の反対側の1/255の最も近い倍数は、少なくとも1/255 - 1/2000離れて、x/255より離れている必要があります。したがって、x/2551/255y/1000の最も近い倍数であり、3桁で十分です。同様に、任意の分母dの場合、n桁の場合、小数点以下は小数点以下の桁数で十分です。dが10の累乗であれば、小数点以下はn-1となります。

(私はこの派生で暗黙の浮動小数点丸め誤差の影響を無視してきました。小さな分母のために、浮動小数点の丸め誤差がこの分析を変更しないでください。)

+0

除数として256を使用することで浮動小数点丸め誤差を問題として完全に排除できます。 IEEE 754バイナリ浮動小数点数では、[0,255]の数値のすべての除算は256で正確です。 –

+0

@PatriciaShanahan:小数点の表現には注意が必要ですが、浮動小数点として読み込んだ場合、丸め誤差が発生することがあります。問題。 – user2357112

関連する問題