Если вам интересно посмотреть исходный код алгоритмов для такого рода вещей, тогда 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
) работают с использованием битового представления напрямую.