2015-10-14 39 views
0

我認爲我正在過度使用這個probelem,但似乎無法解決這個問題。我正在閱讀文件(範圍(-1,1))中的小尾數浮點數,並且想將它們轉換爲32b定點。在python中將浮點數轉換爲固定點

如果我讀取的值爲0xA0C1943B,則相當於浮點數爲0.0045396835。如果我想將它表示爲fixed32_31,那將是0x00129834。

是否有一種簡單的方法在python中從0xA0C1943B獲取到0x00129834?

+0

你能澄清一下定點格式嗎?總共有多少比特,重點在哪裏?對於您給出的示例值,固定表示法是通過將浮點數按2 ** 28進行縮放然後四捨五入到最接近的整數來獲得的。 28從哪裏來? –

回答

0

我相信你想使用Python struct模塊:

import struct 
print struct.pack('<f', some_float) 

'<f'是代表小端浮動(4個字節)格式字符串。 如果這不起作用,你應該檢查適用於你的格式的文檔。

https://docs.python.org/2/library/struct.html

+0

嗯,這可能是我正在推翻東西的地方。我實際上正在使用你的命令讀取數值。我可以打印出該值並且看起來很好,但我認爲它可能仍然作爲「浮點」存儲在變量中。如果我想要去一個固定值,那是我認爲我需要進行轉換的地方.... – toozie21

0

你能想到的一個定點整數作爲分數的分子的,可能與施加偏置。在你的情況下,你想要-1.0映射到-INT_MAX1.0映射到INT_MAX(即2**31 - 1)。

一對夫婦代數曲軸的轉給我們:

fixed = int(flt * (INT_MAX/2)) 

注意,舍入是不完美的存在。如果您關心-1.0,0.0和/或1.0的確切行爲,則適用稍微複雜的公式。

+0

謝謝,但我認爲我們可能不在同一個頁面上。我可以在範圍內不包括-1和1(因此它純粹是一個分數),所以固定值的整數部分就是符號位。當我在浮點數0.00453968346119上運行算法時,我得到十六進制值0x8094c19e。這是32b,但是在固定的<32,31>表示中會是負值。 – toozie21

+0

@ toozie21嗯,所以你使用的是簽名表示。我會更新答案。 – Sneftel

+0

我完全錯過了你的變量中的無符號U,這可以幫助我提供幫助。儘管如此,我仍然覺得缺少某些東西。對於我的0.00453968346119浮點數,我得到一個0x4a60cf的十六進制數,對於-0.00708158267662的浮點數,它給出了-0x74064f的十六進制數。這兩個在MSb中都有1,這會使它們都是負數。我猜測,負號的增加正在做一些我需要考慮的事情。 – toozie21