Почему std::sqrt() не работает правильно на двойных данных в C++?

Вот простой код на C++, который я компилирую с использованием TDM-GCC 5.1 32bit (gcc-5.1.0-tdm-1-core) на Windows 8.1 64-битной машине Intel Core i-7.

#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-битных компьютерах.

Что здесь не так?

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, который кажется несовместимым.

Итак, если хотя бы один из вариантов -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 и, следовательно, работает правильно.

Другие вопросы по тегам