#c
#c
Вопрос:
Я искал ответы, но не могу найти ни одного, который соответствовал бы моему очень простому случаю.
С какой стати abs работает только с целыми числами? Я не могу выполнить эту операцию?
// Example program
#include <iostream>
using namespace std;
int main()
{
float someVariable = abs(-4.22);
cout << someVariable;
}
Обратите внимание, я использую http://cpp.sh чтобы проверить это.
Ответ №1:
abs имеет разные реализации в зависимости от того, как он включен.
Чтобы получить плавающую точку, вам нужно
#include <cmath>
Результирующая программа
#include <iostream>
#include <cmath>
using namespace std;
int main()
{
float someVariable = abs(-4.22);
cout << someVariable;
}
Ссылка cppreference abs(float)
Ответ №2:
Вам нужно включить математическую библиотеку, например, так:
#include <cmath>
Комментарии:
1. Ну ладно, я должен был
#include <math.h>
, чтобы это сработало. Спасибо за вашу помощь. Но я почти уверен, что abs () можно использовать для действительных чисел, нет (я читаю, что в C нет, но C да)!?2. Да, исправьте @aName, смотрите мое обновление, кстати, вы задали хороший вопрос, 1!
3.Я не думаю, что вам нужно,
fabs
если вы включитеmath.h
(согласно этому, оба<cxxx>
и<xxx.h>
должны объявлять одни и те же имена, просто в разных namespaes). Hereabs
frommath.h
, похоже, отлично работает с реальными числами.4. Я тоже так подумал @HolyBlackCat, но, пожалуйста, взгляните на мое первое живое демо. Там я включил
<math.h>
. Изменениеfabs()
наabs()
приводит к ошибке!5. Любопытно, что в моей рабочей среде простое включение
math.h
иabs(-4.22)
работало просто отлично!!
Ответ №3:
std::abs
принимает любой из:
Однако до C 17, если вы не #include <cmath>
тогда, были доступны только целочисленные перегрузки (первые три из перечисленных). Вы передаете float
, который одинаково хорошо преобразуется в любые три из них, поэтому компилятор не может определить, какой из них вы хотели.
Если вы хотели перегрузить целое число, вы бы использовали приведение к int
, long
или long long
в зависимости от обстоятельств.
Но вы этого не делаете: вы хотите вызвать float
перегрузку, поэтому перенесите ее в область видимости с помощью #include <cmath>
, и тогда она должна быть выбрана автоматически, потому что вы передаете float
.
На самом деле, вам просто повезло, что доступны даже целочисленные перегрузки, потому что вы никогда не #include
изменяли <cstdlib>
; <iostream>
должно быть, так случилось, что ваш набор инструментов сделал это за вас. Всегда включайте соответствующие заголовки в соответствии с документацией.
Ответ №4:
abs() объявлен в заголовке cmath. Итак, если вы хотите использовать abs(), вам нужно включить cmath в свой код следующим образом :
#include <iostream>
#include <cmath>
using namespace std;
int main()
{
float someVariable = abs(-4.22);
cout << someVariable;
}
Примечание: Начиная с C 11 и более версий, мы можем использовать abs () следующим образом :
double abs (double x);
float abs (float x);
long double abs (long double x);
double abs (T x); // additional overloads for integral types