Sinf - существует ли он в C ++? - PullRequest
0 голосов
/ 01 февраля 2012

Мне было любопытно узнать, существует или нет функция sinf в C ++, включая math.h.

При просмотре моего автозаполнения в Qt Creator оно не появляется. Это заставляет меня задуматься, по какой-то причине его вынули. Похоже, что в поиске Google не появляется много ссылок; большинство из них относятся к прямой С.

Итак, это можно подтвердить?

Ответы [ 2 ]

4 голосов
/ 01 февраля 2012

Это зависит от того, какую версию стандарта поддерживает ваша реализация.

Функция sinf не существовала в стандарте ISO C 1990 года (как и sind). Единственная функция sin была sin, которая принимает аргумент double и возвращает результат double. (В разделе «Будущие направления библиотек», 7.13, говорится, что математические функции с именами с суффиксом f или l зарезервированы.)

Функции sinf и sind были добавлены в стандарт ISO C 1999 года (C99).

Издание 2003 года стандарта ISO C ++ в разделе 17.4.1.2 [lib.headers] гласит:

За исключением случаев, указанных в пунктах 18-27, содержимое каждого заголовка cname должно быть таким же, как у соответствующего заголовка name.h , как указано в ИСО / МЭК 9899: 1990 Языки программирования C (раздел 7), или ISO / IEC: 1990 Языки программирования - C ПОПРАВКА 1: C Целостность, (пункт 7) в зависимости от обстоятельств, как будто путем включения.

Стандарт ISO C ++ 2011 (по крайней мере черновик N3290) включает в себя следующие нормативные ссылки:

  • ISO / IEC 9899: 1999, Языки программирования - C
  • ISO / IEC 9899: 1999 / Cor.1: 2001 (E), Языки программирования - C, Техническое исправление 1
  • ISO / IEC 9899: 1999 / Cor.2: 2004 (E), Языки программирования - C, Техническое исправление 2
  • ISO / IEC 9899: 1999 / Cor.3: 2007 (E), Языки программирования - C, Техническое исправление 3

Таким образом, реализация C ++, которая соответствует стандарту ранее, что C ++ 11 не должна обеспечивать sinf. Неясно, разрешено ли для этого разрешено , но поскольку все стандарты до C ++ 11 официально устарели, это, вероятно, спорный вопрос.

Вероятно, для реализаций до C ++ 11 характерно предоставление sinf() и друзей в качестве (возможно, не соответствующего) расширения.

Практически, вы всегда можете просто позвонить sin(); в большинстве случаев аргумент и результат будут неявно преобразованы из float в double и из double в float. Может быть (или нет) потеря эффективности.

1 голос
/ 01 февраля 2012

Все функции C существуют в C ++, если только их заголовочные файлы не предпринимают явный шаг, чтобы проверить, является ли это компилятором C ++, и скрыть определение в этом случае.

Так что да, вы можете использовать sinf из кода C ++ точно так же, как и из C. На самом деле вы можете (с несколькими очень узкими исключениями) написать код C90 и передать его через g++, назвав его C ++.

РЕДАКТИРОВАТЬ: sinf, по крайней мере, на моем компьютере, не отображается math.h, если только один из следующих пунктов не * #define ed до включения этого заголовка:

_BSD_SOURCE || _SVID_SOURCE || _XOPEN_SOURCE >= 600
|| _ISOC99_SOURCE || _POSIX_C_SOURCE >= 200112L

Так что в коде C ++ вам может потребоваться установить одно из этих определений препроцессора, чтобы получить прототип.

...