Я попытаюсь ответить для случая sin()
в программе на C, скомпилированной с помощью компилятора C GCC на текущем процессоре x86 (скажем, Intel Core 2 Duo).
В языке C стандартная библиотека C включает в себя общие математические функции, не включенные в сам язык (например, pow
, sin
и cos
для мощности, синуса и косинуса соответственно). Заголовки которых включены в math.h .
Теперь в системе GNU / Linux функции этих библиотек предоставляются glibc (GNU libc или GNU C Library). Но компилятор GCC хочет, чтобы вы связались с математической библиотекой (libm.so
), используя флаг компилятора -lm
, чтобы разрешить использование этих математических функций. Я не уверен, почему она не является частью стандартной библиотеки C. Это будет программная версия функций с плавающей запятой или "soft-float".
В сторону: Причина, по которой математические функции были отделены друг от друга, является исторической и была просто предназначена для уменьшения размера исполняемых программ в очень старых системах Unix, возможно, до того, как использовались общие библиотеки доступно, насколько я знаю.
Теперь компилятор может оптимизировать стандартную функцию библиотеки C sin()
(предоставленную libm.so
) для замены вызовом встроенной инструкции встроенной функции sin () вашего CPU / FPU, которая существует как Инструкция FPU (FSIN
для x86 / x87) на более новых процессорах, таких как серия Core 2 (это верно в значительной степени еще в i486DX). Это будет зависеть от флагов оптимизации, передаваемых компилятору gcc. Если компилятору было приказано написать код, который будет выполняться на любом процессоре i386 или новее, он не будет выполнять такую оптимизацию. Флаг -mcpu=486
сообщит компилятору, что такая оптимизация безопасна.
Теперь, если программа выполняет версию программного обеспечения функции sin (), она будет делать это на основе CORDIC (ЦИФРОВОЙ компьютер вращения координат) или BKM-алгоритма , или more вероятно, таблица или степенной расчет, который обычно используется сейчас для вычисления таких трансцендентных функций. [Src: http://en.wikipedia.org/wiki/Cordic#Application]
Любая недавняя (начиная с 2.9x прим.) Версия gcc также предлагает встроенную версию sin, __builtin_sin()
, которую он будет использовать для замены стандартного вызова версии библиотеки C в качестве оптимизации.
Я уверен, что это так же ясно, как грязь, но, надеюсь, даст вам больше информации, чем вы ожидали, и много прыжков, чтобы узнать больше самостоятельно.