首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >ceil()和floor()的实现

ceil()和floor()的实现
EN

Stack Overflow用户
提问于 2011-06-01 22:29:01
回答 5查看 17.9K关注 0票数 17

只是好奇这些是如何实现的。我不知道我会从哪里开始。它们是否直接在float/double的比特上工作?

另外,在哪里可以找到math.h中函数的源代码?我发现的要么是带有原型的头文件,要么是具有调用其他其他函数的函数的文件。

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

EN

回答 5

Stack Overflow用户

回答已采纳

发布于 2011-06-01 23:55:18

如果您有兴趣看到用于这类事情的算法的源代码,那么fdlibm --来自Sun的“可自由分发的libm”和Java的数学库的参考实现--可能是一个很好的起点。(对于随意浏览,它当然是一个比GNU libc更好的起点,在那里,片段分散在不同的子目录-- math/sysdeps/ieee754/等。)

fdlibm假设它使用的是IEEE754格式的double,如果您查看实现--例如log()实现的核心 --您将看到它们使用各种巧妙的技巧,通常使用标准double算法和double位表示知识的混合。

(如果您对支持基本IEEE754浮点算法的算法感兴趣,例如可能用于没有硬件浮点支持的处理器,请看一下JohnR.Hauser的SoftFloat。)

对于您的编辑:通常,ceil()floor()很可能是在硬件中实现的;例如,在x86上,GCC (启用了优化)使用frndint指令生成代码,并对FPU控制字进行适当修改,以设置舍入模式。但是fdlibm的纯软件实现(s_ceil.cs_floor.c)可以直接使用位表示。

票数 20
EN

Stack Overflow用户

发布于 2011-06-01 22:32:56

H是标准C库的一部分。

如果您对源代码感兴趣,则可以对GNU C库进行检查。

编辑以添加:

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

票数 6
EN

Stack Overflow用户

发布于 2011-06-01 22:32:22

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

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

告诉我们哪个具体的实现(gcc、MSVC等/Mac、Linux等)你正在使用,有人会准确地告诉你去哪里看。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/6208488

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档