2

sinus 我的意思是 c stdlib sin() / fpu assembl;y fsin。

我可以给这个正弦参数大约 16 个十进制数字或更多,例如 sin(1.1e-14); sin(1.2e-14) 然后得到结果,

sinus 在如此小的增量上几乎是线性的,但尽管它也可以以相同的 16 位精度计算,它是否也可以在如此小的增量上精确计算?

(我问这个问题是因为在一段时间内我似乎有点不寻常,因为它在论点和特别是输出值方面都如此精确地计算出来,所以我想知道它是否没有被削减或什么的)

4

2 回答 2

2

IIRC, it starts failing when greater than 9e18 and less than 9e-18 for positive numbers. This is a limitation of the CPU.

Details can be read on http://www.intel.com/design/processor/manuals/253665.pdf under 8.1.3.2 Condition Code Flags specifying the limit of FSIN and friends.

于 2012-11-08T11:19:45.910 回答
2

sin(x) = x - x^3/3 的泰勒级数!+ x^5/5!- ...

任何数字 0 > x > 1 以 10 为底表示为

x = a*10^-n,其中 1<=a<10 例如 x=0.003 = 3*10^-3
x^3 = a^3 * 10^-3n

那么下一项的大小约为 b*10^-3n (忽略阶乘)。随着n的增长(或x接近于零),下一项开始很快消失。

对于 x=0.003,前几项是

   0.003000000000000000 = 10^-3 * 3000000000000000  <-- x
 - 0,000000004500000000 = 10^-3 * 0000004500000000  <-- x^3/3!
 + 0,000000000000002025 = 10^-3 * 0000000000002025  <-- x^5/5!
 ----------------------   -----------------------------
 = 0.002999995500002025 = 10^-3 * 2999995500002025

有 16 位数字忽略前导零和第 4 项 x^7/7!不再影响结果。当 x 变得更小时,接下来是 x^5/5!术语不能添加到结果中,最后是 x^3/3!不能添加(或减去)术语。只有术语 x 可以用 16 位精度表示。

sin(x) = x 仅适用于 x=0。确切地。其他一切都是近似值。即使 sin(pi/2)=1 在数学库中也是近似值,因为参数 pi/2 不能表示为浮点数。

于 2012-11-08T11:13:16.590 回答