我在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.
这似乎是一个奇怪的选择。必须有一些思考背后。我希望这里有人可以提供一些有关正在发生的事情的见解。
答案 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_real
为double.PositiveInfinity
且right.m_real
为0时,第一个操作left.m_real * right.m_real
为Double.NaN
(这也是多边效果顺序无关紧要的原因)。
这似乎是一种不受欢迎的行为,因为operator
中的计算在逻辑上对于每个有限数字都是正确的,但0 * infinite
的定义不正确对于该情况。
我想这是operator
中的错误,因为在数学上是错误的。