Требование к точности математических функций GNU GCC? - PullRequest
6 голосов
/ 09 февраля 2012

Я тщетно пытался несколько дней найти точность математических функций (в math.h) компилятора GNU GCC. Стандарт C99 говорит, что требование к точности математических функций в math.h определяется реализацией. Я не смог найти упоминаний об этом в руководствах компилятора GNU GCC. У кого-нибудь есть ответ на этот вопрос?

Ответы [ 3 ]

9 голосов
/ 09 февраля 2012

Функции math.h являются частью библиотеки GNU C, а не компилятором GCC. Их точность задокументирована здесь как часть руководства GNU C Library .

1 голос
/ 02 марта 2015

Единственное, что можно предположить, это то, что символы '-' в таблице математической точности glibc:

http://www.gnu.org/software/libc/manual/html_node/Errors-in-Math-Functions.html#Errors-in-Math-Functions

означает «не проверено», учитывая отсутствие официальной документации, предполагающей иное.

0 голосов
/ 12 апреля 2015

Ошибки действительно перечислены здесь , но ИМХО предположение, что «-» означает «правильно округлено» (т. Е. 1/2 ulp ) почти наверняка опровергнуто утверждением вначало страницы

[T] Он Библиотека GNU C не предназначена для правильно округленных результатов для функций в математической библиотеке ... Вместо этого цели для точности функций без полностью определенных результатов являютсяследующее;некоторые функции имеют ошибки, означающие, что они не соответствуют этим целям во всех случаях.В будущем библиотека GNU C может предоставлять некоторые другие функции правильного округления под такими именами, как crsin, предложенный для расширения до ISO C.

После небольшого исследования исходного кода я нашел то, что кажетсяbe результаты теста ulp (для x86-64).Похоже, что для режима округления по умолчанию (округление до ближайшего, связи идут на четное) они явно проверяют double только тогда, когда ulp из long double (80-битный IEEE) хуже, чем float.Предполагается, что неявное предположение состоит в том, что double не может быть хуже, чем long double.Для режимов направленного округления они, кажется, всегда проверяют и float, и double явно.

Однако есть некоторая странность.

  • Там нет результатов теста дляexp.
  • Для cos и tan они тестируют только реальные / сложные long double.
...