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_real
为double.PositiveInfinity
且right.m_real
为0时,第一个运算left.m_real * right.m_real
为Double.NaN
(这也是乘法顺序不成立的原因'无关紧要)。
这似乎是一种不需要的行为,因为从逻辑上讲,在 operator
中完成的计算对于每个有限数都是正确的,但是 0 * infinite
在这种情况下 的定义不正确 .
我猜这是 operator
中的错误,因为 数学上它是错误的。
我 运行 在 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_real
为double.PositiveInfinity
且right.m_real
为0时,第一个运算left.m_real * right.m_real
为Double.NaN
(这也是乘法顺序不成立的原因'无关紧要)。
这似乎是一种不需要的行为,因为从逻辑上讲,在 operator
中完成的计算对于每个有限数都是正确的,但是 0 * infinite
在这种情况下 的定义不正确 .
我猜这是 operator
中的错误,因为 数学上它是错误的。