9

32 ビットの数値と 64 ビットの数値があるとします。

>>> import numpy as np
>>> w = np.float32(2.4)
>>> x = np.float32(4.555555555555555)
>>> y = np.float64(2.4)
>>> z = np.float64(4.555555555555555)

私はそれらを印刷することができます%fが、余分な不要な小数があります:

>>> '%f %f %f %f' % (w, x, y, z)
'2.400000 4.555555 2.400000 4.555556'

使用できます%gが、デフォルトの精度が小さいようです:

>>> '%g %g %g %g' % (w, x, y, z)
'2.4 4.55556 2.4 4.55556'

.732 ビット値と.1564ビット値のようなものを使用する必要があると考えていました。

>>> '%.7g %.7g %.15g %.15g' % (w, x, y, z)
'2.4 4.555555 2.4 4.55555555555556'

これはかなりうまく機能しているように見えますが、小数点以下の桁数の精度も使い果たされています (例: 34567.375768)。

要約すると、浮動小数点値をテキストにシリアル化して、32 ビットおよび 64 ビット値の適切な精度を維持しながら不要なスペースを使用しない正しい方法は何ですか?

更新

出力がどうあるべきかの例:

number                float32     float64
5                     5           5
0.1                   0.1         0.1
2.4                   2.4         2.4
4.555555555555555     4.5555553   4.5555555555555554
12345678.92345678635  12345679.0  12345678.923456786

.7/.16 で得られるもの。これは実際には大丈夫に見えます:

>>> v32 = np.array([5, 0.1, 2.4, 4.555555555555555, 12345678.92345678635], dtype=np.float32)
>>> v64 = np.array([5, 0.1, 2.4, 4.555555555555555, 12345678.92345678635], dtype=np.float64)
>>> ('%.7g ' * len(v32)) % tuple(v32)
'5 0.1 2.4 4.555555 1.234568e+07 '
>>> ('%.16g ' * len(v64)) % tuple(v64)
'5 0.1 2.4 4.555555555555555 12345678.92345679 '
4

2 に答える 2

8

関数を使用しnp.finfoて、浮動小数点数に対応する精度を取得することができます

finfo32 = np.finfo(np.float32)
finfo64 = np.finfo(np.float64)

finfo32.resolution = 1e-6
finfo64.resolution = 1e-15

必要な小数の数、たとえば 6 がわかったので、 a を使用しrstrip("0")て不要な 0 を削除します。

print ("%.6f" % your_float).strip("0")

に傾いている場合は%g、次のような動的な形式を使用することをお勧めします。

>>> strf = lambda v: ("%%.%ig" % max(np.ceil(np.log10(v)), 7)) % v
>>> strf(123.456789)
'123.45679'
>>> strf(123456789.12345)
'123456789'
于 2012-09-18T21:18:04.267 に答える
2

あなたが何を達成しようとしているのか正確にはわかりません。ただし、これは役立つ場合があります。あなたが書いた

これはかなりうまく機能しているように見えますが、小数点以下の桁数の精度も使い果たされています (例: 34567.375768)。

%fの代わりに使用できますg。Pythonドキュメントから:

精度は、'f' および 'F' でフォーマットされた浮動小数点値の小数点の後に、または 'g' でフォーマットされた浮動小数点値の小数点の前後に表示される桁数を示す 10 進数です。 「グ」。

>>> z = np.float64(4.555555555555555)
>>> "%.3f" % z
'4.556'
>>> q = np.float64(2131234.555555555555555)
>>> "%.3f" % q
'2131234.556'
>>>
于 2012-09-18T21:27:23.790 に答える