首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >为什么编译器不将浮点*2优化为指数增量?

为什么编译器不将浮点*2优化为指数增量?
EN

Stack Overflow用户
提问于 2012-10-17 00:23:05
回答 4查看 4.2K关注 0票数 46

我经常注意到gcc在可执行文件中将乘法转换为移位。当将intfloat相乘时,可能会发生类似的情况。例如,2 * f可以简单地将f的指数递增1,从而节省一些周期。编译器,也许如果有人要求他们这样做(例如,通过-ffast-math),通常会这样做吗?

编译器通常是否足够智能来完成这项工作,或者我是否需要使用scalb*()ldexp()/frexp()函数族自己完成这项工作?

EN

回答 4

Stack Overflow用户

发布于 2012-10-17 14:14:41

实际上,这就是在硬件中发生的事情。

2也作为浮点数传递给浮点数,尾数为1.0,指数为2^1。对于乘法,指数相加,尾数相乘。

假设有专门的硬件来处理复杂的情况(乘以不是2的幂的值),并且特殊情况的处理并不比使用专用硬件差,因此没有必要使用额外的电路和指令。

票数 3
EN

Stack Overflow用户

发布于 2020-09-03 15:18:56

这是我在GCC 10中看到的一个实际的编译器优化:

代码语言:javascript
复制
x = 2.0 * hi * lo;

生成以下代码:

代码语言:javascript
复制
mulsd   %xmm1, %xmm0      # x = hi * lo;
addsd   %xmm0, %xmm0      # x += x;
票数 1
EN

Stack Overflow用户

发布于 2012-10-17 10:52:47

对于嵌入式系统编译器来说,具有特殊的2的幂的缩放伪操作可能是有用的,该伪操作可以由代码生成器以对所讨论的机器最优的任何方式进行翻译,因为在一些专注于指数的嵌入式处理器上可能比进行完全的2次方乘法快一个数量级,但是在乘法最慢的嵌入式微处理器上,编译器可能可以通过让浮点乘法例程在运行时检查其参数以跳过尾数中为零的部分来实现更大的性能提升。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/12919184

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档