Заимствует ли cmath его реализацию из math.h - PullRequest
0 голосов
/ 13 февраля 2020

Я хочу переключиться с math.h на cmath для встроенного приложения. Я немного скептически отношусь к переключению с math.h на cmath lib, так как эта встроенная система очень чувствительна к изменениям точности вычислений. Итак, я хотел бы знать, заимствует ли cmath свои реализации и оборачивает ли он совместимый с c ++ код? Или у С ++ есть своя собственная реализация, которая отличается от

1 Ответ

1 голос
/ 13 февраля 2020

Включение или отсутствие cmath приводит к тому, что файл math.h будет включен, строго определяется реализацией c. Однако оба они являются просто декларативными, и то, является ли включение одного из них одним и тем же кодом библиотеки объектов , является также спецификацией реализации c. Тем не менее, весьма вероятно, что реализация будет использовать тот же код, и часто math.h будет вложенным включением в.

cmath добавляет перегрузки для float, long double и целочисленных типов, тогда как в математике. h использует double почти исключительно. Это может привести к более оптимальным реализациям, или это может быть просто приведение типа к функции библиотеки C - опять же, это спецификация реализации c.

, поскольку эта встроенная система очень чувствительна к изменение точности из вычислений.

Поведение может измениться, если у вас нет точного соглашения о типе с объявленными функциями math.h. Например, если у вас есть float аргументы с неявным приведением к double math.h аргументам, использование cmath может привести к использованию более подходящей перегрузки.

Поэтому я хотел бы знать, если cmath заимствует его реализации и оборачивается вокруг c ++ совместимого кода? Или у c ++ есть своя собственная реализация, отличная от?

Проверьте свою реализацию, протестируйте ее и убедитесь, что ваш код имеет правильное соглашение о типах, чтобы избежать использования перегрузок. Тем не менее, если вы сделаете это, не будет убедительного преимущества в использовании cmath - основное преимущество которого заключается в перегрузках для типов, отличных от double, что приводит к потенциально более эффективному коду. Он потенциально имеет значительные преимущества в производительности, например, если у вашего процессора FPU одинарной точности или нет FPU, а вы используете float для эффективности.

Лучшее решение - собрать и протестировать его - полностью. Так как это спецификация реализации c, вам придется протестировать ее для заданной c цепочки инструментов и цели, так как в спецификации языка или библиотеки не определено, как это должно быть сделано.

...