【问题标题】:cacosf (Complex arc cos) function in C returns indefiniteC中的cacosf(复弧cos)函数返回不确定的
【发布时间】:2015-07-10 08:20:30
【问题描述】:

我有一个用 MATLAB 编码的算法,它包含一些值的复弧 cos(计算需要 15 的 arccos,大约是 3.4i)。我想编写在我的 Windows 7 PC 上运行的此代码的 C 或 C++ 对应部分。实际上,我想将其生成为使用 Visual Studio C++ 编译的 mex 函数。

我包含了“complex.h”并使用了 cacosf 函数(complex arccos 返回 float _Complex),但我无法将其编译为 mex 函数,因为 Visual C++ 编译器没有具有“complex.h”支持。但是,mex 文件可以将库作为输入,因此我可以使用 MATLAB 支持的另一个编译器编译我的 c 代码(例如 mingw,我使用 gnumex 实用程序将它集成到 matlab。)我下载了 Bloodshed C++在后端使用 mingw 的 IDE,我可以编译我的 c++ 代码。以下 C++ 代码表示与我的目标类似的操作:

#include <stdio.h>
#include <complex.h>

int main() {
    float _Complex myComplex;
    myComplex = cacosf(5);
    printf("Complex number result of acos(5) is : %f + %fi \r\n",crealf(myComplex),cimagf(myComplex));
    return 0;
}

输出应该是:

acos(5) 的复数结果是:0.000000 + -2.292432i

但是我得到了

acos(5) 的复数结果是:-1.#IND00, -0.000000

当我在带有 Eclipse CDT Luna 的 Ubuntu 14.04 计算机上使用 Linux GCC 编译我的 C++ 代码时,我得到了

输出应该是:

acos(5) 的复数结果为:0.000000 + -2.292432i 我哪里错了?为什么我不能在 Windows + mingw setup 中编译这段代码?

注意:当我使用 mingw 时,我可以将 cacosf(0) 计算为 1.570796 + -0.000000。

【问题讨论】:

    标签: c windows gcc mingw complex-numbers


    【解决方案1】:

    您使用的是什么版本的mingwrt?使用mingwrt-3.21.1,以下对我有用,(在Linux 主机上交叉编译,并在wine 下运行):

    $ cat foo.c
    #include <stdio.h>
    #include <complex.h>
    
    int main()
    {
      double _Complex Z = cacos(5.0);
      printf( "arcos(5) = (%g, %gi)\n", __real__ Z, __imag__ Z );
      return 0;
    }
    
    $ mingw32-gcc -o foo.exe foo.c
    
    $ ./foo.exe
    arcos(5) = (0, -2.29243i)
    

    这似乎与您的预期结果一致。但是,如果您使用 any mingwrt 的版本早于 mingwrt-3.21,(并且关于完全损坏的 mingwrt-4.x 的说法越少越好),那么就会出现一个已知的错误,因为任意认为是任何纯真实的 cacos() 参数值大于 (1.0, 0.0i) 以超出有效域,(acos() 的真实部分就是这种情况),这将产生您报告的结果。

    【讨论】:

      【解决方案2】:

      Visual C++,顾名思义,是一个 C++ 编译器。 C++ 使用 &lt;complex&gt; 标头和 std::complex&lt;float&gt; 类型。由于 C++ 有重载,您也可以调用 std::acos 来获取复杂值。

      您的代码实际上是 C,MSVC++ 不再支持它。 (他们在 1996 年左右就停止这样做了)

      【讨论】:

        猜你喜欢
        • 2016-05-13
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2016-10-18
        • 1970-01-01
        • 2011-07-17
        相关资源
        最近更新 更多