C# 复杂。战俘缺乏精确性

C# 复杂。战俘缺乏精确性,c#,precision,complex-numbers,C#,Precision,Complex Numbers,使用Complex.Pow()计算i^2125会得到复杂的结果 (1.42553220285208E-13, 1) 我如何表达对Complex.Pow()的调用并不重要-以下每一项都给出相同的结果: Complex.Pow(Complex.ImaginaryOne, 2125.0) Complex.Pow(Complex.ImaginaryOne, new Complex(2125.0, 0)) Complex.Pow(new Complex(0.0, 1.0), new Complex(21

使用Complex.Pow()计算i^2125会得到复杂的结果

(1.42553220285208E-13, 1)
我如何表达对Complex.Pow()的调用并不重要-以下每一项都给出相同的结果:

Complex.Pow(Complex.ImaginaryOne, 2125.0)
Complex.Pow(Complex.ImaginaryOne, new Complex(2125.0, 0))
Complex.Pow(new Complex(0.0, 1.0), new Complex(2125.0, 0))
我知道双精度浮点数的精度不是无限的,但这里基数的实部是0.0——为什么0的精度(复合)会不足?(复合是因为随着指数的增加,结果的真实部分的精度也会降低)

而且。。。因为我知道基数的实部是0.0,所以我可以将结果的实部设为0.0,但这是处理一般结果的最佳方法吗

编辑-在阅读了下面的一些评论后,我做了以下工作:

Complex.Pow(Complex.ImaginaryOne, 999999999)
并得到如下结果:

(-1.79531386009907E-07, -0.999999999999984)

因此,实际零件的精度损失超过3位数。为什么会这样?

检查它是如何实现的,因为虚部精度不足会影响实部。Complex.Pow()会导致实部和虚部都影响结果的实部。Double提供53位二进制精度(15位十进制数字),每次计算产生+/-0.5位舍入误差。最坏的情况是,每~3次计算(不包括减法运算)可能会丢失一位小数精度。在代码中计算它们,有7个计算需要四舍五入加上实际部分的Math.E,这样在最坏的情况下,您可能会丢失3位数。由于虚部为1.0,结果比+/-1E-12更精确,1.4E-13在预期精度范围内。@Hans Passant我怎么知道(例如)Math.Atan2或Math.cos中没有进一步的计算需要舍入,因此会丢失数字?在哪里停止计算?每次计算都会带来一些损失。计算越多,损失就越大,所以我认为对于指数较大的幂,双精度是不够的。除了复杂的方法将decimal转换为Double之外,使用一个大的decimal类型,因此没有任何好处。。。