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

标签 c++ floating-point

我的问题源于试图找到一种编译时 (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/

相关文章:

c++ - 这不是我要求的输出

c++ - QFileDialog : using getOpenFileName allow for non-existent files

mysql - 在 MySQL 中使用 float 类型更新

matlab - 在matlab中设置图例符号的精度

c++ - 使用 std::hexfloat 读写

c++ - 为什么 std::abs(9484282305798401ull) = 9484282305798400?

c++ - CMake:它如何找到Boost并且找不到Boost?

c++ - 如何在 C++ 中维护映射指针 vector

C++ 找不到在继承自当前模板类的模板基类中定义的类型

java - Java 中非常大的 float 的舍入