Precisão de texto de ponto flutuante em Python / numpy

Digamos que eu tenha alguns valores de ponto flutuante de 32 bits e 64 bits:

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

Eu quero serializar esses valores para texto sem perder precisão (ou pelo menos muito perto de não perder precisão). Eu acho que a maneira canônica de fazer isso é comrepr:

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

Mas eu quero tornar a representação o mais compacta possível para minimizar o tamanho do arquivo, então seria bom se valores como o 2.4 fossem serializados sem os decimais extras. Sim, eu sei que é a representação real do ponto flutuante, mas%g parece ser capaz de cuidar disso:

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

Minha pergunta é: é seguro usar%g nesse caminho? Está.7 e.16 os valores corretos para que a precisão não seja perdida?

questionAnswers(3)

yourAnswerToTheQuestion