ceil()和floor()的实现

ceil()和floor()的实现,c,math,C,Math,只是好奇这些是如何实现的。我不知道从哪里开始。它们是否直接作用于浮点的/双位 我在哪里可以找到math.h中函数的源代码?我所找到的要么是带有原型的标题,要么是带有从其他地方调用其他函数的函数的文件 编辑:编辑标题后,部分消息丢失。我特别指的是ceil()和floor()函数 像加法和除法这样的数学函数几乎总是由机器指令实现的。例外情况大多是小型处理器,如8048系列,它们使用库来实现没有简单机器指令序列可计算的函数 像sin(),sqrt(),log()等数学函数几乎总是在运行库中实现的。一些

只是好奇这些是如何实现的。我不知道从哪里开始。它们是否直接作用于
浮点
的/

我在哪里可以找到math.h中函数的源代码?我所找到的要么是带有原型的标题,要么是带有从其他地方调用其他函数的函数的文件


编辑:编辑标题后,部分消息丢失。我特别指的是
ceil()
floor()
函数

像加法和除法这样的数学函数几乎总是由机器指令实现的。例外情况大多是小型处理器,如8048系列,它们使用库来实现没有简单机器指令序列可计算的函数

sin()
sqrt()
log()
等数学函数几乎总是在运行库中实现的。一些罕见的CPU,如Cray,具有平方根指令

告诉我们您使用的是哪种特定的实现(gcc、MSVC等/Mac、Linux等),有人会准确地告诉您应该在哪里查找。

在许多平台上(如任何兼容x86的现代平台),许多数学函数都是直接在浮点硬件中实现的(例如,请参阅)。不过,并不是所有的答案都被使用(正如我在这里通过对其他答案的评论了解到的)。但是,例如,
sqrt
库函数通常直接根据SSE硬件指令实现

对于底层算法如何工作的一些想法,您可以尝试阅读,它可以作为PDF在某处提供。

math.h是本文的一部分

如果您对源代码感兴趣,可以查看

编辑以添加:


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

如今,很多数学函数都是在处理器上实现的。 我切牙的芯片甚至没有乘法指令(z80)

我们必须用这个概念来近似东西


大约向下1/2的地方,你可以看到sin和cos是如何近似的。

虽然现代CPU确实有常见的超常规函数(如sin、cos等)的硬件实现,但它很少按原样使用。它可能是出于便携性、速度、准确性等原因。。。相反,使用的是近似算法。

如果您对这类算法的源代码感兴趣,那么——最初来自Sun的“可自由分发的
libm
”,以及Java数学库的参考实现——可能是一个很好的起点。(对于随意浏览,它当然是一个更好的开始,而不是分散在不同的子目录中——
math/
sysdeps/ieee754/
,等等。)

fdlibm假设它使用的是IEEE 754格式的
double
,如果您查看实现(例如,the),您会发现它们使用了各种巧妙的技巧,通常混合使用标准
double
算法和
double
的位表示知识

(如果您对支持基本IEEE 754浮点运算的算法感兴趣,例如可能用于不支持硬件浮点运算的处理器的算法,请参阅John R.Hauser的。)



至于您的编辑:一般来说,
ceil()
floor()
很可能在硬件中实现;例如,在x86上,GCC(启用了优化)使用
frnint
指令生成代码,并适当地拨动FPU控制字以设置舍入模式。但是fdlibm的纯软件实现(,)确实直接使用位表示法工作。

您的三个示例函数都可以作为硬件指令在任何现代x86兼容平台上使用……而且几乎从未在实现中使用过。。。我所熟悉的数学库的开源实现中,至少没有一个使用硬件指令来实现超越Antal函数(sin、cos等)。硬件指令在很大程度上无法使用。例如,硬件
sin
cos
仅适用于非常小的参数,即使如此,它们可能会超出您的期望值…@Oli:我已经五年左右没有寻找过了,但x86 FPU指令被命名为partial sin、partial sqrt等。这些指令必须用参数检查、约简和,单位转换,通常相当多的家务。这些指令在运行库中可能有意义,但不是编译器常规生成的。@R..:需要仔细执行,但这不是火箭科学;阅读或找到Jean-Michel Muller的书。编写好的测试比编写简化本身要困难得多。这里有没有人足够大,可以拥有一台x86计算机,但没有浮点数学的硬件支持?(我……太老了)@Alan:我从来没有拥有过一个,尽管我在工作中用过。我们上世纪80年代的产品是基于8086和8087的。@Alan我的第一台计算机是286,没有浮点,1989年是200美元(包括单色(金色)显示器)。根据你真正想知道的,这个问题可能在math.stackexchange.com上。实现(近似)任何给定的非简单算术函数,如
sqrt
sin
exp
,等等。通常需要了解数值分析和应用近似方法,可能还包括参数缩减和其他技巧。在阅读和查看目标代码后,我非常同意你的意见。尽管看起来至少有一些(非超越的)数学函数是根据FPU指令实现的,比如
sqrt
(在GCC和ICC中)。如果你使用泰勒级数来近似区间上的函数,那么你就是