我想知道Java如何找到sin(x)。我看着Math.sin,但它并没有给出答案。请不要只说泰勒级数,我会学习数学,所以我知道这不是那么简单。 :)

我还检查了Strict Math类,由于所有这些JVM具有不同的算法,因此有人可以举一个例子吗?

到目前为止,这是我基于泰勒级数的算法:

if( (i%4) == 0)
            suma = suma + Math.sin(x0) * Math.pow(x-x0, i) / faktorijal(i);
        if( (i%4) == 1)
            suma = suma - Math.cos(x0) * Math.pow(x-x0, i) / faktorijal(i);
        if( (i%4) == 2)
            suma = suma - Math.sin(x0) * Math.pow(x-x0, i) / faktorijal(i);
        if( (i%4) == 3)
            suma = suma + Math.cos(x0) * Math.pow(x-x0, i) / faktorijal(i);


x0是我要寻找sin(x)的点,而faktorijal是!i;

最佳答案

它取决于JVM的实现,但是在OpenJDK中,Math.sin仅调用StrictMath.sin,这是通过调用fdlibm库提供的正弦函数的本机方法实现的。

这是OpenJDK 8中fdlibm正弦函数的C源代码:


s_sin.csin函数本身)
k_sin.c(在__kernel_sin的实现中使用的sin函数)


后一个文件具有描述算法的注释。关键点似乎是“ sin(x)由13的多项式近似”。看起来sinx参数转换为范围(-pi / 4,+ pi / 4)中的等效值,并且__kernel_sin执行的多项式逼近在该范围内足够精确。



请注意,尽管Math.sin方法的实际Java字节码只是调用StrictMath.sin,但JVM可以使用除实际调用该方法之外的其他方式执行Math.sin调用。特别是,很可能会将Math.sin调用转换为相应的本机CPU指令(例如x86 FSIN)。但是,对StrictMath.sin的调用将始终使用fdlibm实现。

关于java - Java如何计算三角函数,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/25150660/

10-14 09:46