double.PositiveInfinity和i的产品

时间:2015-09-21 06:28:22

标签: c# complex-numbers

我在C#遇到了以下非常奇怪的产品。下面的测试通过了。

public void InfinityTimesITest() {
  Complex infinity = new Complex(double.PositiveInfinity, 0);
  Complex i = new Complex(0, 1);
  Complex product = infinity * i;
  double real = product.Real;
  double imaginary = product.Imaginary;
  Assert.IsNaN(real);
  Assert.IsTrue(Double.IsPositiveInfinity(imaginary));
}

如果您颠倒产品中的术语顺序,它也会通过。但是在数学上考虑这个问题,C#似乎在说:

 infinity * i = (real NaN) + infinity * i.

这似乎是一个奇怪的选择。必须有一些思考背后。我希望这里有人可以提供一些有关正在发生的事情的见解。

3 个答案:

答案 0 :(得分:2)

它不是虚数i的乘法,而是乘以复数0 + i。存在概念上的差异:对于后者,实部可能真正为零或者太小而无法表示。乘法基本上使得结果的实部为零无穷大,这应该是NaN。

答案 1 :(得分:1)

我认为它只会扩展复杂的乘法:

(inf + 0i) * (0 + i) = inf * 0 + inf * i + 0i * 0 + 0i * i = inf * 0 + inf * i

第一项是无穷大和零的乘积 - 所以楠。第二个词是虚无穷。

编辑:如果查看源代码,复数乘法运算符如下所示:

public static Complex operator *(Complex left, Complex right)
{
  return new Complex(left.m_real * right.m_real - left.m_imaginary * right.m_imaginary, left.m_imaginary * right.m_real + left.m_real * right.m_imaginary);
}

答案 2 :(得分:0)

反映Complex *operator您可以通过以下方式看到它:

[DynamicallyInvokable]
public static Complex operator *(Complex left, Complex right)
{
    return new Complex(left.m_real * right.m_real - left.imaginary * right.m_imaginary, left.imaginary * right.m_real + left.m_real * right.m_real);
}

对大多数情况来说哪个好,只有一个问题:

left.m_realdouble.PositiveInfinityright.m_real为0时,第一个操作left.m_real * right.m_realDouble.NaN(这也是多边效果顺序无关紧要的原因)。 这似乎是一种不受欢迎的行为,因为operator中的计算在逻辑上对于每个有限数字都是正确的,但0 * infinite的定义不正确对于该情况

我想这是operator中的错误,因为在数学上是错误的