当指数改变时未明确引用“pow”?

时间:2015-05-20 05:15:38

标签: c

pow()我遇到了一些奇怪的问题。如果我做

return 44330*(1 - pow((float) pressure / PRESSURE0, 1/5.255F));

其中pressureint32_tPRESSURE0是常量,我得到一个错误,说明未定义对`pow'的引用。但是,如果我这样做

return 44330*(1 - pow((float) pressure / PRESSURE0, 1.0F));

没关系。我做错了吗?

由于

1 个答案:

答案 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

另见