Search code examples
c++windowsdoublesqrttdm-gcc

Why does not std::sqrt() work correctly on double data in C++?


Here is a simple code in C++ which I am compiling using TDM-GCC 5.1 32bit (gcc-5.1.0-tdm-1-core) on a Windows 8.1 64bit Intel core i-7 machine.

#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;
}

But on running, it gives the following output

nan

However, it works correctly with TDM-GCC 32bit compiler on a 32 bit machine.

Also, when I am changing the datatype to float, it is working properly on both 32bit and 64 bit computers.

What is wrong here?


Solution

  • The problem is as follows:

    It was compiled inherently in the Code::Blocks with the following command (narrowed):

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

    where C:\Program Files (x86)\GnuWin32\lib has an old math library named libm.a.

    So, on putting -lm along with -L"C:\Program Files (x86)\GnuWin32\lib", it is found using Process Explorer that main.exe is using that corresponding old libm5.dll which seems to be incompatible.

    So, if at least one of the options -lm or -L"C:\Program Files (x86)\GnuWin32\lib" is removed and compiled as follows:

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

    or

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

    or

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

    it is not linking the old libm.a and hence running correctly.