C# C与复数的奇异幂

C# C与复数的奇异幂,c#,mono,C#,Mono,我一直在玩C中的复数,我发现了一些有趣的东西。不确定这是一个bug还是我刚刚错过了什么,但是当我运行以下代码时: var num = new Complex(0, 1); var complexPow = Complex.Pow(num, 2); var numTimesNum = num * num; Console.WriteLine("Complex.Pow(num, 2) = {0} num*num = {1}", complexPow.ToString(), numTimesNum

我一直在玩C中的复数,我发现了一些有趣的东西。不确定这是一个bug还是我刚刚错过了什么,但是当我运行以下代码时:

var num = new Complex(0, 1);
var complexPow = Complex.Pow(num, 2);
var numTimesNum = num * num;
Console.WriteLine("Complex.Pow(num, 2) = {0}   num*num = {1}", complexPow.ToString(), numTimesNum.ToString());
我得到以下输出:

Complex.Pow(num, 2) = (-1, 1.22460635382238E-16)   num*num = (-1, 0)
如果内存可用,复数乘以本身应该是-1,没有虚部,或者说虚部是0。那么为什么不复杂呢?Pownum,2给1?1.22460635382238E-16从哪里来

如果重要的话,我正在使用mono,因为我不在Windows atm中。我想它可能是64位的,因为我运行的是64位操作系统,但我不确定在哪里检查

保重,, 克尔

编辑:

好吧,我解释得不好。我当然是指I的平方是-1,而不是任何复数的平方。谢谢你指出这一点。现在有点累,所以我的大脑工作不太好,哈哈

编辑2:


为了澄清一些事情,我最近读了一点数学书,并决定制作一种小型脚本语言来取乐。好的,脚本语言是一个over语句,它只计算公式,其他什么都没有。

您看到的是浮点不精确

1.22460635382238E-16实际上是0.00000000000012

Pow可能是通过使用三角函数计算任意幂来实现的。 因此,它会受到浮点运算和trig的不精确性的影响。 它显然没有任何整数幂的特例代码,这可能更简单


普通只涉及简单的算术运算,因此当数字是整数时,它不会受到浮点不精确的影响。

您会看到浮点不精确

1.22460635382238E-16实际上是0.00000000000012

Pow可能是通过使用三角函数计算任意幂来实现的。 因此,它会受到浮点运算和trig的不精确性的影响。 它显然没有任何整数幂的特例代码,这可能更简单

普通只涉及简单的算术运算,因此当数字是整数时,它不会受到浮点不准确的影响

那么为什么不复杂呢?Pownum,2给1?1.22460635382238E-16从哪里来

我怀疑这基本上是一个舍入误差。毕竟,这是一个非常小的数字。我不知道Complex.Pow的细节,但如果我发现它在某处使用了一些三角函数,我一点也不会感到惊讶——你可能已经注意到了这样一个事实,pi/2并不能精确地表示为双精度

*操作可以通过更简单的定义来避免这种情况——复杂。Pow可能是一种特殊情况,在幂为2的情况下只使用x*x,但我认为还没有这样做。取而代之的是使用一种通用算法,该算法给出的答案与假设的答案非常接近,但可能会导致小错误

那么为什么不复杂呢?Pownum,2给1?1.22460635382238E-16从哪里来

我怀疑这基本上是一个舍入误差。毕竟,这是一个非常小的数字。我不知道Complex.Pow的细节,但如果我发现它在某处使用了一些三角函数,我一点也不会感到惊讶——你可能已经注意到了这样一个事实,pi/2并不能精确地表示为双精度

*操作可以通过更简单的定义来避免这种情况——复杂。Pow可能是一种特殊情况,在幂为2的情况下只使用x*x,但我认为还没有这样做。取而代之的是使用一种通用算法,该算法给出的答案与假设的答案非常接近,但可能会导致小错误

那么为什么不复杂呢?Pownum,2给1?1.22460635382238E-16从哪里来

标准问题,以及用于计算复杂数据的算法。Pow它并不像你想象的那么简单。请注意,1.22460635382238E-16非常小,接近机器ε。此外,这里的一个关键事实是,0,1实际上是1,在极坐标中为pi/2,而pi/2在浮点中没有精确的表示

如果这让你感到不舒服,我建议你阅读。它应该是大学CS课程的必读内容

那么为什么不复杂呢?Pownum,2给1?1.22460635382238E-16从哪里来

标准问题,以及用于计算复杂数据的算法。Pow它并不像你想象的那么简单。请注意,1.22460635382238E-16非常小,接近机器ε。此外,这里的一个关键事实是,0,1实际上是1,在极坐标中为pi/2,而pi/2在浮点中没有精确的表示


如果这让你感到不舒服,我建议你阅读。这应该是大学CS课程的必读内容。

i^2是-1。但是,ai^2是-1*a。还要注意:在基于英特尔的处理器上,对于大于9e18和-9e18的值,sin和cos是完全不可靠的。可以在8.1.3.2条件代码标志下阅读详细信息,该标志指定FSIN和friends的限制。i^2为-1。然而,ai^2 i
s-1*a。还要注意:在基于英特尔的处理器上,对于大于9e18和-9e18的值,sin和cos是完全不可靠的。详细信息可以在8.1.3.2条件代码标志下阅读,条件代码标志指定了FSIN和friends的限制。值得注意的是,除了效率问题外,不能在重复乘法中实现Pow的主要原因是Pow需要支持非整数。你不能把一个数字本身乘以1.5倍。听起来不错。有什么办法解决这个问题吗?正如我在编辑的文章中提到的,这是一种小型脚本语言,我更希望能找到一种更准确的方法来处理求幂运算。@Servy这是我需要能够做到的事情之一。我能做的也许是做一些欺骗,将整数指数重写为乘法,即使我现在不知道该怎么做:p.值得注意的是,除了效率问题之外,不能在重复乘法中实现Pow的主要原因是Pow需要支持非整数。你不能把一个数字本身乘以1.5倍。听起来不错。有什么办法解决这个问题吗?正如我在编辑的文章中提到的,这是一种小型脚本语言,我更希望能找到一种更准确的方法来处理求幂运算。@Servy这是我需要能够做到的事情之一。我能做的也许是做一些欺骗,把整数指数改写成乘法,即使我现在不知道该怎么做:p。谢谢你提供了De Moivres公式的链接。我不知道。谢谢你链接到De Moivres公式。我不知道这件事。