2

これは、Windows 8.1 64 ビットIntel Core i-7 マシンでTDM-GCC 5.1 32 ビット(gcc-5.1.0-tdm-1-core) を使用してコンパイルしている C++ の単純なコードです。

#include <iostream>
#include <cmath>

using namespace std;

int main()
{
    double a, b;
    a = 0.002;
    b = 0.004;
    cout << std::sqrt(a*a+b*b)<< endl;
    return 0;
}

しかし、実行すると、次の出力が得られます

nan

ただし、32 ビット マシン上の TDM-GCC 32 ビット コンパイラでは正しく動作します。

また、データ型をfloatに変更すると、32 ビットと 64 ビットの両方のコンピューターで正しく動作します。

ここで何が問題なのですか?

4

1 に答える 1

1

問題は次のとおりです。

次のコマンドを使用して、Code::Blocks で本質的にコンパイルされました (絞り込み):

g++.exe -L"C:\Program Files (x86)\GnuWin32\lib" -o main.exe main.cpp -lm

C:\Program Files (x86)\GnuWin32\libにはlibm.aという名前の古い数学ライブラリがあります。

-lmそのため、と一緒に置くと-L"C:\Program Files (x86)\GnuWin32\lib"Process Explorerを使用して、 main.exeが互換性のないように見える対応する古いlibm5.dllを使用していることがわかります。

したがって、オプションまたはオプションの少なくとも 1 つ削除され、次のようにコンパイルされた場合:-lm-L"C:\Program Files (x86)\GnuWin32\lib"

g++.exe -L"C:\Program Files (x86)\GnuWin32\lib" -o main.exe main.cpp

また

g++.exe -o main.exe main.cpp -lm

また

g++.exe -o main.exe main.cpp 

古いものをリンクしていないlibm.aため、正しく実行されています。

于 2015-12-01T13:26:12.897 に答える