2015-07-10 14 views
0

我有一個算法在MATLAB編碼,其中含有一些數值的複雜弧COS(計算需要的15 ARCCOS,這大約是3.4i)。我想在我的Windows 7 PC上運行此代碼的C或C++代碼。實際上,我想將它作爲一個用Visual Studio C++編譯的mex函數來生成。cacosf(複雜弧COS)函數返回不定

我列入「complex.h」和使用cacosf功能(複雜的反餘弦返回浮動_Complex),但因爲Visual C++編譯器有「complex.h」支持,我不能編譯成MEX功能。然而,MEX文件可能需要庫作爲輸入,這樣我就可以編譯另一個編譯器,MATLAB不支持我的C代碼(例如MinGW的,我結合它與gnumex實用Matlab的。)我下載流血C++ IDE它使用MinGW的在後端,我可以編譯我的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

當我編譯我的C++與Linux的GCC代碼的Ubuntu 14.04的計算機上使用Eclipse CDT月神我得到

輸出應該是:ACOS的

複數結果(5):0.000000 + -2.292432i 我在哪裏可以是錯的?爲什麼我無法在Windows + mingw安裝程序中編譯此代碼?

注:我可以計算cacosf(0)作爲1.570796 + -0.000000當我使用MinGW的。

回答

0

您正在使用什麼版本的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) 

這似乎與你預期的結果是一致的。但是,如果您使用任何mingwrt版本要早mingwrt-3.21,(和較少談到徹底打破mingwrt-4.x越好),再有就是從任意推定任何純實cacos()參數值比(1.0, 0.0i)大於被外界造成一個已知的bug有效的域(如其實際部分acos()的情況),這將產生您報告的結果。

0

正如其名稱所示,Visual C++是一個C++編譯器。 C++使用<complex>標題和std::complex<float>類型。由於C++已經超載,因此您也可以調用std::acos獲取複雜值。

您的代碼實際上是C,不再受MSVC++支持。 (他們在1996年左右停止了這樣做)