[英]specify floating point constant value bitwise in c/c++
這就是我想要做的:
//Let Bin2Float be a magic macro that packages specified bit pattern into float as a constant
const float MyInf = Bin2Float(01111111,10000000,00000000,00000000);
我們都知道如何將位模式打包為整數(“二進制常數” hack),並且該魔術原型宏的輸入與對應的32位整數二進制常數宏的輸入相同。 將這些位打包為整數常量不是問題。 但是,在使用指針和聯合修剪之后,我意識到將整數類型化為float會導致很多問題(有些在MSVC方面,有些在gcc方面)。 因此,這是要求列表:
首先,很少需要以這種方式指定浮點常量。 對於無窮大,請使用INFINITY
。 對於NaN,請使用NAN
或nanf(string)
。 這些在<math.h>
中定義。 編譯器可能會將INFINITY
和NAN
編譯為某種匯編語言常量(可以在只讀數據部分中,可以在指令的直接字段中形成,等等)。 但是,除非C編譯器實現者保證,否則不能保證這一點。 nanf
可能會導致函數調用,盡管如果字符串是常量,則編譯器可以自由地將其優化為常量。 對於有限數,請使用十六進制浮點常量(例如,“ 0x3.4p5”)。 在最后一位,您不能完全指定這種方式的唯一IEEE 754浮點對象是NaN。 C標准沒有完全指定nan
和nanf
函數,因此除非實現提供,否則您不能完全控制有效位。
我不熟悉您提到的二進制常量黑客。 假設您有一個提供unsigned int
的宏Bin2Unsigned
,那么您可以使用以下代碼:
const float MyInf = (union { unsigned u; float f; }) { Bin2Unsigned(…) } .f;
也就是說,不管您信不信,您都可以使用標准C語法和語義,直到將位重新解釋為浮點數為止。 顯然,位的解釋取決於實現。 但是,復合文字和通過聯合的重新解釋由C標准指定。
我使用gcc版本4.2.1(Apple Inc.內部版本5666)進行了測試,針對x86_64,使用-O3和其他默認選項,並且生成的匯編代碼使用了常量.long 2139095040
。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.