Где находится исходный код для isnan? - PullRequest
3 голосов
/ 15 ноября 2010

Из-за уровней стандартов включаемые файлы для c ++ являются крысиным гнездом.Я пытался выяснить, что на самом деле вызывает __isnan, и не мог найти нигде с фактическим определением.

Поэтому я просто скомпилировал с -S, чтобы увидеть сборку, и если я напишу:

#include <ieee754.h>

void f(double x) {
  if (__isinf(x) ...

  if (__isnan(x)) ...
}

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

В любом случае, хорошая идея или нет, вопрос стоит так: ГДЕ исходный код __isnan(x)?

Ответы [ 2 ]

3 голосов
/ 15 ноября 2010

Glibc имеет версии кода в папке sysdeps для каждой из поддерживаемых им систем. Тот, который вы ищете, находится в sysdeps / ieee754 / dbl-64 / s_isnan.c . Я нашел это с git grep __isnan.

(Хотя заголовки C ++ включают код для шаблонов, функций из библиотеки C нет, и вам нужно заглянуть внутрь glibc или чего-то еще.)

1 голос
/ 15 ноября 2010

Здесь , например, для главной главы glibc.

...