由于 java.lang.Math 中的三角函数非常慢:是否有一个库可以快速且良好地近似?似乎可以在不损失太多精度的情况下以数倍的速度进行计算。 (在我的机器上,乘法需要 1.5ns,而 java.lang.Math.sin 需要 46ns 到 116ns)。不幸的是,目前还没有办法使用硬件功能。
更新:这些函数应该足够准确,例如,对于 GPS 计算。这意味着您需要至少 7 位十进制数字的精度,这排除了简单的查找表。在你的基本 x86 系统上它应该比 java.lang.Math.sin 快得多。否则的话就没有意义了。
对于超过 pi/4 的值,Java 会这样做一些昂贵的计算 https://bugs.java.com/bugdatabase/view_bug?bug_id=4857011除了硬件功能之外。这样做有充分的理由,但有时您更关心的是速度而不是最后一位的准确性。
计算机近似值 https://rads.stackoverflow.com/amzn/click/com/0882756427哈特.制表切比雪夫经济型 http://en.wikipedia.org/wiki/Approximation_theory一组不同精度的函数的近似公式。
Edit:把我的副本下架,结果是另一本书 https://rads.stackoverflow.com/amzn/click/com/B0000CJASU这听起来很相似。这是使用其表格的 sin 函数。 (在 C 中测试,因为这对我来说更方便。)我不知道这是否会比 Java 内置更快,但至少保证它不太准确。 :) 您可能需要首先缩小参数的范围;看约翰·库克的建议 https://stackoverflow.com/questions/523531/fast-transcendent-trigonometric-functions-for-java/523777#523777。书中还有反正弦和反正切。
#include <math.h>
#include <stdio.h>
// Return an approx to sin(pi/2 * x) where -1 <= x <= 1.
// In that range it has a max absolute error of 5e-9
// according to Hastings, Approximations For Digital Computers.
static double xsin (double x) {
double x2 = x * x;
return ((((.00015148419 * x2
- .00467376557) * x2
+ .07968967928) * x2
- .64596371106) * x2
+ 1.57079631847) * x;
}
int main () {
double pi = 4 * atan (1);
printf ("%.10f\n", xsin (0.77));
printf ("%.10f\n", sin (0.77 * (pi/2)));
return 0;
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)