繁体   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