pow()
我遇到了一些奇怪的问题。如果我做
return 44330*(1 - pow((float) pressure / PRESSURE0, 1/5.255F));
其中pressure
是int32_t
而PRESSURE0
是常量,我得到一个错误,说明未定义对`pow'的引用。但是,如果我这样做
return 44330*(1 - pow((float) pressure / PRESSURE0, 1.0F));
没关系。我做错了吗?
由于
答案 0 :(得分:7)
通常,为了使用sqrt()
,pow()
等数学函数,您需要链接数学库libm
(在gcc上,使用-lm
选项)。
但是,编译器可以自由地应用优化,尤其是当函数的参数是常量时。考虑以下两个简化函数:
double f1(int pressure) {
return pow((float) pressure / PRESSURE0, 1/5.255F);
}
double f2(int pressure) {
return pow((float) pressure / PRESSURE0, 1.0F);
}
这将编译成i386代码,如下所示(删除了不必要的汇编程序指令):
f1:
pushl %ebp
movl %esp, %ebp
subl $24, %esp
; (float) pressure / PRESSURE0
fildl 8(%ebp)
fldl .LC0
fdivrp %st, %st(1)
; pow()
fldl .LC1
fstpl 8(%esp)
fstpl (%esp)
call pow
leave
ret
f2:
pushl %ebp
movl %esp, %ebp
; (float) pressure / PRESSURE0
fildl 8(%ebp)
fldl .LC0
fdivrp %st, %st(1)
; NO call to pow(x, 1.0), since it would not change the value of x
popl %ebp
ret
在f2()
中,由于pow()
的指数为1.0
,因此无需调用pow()
函数 - 编译器会检测到此函数并删除函数调用。
因此,如果您的代码中没有其他任何数学函数调用,则无需在该特定情况下链接libm
。
另见