gpt4 book ai didi

c - 更改指数时未定义对 `pow' 的引用?

转载 作者:太空狗 更新时间:2023-10-29 17:22:03 25 4
gpt4 key购买 nike

我在使用 pow() 时遇到了一些奇怪的问题。如果我这样做

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

其中 pressure 是一个 int32_tPRESSURE0 是一个常量,我收到一条错误消息,指出对 `pow' 的 undefined reference 。但是,如果我这样做

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

没关系。我做错了什么吗?

谢谢

最佳答案

通常,为了使用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

另见

关于c - 更改指数时未定义对 `pow' 的引用?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30340787/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com