获取浮点数的有符号位

Zac*_*ere -3 c

我正在尝试找到一种方法来检查浮点数是否为负而不分支。

float a = -0.5;
int getSignOfa= *(int*)&a >> 31; //type-pun to int and get signed bit;
Run Code Online (Sandbox Code Playgroud)

这是检查浮点数有符号位的安全方法吗?

小智 6

从 C99 开始,您可以使用signbit(x)中的定义math.h来获取浮点数的符号位。x如果为正(未设置符号位),则返回 0 ;如果为负(设置符号位),则返回非零。

  • [它不是 C++ 中的宏](https://en.cppreference.com/w/cpp/numeric/math/signbit)。@Zachwuzhere 你为什么关心这个?基准测试,如果它真的很慢,那么就优化它,否则它就是过早的优化。遵循标准的方式往往是更好的解决方案 (2认同)
  • 我只是要补充一点,`bool s = a < 0.0f` 不会分支。这是一个比较,可能只是某种 fsub 指令,然后屏蔽并移位浮点状态寄存器。NAN 和 Infinity 又如何呢? (2认同)