ceil()和floor()的实现

Vla*_*tch 16 c math

只是好奇这些是如何实现的.我看不出我会从哪里开始.他们直接在float's/double'位上工作吗?

另外在哪里可以找到math.h的函数源代码?我找到的只是带有原型的头文件或带有从其他地方调用其他函数的函数的文件.

编辑:编辑标题后,部分信息丢失了.我特别指的是ceil()floor()功能.

Mat*_*ery 20

如果您对查看此类事物的算法源代码感兴趣,那么fdlibm - libm最初来自Sun 的"Freely Distributable "和J​​ava数学库的参考实现 - 可能是一个很好的起点.(对于随意浏览,它肯定是一个更好的地方开始比GNU libc的,其中片散落在不同的子目录- math/,sysdeps/ieee754/等)

fdlibm假设它使用IEEE 754格式double,如果你看一下实现 - 例如,log()实现核心 - 你会看到他们使用各种聪明的技巧,通常使用混合标准double算术,以及a的位表示的知识double.

(如果你有兴趣的算法支持基本IEEE 754浮点运算,比如可以用于没有硬件处理器的浮点支持,看看约翰·豪瑟的SoftFloat.)


至于你的编辑:在一般情况下,ceil()floor()很可能在硬件中实现; 例如,在x86上,GCC(启用了优化)使用frndint指令生成代码,并适当摆弄FPU控制字以设置舍入模式.但是fdlibm的纯软件实现(s_ceil.c,s_floor.c)可以直接使用位表示.


Ala*_*lan 6

math.h是标准C库的一部分.

如果您对源代码感兴趣,可以使用GNU C Library(glibc)进行检查.

编辑添加:

正如其他人所说,数学函数通常在硬件级别实现.