簡體   English   中英

在python中序列化float32值並在C ++中反序列化它們

[英]serializing float32 values in python and deserializing them in C++

我在Python腳本中有一堆32位浮點值,需要將它們存儲到光盤中並將它們加載到C ++工具中。 目前,它們是以人類可讀的格式編寫的。 但是,對於我的(數字)應用程序,精度損失太大。

我如何最好地存儲(和加載)它們而不會丟失?

您可以在python中使用float.hex來獲取數字的十六進制表示,然后使用C ++中的std::hexfloat流操縱器進行讀取。

當前,它們以默認的人類可讀格式編寫。

這就是原因。 如果需要“%.9e”或“%.9g”,它將以足夠的精度打印float32值以進行恢復(前提是轉換中沒有錯誤)。

同樣,對於Python3, repr()給出了一個最短的十進制表示形式,用於將值轉換回相同的二進制值。 但這對於Python2並非如此。

回答評論中的問題,

如果我正確理解,則以2為底的浮點表示形式是有限的,但以10為底的表示形式是無限的,

不,它是有限的,但是更長。 例如(Python3)

>>> math.pi
3.141592653589793
>>> '%.60g' % math.pi
'3.141592653589793115997963468544185161590576171875'

但是,最后一位不重要的所有數字都沒有關系(記住Python浮點數為double):

>>> float('3.1415926535897931')
3.141592653589793
>>> float('3.1415926535897932')
3.141592653589793
>>> float('3.1415926535897933')
3.141592653589793
>>> float('3.1415926535897933') - float('3.1415926535897931')
0.0

最后,如果您的代碼中有十六進制,則十六進制更可靠。 我希望您的Python和C ++版本足夠新鮮以支持%a(stdio),float.hex(Python)。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM