double.PositiveInfinity 和我的乘积

product of double.PositiveInfinity and i

我 运行 在 C# 中使用以下非常 st运行ge 产品。下面的测试通过了。

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.

这似乎是一个很好的选择运行。这背后一定有一些思考。我希望这里有人可以提供一些关于正在发生的事情的见解。

不是虚数i的乘法,是复数0+i的乘法。有一个概念上的区别:对于后者,实部可能真的为零或太小而无法表示。乘法基本上使结果的实部为零乘以无穷大,这应该是 NaN。

我认为它只是像这样展开复数乘法:

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

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

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

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);
}

反射 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 中的错误,因为 数学上它是错误的