Почему std::abs() не работает с числами с плавающей запятой?

Результатом std::abs(0.5f) является 0, потому что нет перегрузки для чисел с плавающей запятой. Почему? Я использую Г++.


person Gordem    schedule 14.08.2020    source источник
comment
Был бы полезен минимально воспроизводимый пример. Мне не удалось воспроизвести неправильное поведение, с которым вы столкнулись.   -  person Eljay    schedule 14.08.2020
comment
@Eljay Это моя ошибка, я говорил о abs(), но написал std::abs(), потому что думал, что это одно и то же.   -  person Gordem    schedule 14.08.2020
comment
Ах, да, я уже совершал эту ошибку. Это одна из причин, по которой я создал свои мертвые файлы, которые являются поддельными заголовочными файлами C++, которые определяют только символы, требуемые стандартом, и ничего больше, и не включают никаких других заголовочных файлов. (Они компилируются, но не связываются, и они фактически нефункциональны для целей, отличных от компиляции и проверки работоспособности и помощи при включении того, что вы используете.)   -  person Eljay    schedule 14.08.2020


Ответы (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
comment
И есть две разные функции - abs и std::abs? И у них разные перегрузки? - person Gordem; 14.08.2020
comment
@Gordem: см. stackoverflow.com/questions/21392627/. Это абсолютный беспорядок. У меня даже есть правило в моем магазине: #include <cmath> и всегда использовать только std::<something or other>. - person Bathsheba; 14.08.2020
comment
Т.е. этот бардак касается не только abs()? - person Gordem; 14.08.2020
comment
@Gordem Есть и другие несвязанные беспорядок, я Боюсь. - person Bob__; 14.08.2020