关于sin
用表格计算基本函数的文献参考公式:
sin(x) = sin(Cn) * cos(h) + cos(Cn) * sin(h)
Run Code Online (Sandbox Code Playgroud)
其中x = Cn + h
,Cn
是针对其恒定sin(Cn)
和cos(Cn)
已被预先计算并在表中可用的,并且,如果以下半乳糖的方法,Cn
已被选择为使得两个sin(Cn)
和cos(Cn)
密切由浮点数近似.数量h
接近0.0
.此公式的参考示例是本文(第7页).
我不明白为什么这是有道理的:cos(h)
然而,它被计算,对于某些值,至少0.5 ULP可能是错误的h
,并且因为它接近1.0
,这似乎对结果的准确性有极大的影响.sin(x)
以这种方式计算.
我不明白为什么不使用下面的公式:
sin(x) = sin(Cn) + (sin(Cn) * (cos(h) - 1.0) + cos(Cn) * sin(h))
Run Code Online (Sandbox Code Playgroud)
然后两个量(cos(h) - 1.0)
,并sin(h)
可以用,很容易做出准确的,因为它们产生接近零的结果多项式来近似.为价值观sin(Cn) * (cos(h) - 1.0)
, cos(Cn) * sin(h)
并为他们的总和仍然很小,其绝对精度,该总和表示,因此,加入这个量的少量ULPS表达sin(Cn)
几乎是正确舍入. …
我如何定义以度为单位而不是通常的弧度的参数的三角函数,并为这些参数计算正确的舍入结果?
在将参数M_PI/180.0
传递给弧度中的相应函数之前将参数乘以不起作用,因为M_PI/180.0
它不是π/ 180."浮点运算手册"第5.5节提供了一种方法来计算参数的正确舍入乘积π/ 180,但是一些参数仍然是这样的,即该乘积接近两个连续可表示浮点数之间的中点,然后在弧度中应用甚至正确舍入的函数可能会产生错误的最终结果.
其可以单独或组合工作的两种策略是使用较高的精度和使用sinpi
,cospi
,tanpi
从三角函数CRlibm,分别计算sin(?x)
,cos(?x)
和tan(?x)
.
对于后一种策略,存在180分割的问题,这对许多论点来说并不完全正确.
关于更高精度的策略(将参数乘以π/ 180的扩展精度表示,然后应用弧度的扩展精度函数),"精确"情况可能仍然存在问题.指出的唯一合理结果的定理sin
,cos
和tan
一个合理的说法中得到0
仅适用于弧度版本.它显然不适用于度数版本,如果对于某些浮点输入x,sindeg(x)恰好是两个连续可表示的浮点数之间的中点,那么没有多少中间精度足以保证最终结果是正确舍入的.
p = perms([0:2])
Run Code Online (Sandbox Code Playgroud)
p =
2 1 0
2 0 1
1 2 0
1 0 2
0 1 2
0 2 1
Run Code Online (Sandbox Code Playgroud)
该函数应该以反向字典顺序显示向量的排列.因此,我希望此输出的最后一行包含元素0 1 2
; 但是,它包含0 2 1
.其他行正确显示.
简而言之,最后两行的顺序是互换的.这里发生了什么?
math matlab permutation discrete-mathematics elementary-functions