2017-03-03 11 views
1

如何查找floatdouble類型的內存格式?查找浮點類型的內存格式

我是指符號,指數和分數的位數。

+2

格式爲'float'和'double'是*通常* IEEE-754但這不能保證。你可以檢查它是否使用['std :: numeric_limits :: is_iec559'](http://en.cppreference.com/w/cpp/types/numeric_limits/is_iec559)。 'std :: numeric_limits'將允許你檢查你的類型的許多屬性,但是這不包括確切的內存佈局。 –

+1

這應該由您的實施記錄。 – NathanOliver

+1

您是否嘗試過使用Google浮點內存格式?這些類型直接由CPU支持並遵循特定標準。 Google的第一個結果是[雙精度浮點格式](https://en.wikipedia.org/wiki/Double-precision_floating-point_format)。如果CPU不符合IEEE 754標準,則應檢查CPU的文檔。 –

回答

1

要保存浮點數到磁盤的一個跨平臺的方式,查找我的GitHub項目

https://github.com/MalcolmMcLean/ieee754

我也把功能便攜讀取二進制整數,因爲它是稍微有點複雜比一見還難。

如果你想測試的內存格式,您需要創建具有一定的戰略價值浮動,然後查詢位模式。零應該都是零位和特殊情況,除非你在怪異和美妙的硬件上。 1和-1應該相差一位,這是你的符號位。 2和1應該在指數上有所不同,兩者的測試能力應該告訴你指數位和它們什麼時候用完。爲速度測試兩個冪的權力。

然後,可以通過存儲1關閉的2的冪得到的尾數,e.g 3,7等。

通過探測它,你可以建立一個內存模式,但它幾乎總是IEEE 754

+0

代碼的許可證是什麼? –

+0

免費用於任何用途。這樣的數學例程不能申請專利。 –

2

我的意思是符號,指數和分數的位數。

您可以使用std::numeric_limits<T>::digits獲取尾數位std::numeric_limits<T>::is_signed以獲取符號位。

你和​​扣除它們的和猜測的指數位,但如果某類型的填充,這可能是不正確的。例如,這是典型的long double

查找float類型的存儲格式

當然,不僅是物質的位數,而且順序。這些功能對你沒有幫助。他們也假設std::numeric_limits<T>::radix == 2

對於確切的格式,您將不得不查閱cpu架構的手冊。


我想保存浮點數到硬盤,不知道是否有使文件跨平臺的好方法。

最典型的解決方案是保存到磁盤時,浮點轉換爲文本表示:0x1.8p+0。它不是最高效的,但它是可移植的(但是,您必須確定將使用什麼字符編碼文件,如果這不是本機系統,則需要進行轉換)。