我的问题源于试图找到一种编译时 (constexpr) 方法来获取 float 的指数(原因不是主题)。 ilog/ilogb 是最好的运行时方式(除了 bit fiddling 或 casts/unions)。查看 Visual Studio 实现中的反汇编并没有帮助,甚至不知道他们一开始在做什么。我希望有一个(某种形式的)公式来获取 float 的指数或其他东西来指向正确的方向。
我要实现的目标:
constexpr int exponent = ilogb(123.45f);
最佳答案
不,编译时对数可移植不存在。
但是,一些编译器可以在编译时计算它(使用 as-if rule )。 GCC 会这样做,也许是因为通过间接使用 __builtin_ilogb
.
不要忘记一个更简单的方法:可以在构建时生成一个 C++ 文件(你将配置你的 build automation 工具,例如 make
或 ninja
来做到这一点) .因此,您可以编写一些脚本(例如 Python、awk 或其他一些脚本语言),甚至您自己的其他 C++ 程序,生成该常量。
顺便说一句,GCC 7.3 on Linux/x86-64,如下文件jaran.cc
#include <cmath>
int f(void) {
constexpr int e = ilogb(123.45f);
return e;
}
被编译成常量函数(如 g++ -S -O -fverbose-asm
所示)
.type _Z1fv, @function
_Z1fv:
.LFB253:
.cfi_startproc
# /tmp/jarann.cc:4: }
movl $6, %eax #,
ret
.cfi_endproc
生成 C++ 代码是一种“可移植”的方法,但当然需要为此配置您的构建。
关于c++ - 是否存在编译时 logb/ilogb?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49468101/