Почему 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
и, следовательно, работает правильно.