sqrt() pow() fabs() не работает

я пытаюсь скомпилировать свою программу, в которой я использую такие функции, как sqrt pow и fabs. У меня есть math.h, но по какой-то причине я получаю такие ошибки, как:

    error C2668: 'fabs' : ambiguous call to overloaded function

то же самое для остальных функций, которые я включил:

    #include "stdafx.h"
    #include "math.h"

Я пытался включить, но все те же ошибки. Кто-нибудь знает, почему их не узнают? мой файл .cpp, а не .c, но это проект MFC.

Спасибо


person karthik    schedule 12.04.2011    source источник
comment
Используете ли вы два разных вызова для одной и той же функции?   -  person Sai Kalyan Kumar Akshinthala    schedule 12.04.2011
comment
Удален тег C, так как он не связан с языком C.   -  person Stephen Canon    schedule 12.04.2011
comment
Вы должны включить фактический код, вызвавший ошибку. Только с описанием ошибки вы получите сообщение о том, что кто-то говорит вам, что неоднозначный вызов означает, что компилятор не может принять решение и решить, какая из двух перегрузок лучше...   -  person David Rodríguez - dribeas    schedule 12.04.2011
comment
Еще один вопрос многих, где либо karthik, либо user692270 принимает ответ @karthik. Прекратите это фальшивое выращивание голосов.   -  person Sebastian Mach    schedule 27.09.2011
comment
Добавлен тег C++03, поскольку он был исправлен в C++11. Теперь он перегружен для всех арифметических типов. Обратите внимание, что использование fabs (абс с плавающей запятой) для целых чисел — плохая идея. Вместо этого используйте std::abs.   -  person MSalters    schedule 18.03.2016


Ответы (1)


Это потому, что эти функции перегружены для нескольких типов: float, double и long double. Таким образом, если вы передаете целое число, компилятор не выбирает, какое из них выбрать. Простое решение - просто передать двойное значение (или умножить то, что вы передаете на 1,0), это должно решить проблему.

      int value = rand();
      int result1 = (int)fabs(value*1.0); 
      printf("%d, %d\n", result1, result1);

иначе:

     int value = rand();
     int result1 = (int)fabs((double)value); 
     printf("%d, %d\n", result1, result1);
person karthik    schedule 12.04.2011
comment
Прибавлять 0,0 лучше, чем умножать на 1,0. - person Mark Ransom; 12.04.2011
comment
static_cast намного лучше, чем умножение на 1.0, потому что это делает код понятным. - person Kirill V. Lyadvinsky; 12.04.2011
comment
@Mark: В любом случае компилятор фактически не будет выполнять никаких арифметических операций. Но @Kirill совершенно прав. - person Greg Hewgill; 12.04.2011
comment
@kirill: в обоих случаях компилятор делает одно и то же - person karthik; 12.04.2011
comment
@Kirill: я говорю, что оптимизация компилятора одинакова для обоих случаев. Я думаю, вы неправильно поняли мой комментарий. - person karthik; 12.04.2011
comment
Или вы можете использовать std::abs, у которого есть перегрузка для int. - person Bo Persson; 12.04.2011
comment
Еще один вопрос многих, где либо karthik, либо user692270 принимает ответ @karthik. Прекратите это фальшивое выращивание голосов. - person Sebastian Mach; 27.09.2011
comment
Использование функции fabs в функции rand? Странный! abs преобразует отрицательное значение в положительное, но rand всегда дает >=0 - person Ajay; 18.03.2016