Python / Numpy-Gleitkomma-Textgenauigkeit
Angenommen, ich habe einige 32-Bit- und 64-Bit-Gleitkommawerte:
>>> 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)
Ich möchte diese Werte zu Text serialisieren, ohne an Genauigkeit zu verlieren (oder zumindest so gut wie nicht an Genauigkeit zu verlieren). Ich denke, der kanonische Weg, dies zu tun, ist mitrepr
:
>>> 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']
Aber ich möchte die Darstellung so kompakt wie möglich gestalten, um die Dateigröße zu minimieren. Es wäre also schön, wenn Werte wie 2.4 ohne die zusätzlichen Dezimalstellen serialisiert würden. Ja, ich weiß, das ist ihre tatsächliche Gleitkommadarstellung, aber%g
scheint sich darum kümmern zu können:
>>> ('%.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 '
Meine Frage ist: ist es sicher zu bedienen%g
auf diese Weise? Sind.7
und.16
die richtigen Werte, damit die Präzision nicht verloren geht?