GCC 编译时浮点优化

发布于 2025-01-04 22:15:40 字数 397 浏览 0 评论 0原文

我正在为 AVR 平台进行开发,我有一个问题。我不希望浮点库与我的代码链接,但我喜欢具有 0.0 ... 1.0 范围内的模拟值而不是 0...255 和 0...1023 的概念,具体取决于甚至我是否使用端口作为输入或输出。

所以我决定将输入/输出函数的参数分别乘以 1023.0 和 255.0。现在,我的问题是:如果我像这样实现除法:

#define analog_out(port, bit) _analog_out(port, ((uint8_t)((bit) * 255.0)))

GCC(打开 -O3 标志)是否会优化编译时浮点乘法(在编译时已知并转换为整数类型)为整数运算? (我知道,当将这些宏与非常量参数一起使用时,优化是不可能的;我只是想知道在其他情况下是否会完成优化。)

I'm developing for the AVR platform and I have a question. I don't want the floating point library to be linked with my code, but I like the concept of having analog values of the range 0.0 ... 1.0 instead of 0...255 and 0...1023, depending on even whether I'm using a port as an input or as an output.

So I decided to multiply the input/output functions' arguments by 1023.0 and 255.0, respecively. Now, my question is: if I implement the division like this:

#define analog_out(port, bit) _analog_out(port, ((uint8_t)((bit) * 255.0)))

will GCC (with the -O3 flag turned on) optimize the compile-time floating point multiplications, known at compile time and cast to an integral type, into integer operations? (I know that when using these macros with non-constant arguments, the optimization is not possible; I just want to know if it will be done in the other case.)

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(2

夏末的微笑 2025-01-11 22:15:40

如果您将 bit 作为数字文字提供,GCC 应该始终进行常量折叠。
如果你希望编译器强制执行常量,你可以这样做:

#define force_const(x) (__builtin_choose_expr(__builtin_constant_p(x), (x), (void)0))
#define analog_out(port, bit) _analog_out(port, force_const((uint8_t)((bit) * 255.0)))

GCC should always do constant folding if you supply bit as a numeric literal.
If you want the compiler enforce the constness, you could get away with something like this:

#define force_const(x) (__builtin_choose_expr(__builtin_constant_p(x), (x), (void)0))
#define analog_out(port, bit) _analog_out(port, force_const((uint8_t)((bit) * 255.0)))
望笑 2025-01-11 22:15:40

一般来说,我认为 gcc -O2 会在编译时对常量进行所有算术运算。
它不会将其转换为整数算术 - 只是转换为常量整数。

依赖它可能很危险,特别是当其他人维护代码时。将非常量参数传递给宏会导致错误的情况是不好的。

Generally, I think gcc -O2 will do all arithmetic on constants at compile time.
It won't convert it to integer arithmetic - just to a constant integer.

It may be dangerous to rely on, especially if other people maintain the code. A situation where passing a non-constant parameter to a macro results in an error isn't good.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文