gpt4 book ai didi

c++ - 是否存在编译时 logb/ilogb?

转载 作者:太空宇宙 更新时间:2023-11-04 12:50:02 24 4
gpt4 key购买 nike

我的问题源于试图找到一种编译时 (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 工具,例如 makeninja 来做到这一点) .因此,您可以编写一些脚本(例如 Pythonawk 或其他一些脚本语言),甚至您自己的其他 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/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com