簡體   English   中英

在c / c ++中按位指定浮點常量值

[英]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方面)。 因此,這是要求列表:

  1. 必須在gcc(C模式),g ++,MSVC下編譯(即使我必須使用條件編譯來做兩個單獨的版本)
  2. 必須針對C和C ++進行編譯
  3. 在產生的匯編代碼中,必須編譯成硬編碼的常量,不能動態計算
  4. 一定不能使用memcpy
  5. 不得使用靜態或全局變量
  6. 不得使用基於指針的類型調整以避免嚴格的別名問題

首先,很少需要以這種方式指定浮點常量。 對於無窮大,請使用INFINITY 對於NaN,請使用NANnanf(string) 這些在<math.h>中定義。 編譯器可能會將INFINITYNAN編譯為某種匯編語言常量(可以在只讀數據部分中,可以在指令的直接字段中形成,等等)。 但是,除非C編譯器實現者保證,否則不能保證這一點。 nanf可能會導致函數調用,盡管如果字符串是常量,則編譯器可以自由地將其優化為常量。 對於有限數,請使用十六進制浮點常量(例如,“ 0x3.4p5”)。 在最后一位,您不能完全指定這種方式的唯一IEEE 754浮點對象是NaN。 C標准沒有完全指定nannanf函數,因此除非實現提供,否則您不能完全控制有效位。

我不熟悉您提到的二進制常量黑客。 假設您有一個提供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.

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