Precyzyjna precyzja tekstu zmiennoprzecinkowego Python / numpy

Powiedzmy, że mam jakieś 32-bitowe i 64-bitowe wartości zmiennoprzecinkowe:

>>> 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)

Chcę serializować te wartości do tekstu bez utraty precyzji (lub przynajmniej bardzo blisko utraty precyzji). Myślę, że kanonicznym sposobem na to jestrepr:

>>> 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']

Ale chcę, aby reprezentacja była jak najmniejsza, aby zminimalizować rozmiar pliku, więc byłoby miło, gdyby wartości takie jak 2.4 zostały serializowane bez dodatkowych miejsc dziesiętnych. Tak, wiem, że to ich rzeczywista reprezentacja zmiennoprzecinkowa, ale%g wydaje się być w stanie zająć się tym:

>>> ('%.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 '

Moje pytanie brzmi: czy można bezpiecznie używać%g w ten sposób? Są.7 i.16 poprawne wartości, aby nie stracić precyzji?

questionAnswers(3)

yourAnswerToTheQuestion