因此,在高中数学,也可能是大学,我们学习如何使用三角函数,他们做什么,以及他们解决了什么样的问题.但它们总是作为一个黑盒子呈现给我.如果你需要某些东西的正弦或余弦,你可以点击计算器上的sin或cos按钮然后进行设置.哪个好.
我想知道的是三角函数通常是如何实现的.
我希望向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 还会进行一些昂贵的计算.这样做是有充分理由的,但有时你更关心速度而不是最后一位精度.
我有一个C函数,它根据经过的时间计算4个正弦值.使用gprof,我认为这个函数使用100%(100.7%确切地说是lol)的CPU时间.
void
update_sines(void)
{
clock_gettime(CLOCK_MONOTONIC, &spec);
s = spec.tv_sec;
ms = spec.tv_nsec * 0.0000001;
etime = concatenate((long)s, ms);
int k;
for (k = 0; k < 799; ++k)
{
double A1 = 145 * sin((RAND1 * k + etime) * 0.00333) + RAND5; // Amplitude
double A2 = 100 * sin((RAND2 * k + etime) * 0.00333) + RAND4; // Amplitude
double A3 = 168 * sin((RAND3 * k + etime) * 0.00333) + RAND3; // Amplitude
double A4 = …Run Code Online (Sandbox Code Playgroud) math ×4
trigonometry ×3
algorithm ×2
optimization ×2
c ×1
d ×1
java ×1
performance ×1
reference ×1