Неопределенная ссылка на " pow " при изменении показателя?

у меня возникли некоторые странные проблемы с 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));

все в порядке. Я делаю что-то не так?

спасибо

1 ответов


как правило, для использования математических функций, таких как sqrt(), pow() etc. вам нужно связаться с математической библиотекой,libm (на gcc используйте ).

однако компилятор может свободно применять оптимизации, особенно если аргументы для функций являются константами. Рассмотрим следующие две упрощенные функции:

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    , %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() is 1.0, нет необходимости называть pow() function - компилятор обнаруживает это и удаляет вызов функции. Следовательно, если в вашем коде нет других вызовов каких-либо математических функций, нет необходимости связываться с libm в этом конкретном случае.

см. также