Где функция pow определена и реализована в C?

Я читал, что функция pow(double, double) определена в "math.h", но не могу найти ее объявление.

Кто-нибудь знает, где объявлена ​​эта функция? И где это реализовано на C?

Ссылка:

http://publications.gbdirect.co.uk/c_book/chapter9/maths_functions.html


person Community    schedule 09.11.2009    source источник
comment
Если это не прямо в math.h, приличный редактор с возможностью тегирования (или аналогичный) приведет вас прямо к объявлению, если вы пометите каталог включаемых файлов для вашей библиотеки времени выполнения C. Почти любой приличный редактор программирования будет иметь эту возможность.   -  person Michael Burr    schedule 09.11.2009
comment
Я не знаю, какой компилятор вы используете, но похоже, что для MSVC 9 исходный код для pow() не включен. Реализация, похоже, находится в библиотеке tran.lib, исходный код которой не включен.   -  person Michael Burr    schedule 09.11.2009


Ответы (8)


Довольно часто включаемый файл, такой как <math.h>, будет включать в себя другие файлы заголовков, которые фактически объявляют функции, которые вы ожидаете увидеть в <math.h>. Идея состоит в том, что программа получает то, что ожидает, когда включает <math.h>, даже если фактические определения функций находятся в каком-то другом заголовочном файле.

Поиск реализации стандартной библиотечной функции, такой как pow(), — совсем другое дело. Вам нужно будет откопать исходный код в вашей стандартной библиотеке времени выполнения C и найти там реализацию.

person Greg Hewgill    schedule 09.11.2009
comment
Обратите внимание, что большинство компиляторов предоставляют исходный код библиотеки. Но иногда это может быть настоящим лабиринтом. - person Michael Burr; 09.11.2009

Где он определен, зависит от вашей среды. Код находится где-то внутри скомпилированной стандартной библиотеки C.

Его «определение» находится в исходном коде вашего дистрибутива стандартной библиотеки c. Одним из таких дистрибутивов является eglibc. Это можно просмотреть в Интернете или в исходном дистрибутиве:

w_pow.c

math_private.h

Краткий ответ: в исходном коде стандартной библиотеки C.

person pbos    schedule 09.11.2009
comment
w_pow.c не очень полезная ссылка, поскольку она просто вызывает __ieee754_pow(x, y);, что является реальным определением... - person Chris Dodd; 19.08.2019

Фактическая реализация pow может варьироваться от компилятора к компилятору. Как правило, math.h (или файл производителя, включенный в math.h) предоставляет прототип для pow (т. е. его объявление), но реализация скрыта в каком-то библиотечном файле, таком как libm. а. В зависимости от вашего компилятора фактический исходный код для pow или любой другой библиотечной функции может быть недоступен.

person John Bode    schedule 09.11.2009

объявлено: в каталоге include вашей системы/SDK (например: /usr/include;/Developer/Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS3.2.sdk/usr/include/architecture /рука/math.h)

определено (реализовано):

  • как библиотека (скомпилированный, двоичный код): в каталоге библиотек вашей системы/SDK (например: /usr/lib (в случае математической библиотеки это libm.dylib)
  • как исходный код (программный код): это самая интересная часть. Сейчас я работаю над Mac OS X 10.6.x. исходники для функций, объявленных в math.h (например: extern double pow ( double, double ); ), не поставляются с установкой (по крайней мере, я не смог их найти). Скорее всего, вы найдете эти исходники в библиотеке C вашей системы/SDK. В моем случае математическая библиотека (libm) — это отдельный проект, часть исходников предоставлена ​​Apple: http://www.opensource.apple.com/tarballs/Libm/Libm-315.tar.gz

Ключевое слово extern в объявлении функции pow означает, что оно определено где-то еще. Математические функции — это низкоуровневые высокопроизводительные реализации, в основном выполненные в ассемблере (*.s). Процедуры ассемблера (прием аргументов/передача параметров через регистры/стек) связаны с остальной частью библиотеки C. Связывание/экспорт имен функций/подпрограмм зависит от платформы и на самом деле не имеет значения, если цель не заключается в погружении в кодирование на ассемблере.

Я надеюсь, что это помогло, Рафаэль

person Raphael Schaad    schedule 29.10.2010

Если вам интересно, как реализован расчет, вы можете найти его здесь: http://fossies.org/dox/gcc-4.5.3/e__pow_8c_source.html Функция называется __ieee754_pow, которая вызывается функцией pow.

person Forethinker    schedule 31.03.2012

Я действительно определился в math.h. Вы пытались включить math.h и просто использовать pow? Что вы имеете ввиду под "не могу найти"?

person Konrad Rudolph    schedule 09.11.2009
comment
Да, я могу использовать его, но не могу найти его объявление. Может ли кто-нибудь найти его объявление и реализацию в math.h? Пожалуйста, разместите это здесь. благодаря. - person ; 09.11.2009
comment
Например, функция isless объявлена ​​как: # ifndef isless # определить isless(x, y) \ (расширение \ ({ __typeof__(x) __x = (x); __typeof__(y) __y = ( y); \ !isunordered (__x, __y) && __x ‹ __y; })) # endif я ожидаю того же, что и pow(double, double) - person ; 09.11.2009

Вот реализация fdlibm на C: http://www.netlib.org/fdlibm/e_pow.c

Как бы то ни было, когда версия 8 отказалась от своих таблиц cos/sine, для этого она использовала реализацию fdlibm: https://code.google.com/p/v8/source/detail?r=22918

Из комментариев к фиксации изменений: «Реализовать тригонометрические функции, используя порт fdlibm».

Mozilla, с другой стороны, вызывает математические функции cstdlib, которые будут иметь различную производительность в зависимости от сборки и системы (например, могут или не могут вызывать реализации трансцендентных функций на уровне чипа). В то время как байт-код С#, кажется, делает явные ссылки на функции уровня микросхемы, когда это возможно. Однако «pow» не является одним из них, iirc (похоже, не имеет функции на уровне чипа) и реализован в другом месте.

См. также: https://bugzilla.mozilla.org/show_bug.cgi?id=967709

Для обсуждения кос/синуса в сообществе Mozilla сравнение реализации Mozilla со старой реализацией v8.

См. также: Как Math.Pow() реализован в .NET Framework?

Внутренние функции находятся на уровне микросхемы и фактически реализуются на процессоре. (Нам больше не обязательно нужны таблицы поиска.)

person Community    schedule 26.11.2014

Его здесь, а также здесь. Также посетите википедию.

Там вы найдете Пау.

person Pale Blue Dot    schedule 09.11.2009