我想知道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.c(sin
函数本身)
k_sin.c(在__kernel_sin
的实现中使用的sin
函数)
后一个文件具有描述算法的注释。关键点似乎是“ sin(x)
由13的多项式近似”。看起来sin
将x
参数转换为范围(-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/