0

整数で計算を行うモジュールを使用する必要がありますが、入力は浮動小数点数です。

私が達成したいのは、一般的な浮動小数点値を対応する整数値に変換し、できるだけ少ないデータを失うことです。

例えば:

val : 1.28827339907e-08
result : 128827339906934

これは、1e22 を掛けた後に達成されます。

残念ながら、値の範囲は変わる可能性があるため、常に同じ定数を掛けることはできません。何か案は?

追加
言い換えると、値 < 1 の行列があり1.323224e-8ます3.457782e-6

それらをすべて整数に変換し、できるだけ少ないデータを失いたいです。

4

4 に答える 4

2

行列の操作の値を保持したい場合は、それらすべてに掛ける値を選択します。

例えば:

1.23423
2.32423
4.2324534

それらすべてに 10000000 を掛けると、次のようになります。

12342300
23242300
42324534

行列を使用して乗算、加算などを実行できます。すべての計算を実行したら、実行した操作に応じて適切な値ですべてを除算することにより、浮動小数点数に戻すことができます。

数学的には理にかなっているから

(Scalar multiplication)
M1` = M1 * 10000000   
M2` = M2 * 10000000

Result = M1`.M2`
Result = (M1 x 10000000).(M2 x 10000000)
Result = (10000000 x 10000000) x (M1.M2)

したがって、乗算の場合、結果を 10000000 x 10000000 で割ります。

加算/減算の場合は、単純に 10000000 で割ります。

乗算する値を選択するには、検索する小数の知識を使用するか、浮動小数点数をスキャンして実行時に自分で値を生成します。

それが役立つことを願っています。

編集: 整数の最大容量を超えることを心配している場合は、オーバーフローが発生することに気付いたときに、python が自動的に (そして静かに) 整数を long に変換することを知っておいてください。Python コンソールで確認できます。

>>> i = 3423
>>> type(i)
<type 'int'>
>>> i *= 100000
>>> type(i)
<type 'int'>
>>> i *= 100000
>>> type(i)
<type 'long'>

それでもオーバーフローが心配な場合は、精度を少し落とすために妥協してより低い定数をいつでも選択できます (小数点以下の終わりに向かっていくつかの桁が失われるため)。

また、Eric Postpischil によって提案された方法は理にかなっているようですが、私自身は試していません。より「pythonic」なように見える、より数学的な観点からの解決策を提供しました

于 2013-09-05T14:21:35.127 に答える
0

ここに1つの解決策があります:

def to_int(val):
    return int(repr(val).replace('.', '').split('e')[0])

使用法:

>>> to_int(1.28827339907e-08)
128827339907
于 2013-09-05T14:19:38.490 に答える