Результатом std::abs(0.5f)
является 0
, потому что нет перегрузки для чисел с плавающей запятой. Почему? Я использую Г++.
Почему std::abs() не работает с числами с плавающей запятой?
Ответы (1)
Вы должны быть очень осторожны при использовании перегрузок std::abs
, так как некоторые реализации стандартных библиотек разбросаны по многим файлам, некоторые из которых неявно включаются в другие, например <iostream>
.
Если вы #include <cmath>
или #include <cstdlib>
(второй из C++17) до своего std::abs(0.5f)
, то будет доступна перегрузка float
. Если это не так, то в реализации вашего компилятора/стандартной библиотеки есть ошибка (маловероятно в случае g++).
Ссылка: https://en.cppreference.com/w/cpp/numeric/math/fabs
person
Bathsheba
schedule
14.08.2020
И есть две разные функции -
abs
и std::abs
? И у них разные перегрузки?
- person Gordem; 14.08.2020
@Gordem: см. stackoverflow.com/questions/21392627/. Это абсолютный беспорядок. У меня даже есть правило в моем магазине:
#include <cmath>
и всегда использовать только std::<something or other>
.
- person Bathsheba; 14.08.2020
Т.е. этот бардак касается не только
abs()
?
- person Gordem; 14.08.2020
@Gordem Есть и другие несвязанные беспорядок, я Боюсь.
- person Bob__; 14.08.2020
abs()
, но написалstd::abs()
, потому что думал, что это одно и то же. - person Gordem   schedule 14.08.2020