Java如何计算三角函数
我想知道Java是如何找到sin(x)的。我看了Java如何计算三角函数,java,formula,trigonometry,Java,Formula,Trigonometry,我想知道Java是如何找到sin(x)的。我看了Math.sin,它并没有给出答案。请不要只说它是泰勒级数,我学习数学,所以我知道它不是那么简单。:) 我还检查了严格的数学类,因为所有这些JVM都有不同的算法,有人能举一个例子吗 到目前为止,这是我基于泰勒级数的算法: if( (i%4) == 0) suma = suma + Math.sin(x0) * Math.pow(x-x0, i) / faktorijal(i); if( (i%4) == 1)
Math.sin
,它并没有给出答案。请不要只说它是泰勒级数,我学习数学,所以我知道它不是那么简单。:)
我还检查了严格的数学类,因为所有这些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是!一, 未指定的实施详细信息 默认情况下,许多
Math
方法只需调用StrictMath
中的等效方法即可实现。鼓励代码生成器使用特定于平台的本机库或微处理器指令(如果可用),以提供Math
方法的更高性能实现
换句话说,不同的JVM可以不同地实现Math.sin
但更正式的是:
为了帮助确保Java程序的可移植性,此包中某些数值函数的定义要求它们产生与某些已发布算法相同的结果。这些算法可从著名的网络库netlib获得,即“自由分发数学库”fdlibm包。这些算法是用C编程语言编写的,可以理解为所有浮点运算都是按照Java浮点运算规则执行的
未指定的实现详细信息 默认情况下,许多
Math
方法只需调用StrictMath
中的等效方法即可实现。鼓励代码生成器使用特定于平台的本机库或微处理器指令(如果可用),以提供Math
方法的更高性能实现
换句话说,不同的JVM可以不同地实现Math.sin
但更正式的是:
为了帮助确保Java程序的可移植性,此包中某些数值函数的定义要求它们产生与某些已发布算法相同的结果。这些算法可从著名的网络库netlib获得,即“自由分发数学库”fdlibm包。这些算法是用C编程语言编写的,可以理解为所有浮点运算都是按照Java浮点运算规则执行的
它取决于JVM实现,但在中,
Math.sin
只调用StrictMath.sin
,它是用调用库提供的sine函数的本机方法实现的
以下是OpenJDK 8中fdlibm正弦函数的C源代码:
- (sin的
功能本身)sin
- (实现
时使用的sin
函数)\uu内核\u sin
后一个文件包含描述算法的注释。关键点似乎是“
sin(x)
由13次多项式逼近”。它看起来像是sin
将x
参数转换为(-pi/4,+pi/4)范围内的等效值,\uu kernel\u sin
在该范围内执行足够精确的多项式近似
请注意,尽管
Math.sin
方法的实际Java字节码只调用StrictMath.sin
,但JVM除了实际调用该方法外,还可以使用其他方式执行Math.sin
调用。特别是,它可能会将Math.sin
调用转换为相应的本机CPU指令(例如x86FSIN
)。但是对stricmath.sin
的调用将始终使用fdlibm实现。这取决于JVM实现,但在Math.sin
中,只调用stricmath.sin
,该函数是通过调用库提供的sine函数的本机方法实现的
以下是OpenJDK 8中fdlibm正弦函数的C源代码:
- (sin的
功能本身)sin
- (实现
时使用的sin
函数)\uu内核\u sin
后一个文件包含描述算法的注释。关键点似乎是“
sin(x)
由13次多项式逼近”。它看起来像是sin
将x
参数转换为(-pi/4,+pi/4)范围内的等效值,\uu kernel\u sin
在该范围内执行足够精确的多项式近似
请注意,尽管
Math.sin
方法的实际Java字节码只调用StrictMath.sin
,但JVM除了实际调用该方法外,还可以使用其他方式执行Math.sin
调用。特别是,它可能会将Math.sin
调用转换为相应的本机CPU指令(例如x86FSIN
)。但是调用StrictMath.sin将始终使用fdlibm实现。我相当肯定java确实使用泰勒级数来查找三角值。我可以想象,这些函数/方法将很容易实现,使用模数将度数和弧度移动到各自的三角域中。其余的都是精确到某个小数点的泰勒级数
@Gavrilo,下面是我很快编写的一些Python 2.7代码,用于模拟泰勒级数
sin(x)
函数:
from math import factorial as f
from math import sin
from math import pi
def taylorSin(n, d):
# calculates sin(n) using a taylor-
# polynomial of degree d
# implement some sort of modulus to shift n in-
# to the domain of [0, 2*pi] or [-pi, pi]
return helper(n, d, 0)
def helper(n, d, x):
# helper function for taylorSin(n, d)
if d < 1:
return x
else:
if d % 4 == 1:
return helper(n, d - 2, x + float(n**d)/f(d))
elif d % 4 == 3:
return helper(n, d - 2, x + -1*float(n**d)/f(d))
print 'Something screwed up'
return None
testval = 2.13
print 'taylorSin',taylorSin(testval, 25)
print 'sin',sin(testval)
我相当肯定java确实使用泰勒级数来寻找三角值。我可以想象,这些函数/方法将很容易实现,使用模数将度数和弧度移动到各自的三角域中。剩下的都是泰勒的意甲
taylorSin 0.847677840134
sin 0.847677840134