32 ビットと 64 ビットの浮動小数点値があるとします。
>>> import numpy as np
>>> 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)
これらの値を、精度を失うことなく (または、少なくとも精度を失わないように) テキストにシリアル化したいと考えています。これを行う標準的な方法は次のとおりだと思いますrepr
:
>>> map(repr, v32)
['5.0', '0.1', '2.4000001', '4.5555553', '12345679.0']
>>> map(repr, v64)
['5.0', '0.10000000000000001', '2.3999999999999999', '4.5555555555555554',
'12345678.923456786']
しかし、ファイルサイズを最小限に抑えるために表現をできるだけコンパクトにしたいので、2.4 のような値が余分な小数なしでシリアル化されるといいでしょう。はい、それが実際の浮動小数点表現であることは知ってい%g
ますが、これを処理できるようです:
>>> ('%.7g ' * len(v32)) % tuple(v32)
'5 0.1 2.4 4.555555 1.234568e+07 '
>>> ('%.16g ' * len(v32)) % tuple(v64)
'5 0.1 2.4 4.555555555555555 12345678.92345679 '
私の質問は%g
、このように使用しても安全ですか? 精度が失われないように、正しい値はあります.7
か?.16