C# Complex Tanh 对于大值失败

标签 c# complex-numbers

这是 Microsoft 为 ComplexSinh 实现的

public static Complex Sinh(Complex value) /* Hyperbolic sin */
{
    double a = value.m_real;
    double b = value.m_imaginary;
    return new Complex(Math.Sinh(a) * Math.Cos(b), Math.Cosh(a) * Math.Sin(b));
}

以及 Cosh

的实现
public static Complex Cos(Complex value) {
    double a = value.m_real;
    double b = value.m_imaginary;
    return new Complex(Math.Cos(a) * Math.Cosh(b), - (Math.Sin(a) * Math.Sinh(b)));
}

最后是 Tanh

的实现
public static Complex Tanh(Complex value) /* Hyperbolic tan */
{
    return (Sinh(value) / Cosh(value));
}

来源:https://referencesource.microsoft.com/System.Numerics/a.html#e62f37ac1d0c67da

我不明白为什么 Microsoft 以这种方式实现 Tanh 方法?

对于非常大的值,它将失败。例如:

  • tanh(709 + 0i) --> 1,好的
  • tanh(711 + 0i) --> NaN,失败应该是1

关于如何改进 tanh 方法的任何想法?

对于 doubleMath.Tanh 方法适用于较大的值。

最佳答案

复杂的 tanh 方法可以这样实现:

public static Complex Tanh(Complex value)
{
    double a = value.Real;
    double b = value.Imaginary;
    double tanh_a = Math.Tanh(a);
    double tan_b = Math.Tan(b);
    Complex num = new Complex(tanh_a, tan_b);
    Complex den = new Complex(1, tanh_a * tan_b);
    return num / den;
}

这也适用于大值,请参阅 https://dotnetfiddle.net/xGWdQt .

更新

同样需要重新实现复杂的 tan 方法,因为它适用于较大的值(虚部):

public static Complex Tan(Complex value)
{
    double a = value.Real;
    double b = value.Imaginary;
    double tan_a = Math.Tan(a);
    double tanh_b = Math.Tanh(b);
    Complex num = new Complex(tan_a, tanh_b);
    Complex den = new Complex(1, -tan_a * tanh_b);
    return num / den;
}

参见 https://dotnetfiddle.net/dh6CSG .

关于C# Complex Tanh 对于大值失败,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53394109/

相关文章:

C# PropertyGrid - 如何使数组元素只读?

c# - 访问 COM 对象

c# Windows 窗体应用程序在错误后使进程继续运行

c++ - 如何在 C++ 中使用复数?

python - 写一个函数来乘以复数

c# - FindControl - 找不到下拉列表

c# - 可以在 .NET (C#/VB) 中打开/操作 Java Web 应用程序吗?

perl - 在 Perl 的 PDL::Complex 中转置

python - python中负稀疏矩阵的sqrt

CMPLX 使用 GCC 产生 undefined symbol