Реализация ceil () и floor () - PullRequest
16 голосов
/ 02 июня 2011

Просто любопытно, как они реализованы.Я не вижу, с чего бы начать.Работают ли они непосредственно с битами float s / double?

Кроме того, где я могу найти исходный код функций из math.h?Все, что я нахожу, это либо заголовки с прототипами, либо файлы с функциями, которые вызывают другие функции откуда-то еще.

EDIT : часть сообщения была потеряна после редактирования заголовкаВ частности, я имел в виду функции ceil() и floor().

Ответы [ 6 ]

20 голосов
/ 02 июня 2011

Если вам интересно посмотреть исходный код алгоритмов для такого рода вещей, тогда fdlibm - «Свободно распространяемый libm», изначально созданный Sun, и эталонная реализация для математических библиотек Java.- может быть хорошим местом для начала.(Для случайного просмотра лучше начать с GNU libc , где фрагменты разбросаны по разным подкаталогам - math/, sysdeps/ieee754/ и т. Д.)

fdlibm предполагаетчто он работает с форматом IEEE 754 double, и если вы посмотрите на реализации - например, ядро ​​ реализации log () - вы увидите, что они используют все виды умныхтрюки, часто с использованием смеси как стандартной double арифметики, так и знания о битовом представлении double.

(И если вас интересуют алгоритмы для поддержки базовой арифметики с плавающей точкой IEEE 754,например, может использоваться для процессоров без аппаратной поддержки с плавающей запятой, взгляните на SoftFloat . Джона Р. Хаузера *.


Что касается редактирования: в общем, ceil()и floor() вполне может быть реализовано аппаратно;например, в x86 GCC (с включенной оптимизацией) генерирует код, используя инструкцию frndint с соответствующим переключением управляющего слова FPU для установки режима округления.Но чисто программные реализации fdlibm (s_ceil.c, s_floor.c) работают с использованием битового представления напрямую.

6 голосов
/ 02 июня 2011

math.h является частью Стандартной библиотеки C .

Если вас интересует исходный код, для проверки доступна библиотека GNU C (glibc) .

РЕДАКТИРОВАТЬ ДОБАВИТЬ:

Как уже говорили другие, математические функции обычно реализуются на аппаратном уровне.

2 голосов
/ 02 июня 2011

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

Математические функции, такие как sin(), sqrt(),log() и т. Д. Почти всегда реализуются в библиотеке времени выполнения.У нескольких редких процессоров, таких как Cray, есть инструкция с квадратным корнем.

Скажите нам, какую конкретную реализацию (gcc, MSVC и т. Д. / Mac, Linux и т. Д.) Вы используете, и кто-то точно направит васгде искать.

1 голос
/ 02 июня 2011

В наши дни многое делается на процессорах.У чипа, на котором я порезал зубы, даже не было инструкции по умножению (z80)

Нам пришлось аппроксимировать материал, используя концепцию серии Taylor.

О программеНа 1/2 пути вниз на этой странице вы можете видеть, как аппроксимируются грех и cos.

1 голос
/ 02 июня 2011

На многих платформах (например, на любой современной x86-совместимой) многие математические функции реализованы непосредственно в аппаратном обеспечении с плавающей запятой (см., Например, http://en.wikipedia.org/wiki/X86_instruction_listings#x87_floating-point_instructions). Не все из них используются, хотя (какЯ узнал из комментариев к другим ответам здесь.) Но, например, библиотечная функция sqrt часто реализуется непосредственно в виде аппаратной инструкции SSE.

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

0 голосов
/ 02 июня 2011

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

...