[在使用pow(x,p)
的代码中(大部分情况为p = 2.0
),我发现,当p = 2.0
时,我的代码执行速度明显快于p = 2.000000001
时。我得出的结论是,在我的编译器(gcc 4.8.5)上,pow
的实现检测到它何时是正方形。
根据此观察,我得出结论,当我知道p为2时,不需要特定的实现。但是我的代码必须是跨平台的,那么我的问题是:
pow
在大多数c ++ 03编译器中的指数为整数时是否已优化?
添加到我的评论中。只要指数是一个连续的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