当指数是整数时pow(x,p)更快吗?

问题描述 投票:0回答:1

[在使用pow(x,p)的代码中(大部分情况为p = 2.0),我发现,当p = 2.0时,我的代码执行速度明显快于p = 2.000000001时。我得出的结论是,在我的编译器(gcc 4.8.5)上,pow的实现检测到它何时是正方形。

根据此观察,我得出结论,当我知道p为2时,不需要特定的实现。但是我的代码必须是跨平台的,那么我的问题是:

pow在大多​​数c ++ 03编译器中的指数为整数时是否已优化?

c++ c++03
1个回答
0
投票

添加到我的评论中。只要指数是一个连续的int小于或等于MAXINT,就可以得到。

#include <cmath>

double pow(double a)
{
    return std::pow(a, (int)2147483647);
}

生成

pow(double):
        movapd  xmm4, xmm0
        mulsd   xmm4, xmm0
        movapd  xmm5, xmm4
        mulsd   xmm5, xmm4
        mulsd   xmm4, xmm0
        movapd  xmm6, xmm5
        mulsd   xmm4, xmm5
        mulsd   xmm6, xmm5
        movapd  xmm3, xmm6
        mulsd   xmm3, xmm6
        mulsd   xmm3, xmm0
        movapd  xmm0, xmm4
        movapd  xmm2, xmm3
        movapd  xmm1, xmm3
        mulsd   xmm2, xmm6
        mulsd   xmm1, xmm3
        mulsd   xmm2, xmm1
        mulsd   xmm1, xmm1
        mulsd   xmm1, xmm2
        mulsd   xmm1, xmm1
        mulsd   xmm1, xmm1
        mulsd   xmm1, xmm1
        mulsd   xmm1, xmm4
        mulsd   xmm1, xmm1
        mulsd   xmm1, xmm1
        mulsd   xmm1, xmm1
        mulsd   xmm1, xmm4
        mulsd   xmm1, xmm1
        mulsd   xmm1, xmm1
        mulsd   xmm1, xmm1
        mulsd   xmm1, xmm4
        mulsd   xmm1, xmm1
        mulsd   xmm1, xmm1
        mulsd   xmm1, xmm1
        mulsd   xmm1, xmm4
        mulsd   xmm1, xmm1
        mulsd   xmm1, xmm1
        mulsd   xmm1, xmm1
        mulsd   xmm1, xmm4
        mulsd   xmm1, xmm1
        mulsd   xmm1, xmm1
        mulsd   xmm1, xmm1
        mulsd   xmm1, xmm4
        mulsd   xmm1, xmm1
        mulsd   xmm1, xmm1
        mulsd   xmm1, xmm1
        mulsd   xmm1, xmm4
        mulsd   xmm1, xmm1
        mulsd   xmm1, xmm1
        mulsd   xmm1, xmm1
        mulsd   xmm0, xmm1
        ret

但是您必须小心使用int文字

#include <cmath>

double pow(double a)
{
    return std::pow(a, (unsigned int) 2147483647);
}

生成

pow(double):
        movsd   xmm1, QWORD PTR .LC0[rip]
        jmp     pow
.LC0:
        .long   4290772992
        .long   1105199103
© www.soinside.com 2019 - 2024. All rights reserved.