Это ошибка в libstdc ++, который поставляется с GCC.Он не полностью соответствует C ++ 17 ( по состоянию на 9.1.0 в июне 2019 ).В уведомлении об авторских правах на версию <cmath>
, которую Ubuntu использует по умолчанию, говорится, что она последний раз обновлялась в 2016 году. В версии 9.1.0 есть раздел #if __cplusplus > 201402L
, но в нем не указаны идентификаторы, требуемые C ++ 17. Существует открытый отчет об ошибке.
Он никогда не объявляет expf
или logf
(ни cosf
, sinf
и т. Д.) В пространстве имен std::
, дажехотя C ++ 17 говорит, что должен. Стандарт C ++ 11 гласит: «Имена, которые определены как функции в C, должны быть определены как функции в стандартной библиотеке C ++».и «Каждое имя из библиотеки Standard C, объявленной с внешней связью, зарезервировано для реализации для использования в качестве имени со связью extern "C"
, как в namespace std
, так и в глобальном пространстве имен». Однако std::expf
et al.отсутствуют в таблице функций, предоставленных <cmath>
до P0175r1 в июне 2016 года. Это, очевидно, было упущением, но GCC всегда делал их доступными только в глобальном пространстве имен.
Библиотека libc ++ объявляет их, поэтому компиляция с clang++ -std=c++17 -stdlib=libc++
должна работать.Вы также можете #include <math.h>
использовать их в глобальном пространстве имен или использовать перегруженные exp()
, log()
и т. Д. Для аргументов с плавающей точкой.