这取决于您需要的准确性。sin 的最大导数是 1,因此如果 x1 和 x2 在彼此的 epsilon 范围内,则 sin(x1) 和 sin(x2) 也在 epsilon 范围内。如果您只需要精度在 0.001 以内,那么您可以创建一个 1000 * PI = 3142 点的查找表,然后查找最接近您需要的值。这可能比本机代码更快,因为本机代码(可能)使用查找表来查找多项式系数,然后进行插值,并且该表可以足够小以便轻松地保留在缓存中。
如果您需要在整个范围内完全准确,那么您可能没有比这更好的方法了。
如果您愿意,您还可以在 (1/sin(x)) 上创建一个查找表,因为这是您实际感兴趣的函数。无论哪种方式,您都需要小心 sin(x) = 0,因为 sin(x) 中的一个小错误可能会导致 1/sin(x) 中的一个大错误。定义你的容错对于弄清楚你可以走什么捷径很重要。
您将使用以下内容创建查找表:
float *table = malloc(1000 * sizeof(float));
for(int i = 0; i < 1000; i++){
table[i] = sin(i/1000.0);
}
并会像这样访问它
float fastSin(float x){
int index = x * 1000.0;
return table[index];
}
此代码不完整(由于数组边界,0 < x < 1 之外的任何内容都会崩溃),但应该可以帮助您入门。