float を使用して試してみることを提案します。それが失敗した場合 (範囲オーバーフローが原因で)、 double バージョンを使用します。
try:
binary = struct.pack('>f', value)
except OverflowError:
binary = struct.pack('>d', value)
範囲は、あなたの質問が完全に理にかなっている唯一の側面です。
精度に関して言えば、あなたが言うように、Pythonは常にdouble を内部で使用し、単純な3.3
is でさえも float としてパックおよびアンパックされるため、質問は意味がありません3.299999952316284
。
struct.unpack('>f', struct.pack('>f', 3.3))
(3.299999952316284,)
したがって、事実上、 double を float として表現することはできません。(通常、int でないか、元々 float から出てくるものはありません。)
ただし、数値のパック/アンパック バージョンが元の数値と等しいかどうかを確認し、等しい場合は float バージョンを使用できます。
try:
binary = struct.pack('>f', value)
if struct.unpack('>f', binary)[0] != value:
binary = struct.pack('>d', value)
except OverflowError:
binary = struct.pack('>d', value)