如何在eglibc-2.13中实现sin()?

时间:2012-10-31 00:45:16

标签: c linux math glibc libc

我需要追踪eglibc-2.13中double sin(double x)的确切实现方式。我下载了源代码,唯一有意义的部分是__sin函数,这是特定于平台的。它是我在/usr/lib/i386-linux-gnu/libm.a中所拥有的核心吗?

如何追踪从sin()到__sin()的宏定义?我真正需要的是确切的代码(文件名和行就足够了)以及构建过程推断使用哪种实现的方式。架构的i386。

2 个答案:

答案 0 :(得分:5)

(e)glibc构建过程是黑色,黑魔法。你不想试图理解它。但是,glibc遵循每个公共函数的一个文件编码样式,所以一般来说,如果你有源树并且想要找到某个函数的实现,那么最简单的事情就是

$ find * -name '*function*' -print

从顶层开始,当然将function替换为函数的名称。

具体谈论sin:数学函数的通用实现位于math目录中:但是,似乎 没有{{1}的通用定义}}。所以接下来要看的是sin。非通用的所有内容都在sysdeps中,特别是sysdeps是所有数学函数都依赖于IEEE 754浮点规范但没有其他系统依赖性的地方。此目录按类型组织:sysdeps/ieee754包含IEEE sysdeps/ieee754/dbl-64的所有数学函数。在这里,您将找到sysdeps/ieee754/dbl-64/s_sin.c,这是您正在寻找的代码。 (所有这些文件上的doublee_s_等前缀用于表示AFAIK不再使用的内容。)

如果特定处理器的汇编语言中有k_的实现,它将位于{{1}中其他位置的sin(或可能sin.S)文件中}。但是,似乎没有一个。

答案 1 :(得分:1)

不是答案,只是一点背景:

在C代码中使用sin()cos()时,几乎可以肯定是提供实现的编译器,而不是C库。例如,请查看the list of builtins GCC provides。链接页面还描述了使用内置函数的情况,而不是C库提供的版本。