我一直在研究.NET反汇编和GCC源代码,但似乎无法找到实际实现sin()和其他数学函数的任何地方......它们似乎总是引用其他东西.
谁能帮我找到它们?我觉得C运行的所有硬件都不太可能支持硬件中的触发功能,因此某处必须有软件算法,对吧?
我知道有几种方法可以计算函数,并编写了我自己的例程来计算函数使用泰勒系列来获得乐趣.我很好奇真正的生产语言是如何做到的,因为我的所有实现总是慢几个数量级,即使我认为我的算法非常聪明(显然它们不是).
我正在谷歌搜索过去一小时的问题,但只有泰勒系列或一些示例代码的要点太慢或根本不编译.好吧,我发现谷歌的答案大多是"Google it,它已经被问到了",但遗憾的是它不是 ......
我在低端Pentium 4上分析我的游戏,发现大约85%的执行时间浪费在计算窦,cosinus和平方根(来自Visual Studio中的标准C++库)上,这似乎与CPU密切相关(在我的I7上,相同的功能只有5%的执行时间,并且游戏更快了waaaaaaaaaa).我不能优化这三个函数,也不能在一次传递中计算正弦和余弦(相互依赖),但我不需要太精确的模拟结果,所以我可以使用更快的逼近.
那么,问题是:在C++中计算float的正弦,余弦和平方根的最快方法是什么?
编辑 查找表更加痛苦,因为在现代CPU上产生的Cache Miss比Taylor系列更昂贵.这些天CPU很快,而缓存则不然.
我犯了一个错误,我虽然需要为Taylor系列计算几个阶乘,我现在看到它们可以实现为常量.
所以更新的问题是:对于平方根还有任何快速优化吗?
EDIT2
我使用平方根计算距离,而不是规范化 - 不能使用快速反平方根算法(如评论中所指出:http://en.wikipedia.org/wiki/Fast_inverse_square_root
EDIT3
我也无法在平方距离上操作,我需要精确的距离进行计算
我希望向D编程语言标准库提交一个补丁,它将允许在编译时使用该语言的编译时功能评估工具评估大部分std.math.编译时功能评估有几个局限性,最重要的是:
有几个std.math函数违反了这些函数,需要编写编译时版本.我在哪里可以获得有关计算诸如对数,指数,幂和三角函数等优良算法的信息?我更喜欢算法的高级描述和实际代码,原因有两个:
为避免法律含糊不清,需要让我的代码看起来与源代码"不同",以确保我拥有版权.
我想要简单,便携的算法.我不关心微优化,只要它们至少是渐近有效的.
编辑:D的编译时函数评估模型允许在编译时计算的浮点结果与运行时计算的浮点结果不同,所以我不在乎我的编译时算法是否提供与运行时版本完全相同的结果只要它们在实际上并不那么准确.
由于java.lang.Math中的三角函数非常慢:是否有一个快速和良好近似的库?似乎可以在不损失太多精度的情况下快速进行几次计算.(在我的机器上,乘法需要1.5ns,而java.lang.Math.sin需要46ns到116ns).遗憾的是,还没有办法使用硬件功能.
更新:功能应该足够准确,比如GPS计算.这意味着您需要至少7个十进制数字的精度,这排除了简单的查找表.它应该比基本x86系统上的java.lang.Math.sin快得多.否则就没有意义了.
对于pi/4以上的值,除硬件功能外,Java 还会进行一些昂贵的计算.这样做是有充分理由的,但有时你更关心速度而不是最后一位精度.
可能重复:
三角函数如何工作?
什么实际上用于计算三角函数,如Sin,Cos,Tan和Atan?
我想我已经在我的代码中找到了一个优化,我可以避免使用任何这些函数,并将问题基于斜率而不是角度.这意味着代替上述trig函数的一对除法运算.但我想更多地了解那些触发函数的内容,以便我可以比较我的新代码(从基本数学运算的数量的角度来看).或许我刚刚发现了一种更迂回的做同样事情的方式,或者更糟糕的是,引入了一种效率较低的方法.
使用C++和Python但我认为这些与语言无关,数学运算成本与最原始的操作相关.
我必须在我只有以下数学工具的环境中实现asin,acos和atan:
我也已经有了相当不错的平方根函数.
我可以使用它们来实现合理有效的反三角函数吗?
我不需要太大的精度(浮点数无论如何都有非常有限的精度),基本的近似就可以了.
我已经决定使用表查找,但我想知道是否有一些更简洁的选项(不需要数百行代码来实现基本数学).
编辑:
要清理:我需要每帧以每秒35帧的速度运行该功能数百次.
sin并且cos功能很慢,需要大量资源才能在嵌入式系统上运行.如何以更节省资源和更快速的方式计算sin和cos运行?
我一直在研究如何计算正弦和余弦。我找到了一些“标准”方法,包括查找表、CORDIC 算法和泰勒级数。我还发现大多数现代处理器都有一个汇编指令来计算三角函数。我想知道的是这些命令是如何工作的。
所以,我的问题是:当前的处理器使用什么特定算法来计算正弦和余弦?
可能的重复:
C 如何计算 sin() 和其他数学函数?
我很好奇如何sin以及cos如何在低水平上实施。
我刚刚查看了 math.h 内部,找不到sin和 的声明cos。但由于这对我来说是一条死胡同,所以我转向你,所以。
我想知道计算正弦需要多少次操作以及使用什么技巧来加速。它们在不同硬件上的实现方式是否不同,是否有处理器支持本机指令?例如,与添加相比,它们的速度有多快?
谢谢!
我想知道哪些算法用于从java.lang.Math类实现数学函数?
例如,sin(x)(或log(x))是作为泰勒级数或任何其他算法的元素之和实现的吗?