为什么std::sqrt()不能正确处理C++;? 这是C++编写的一个简单代码,我在Windows 8.1强×64位 I-7机上使用 TTD-GCC 5.1 32位 >(GCC-5.1.0 TDM-1内核)。 #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; }

为什么std::sqrt()不能正确处理C++;? 这是C++编写的一个简单代码,我在Windows 8.1强×64位 I-7机上使用 TTD-GCC 5.1 32位 >(GCC-5.1.0 TDM-1内核)。 #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; },c++,windows,double,sqrt,tdm-gcc,C++,Windows,Double,Sqrt,Tdm Gcc,但是,它可以在32位机器上与TDM-GCC 32位编译器正常工作 另外,当我将数据类型更改为浮动时,它在32位和64位计算机上都能正常工作 这里出了什么问题?问题如下: g++.exe -L"C:\Program Files (x86)\GnuWin32\lib" -o main.exe main.cpp 它是在Code::Blocks中固有地使用以下命令(缩小)编译的: 其中C:\ProgramFiles(x86)\GnuWin32\lib有一个名为libm.a的旧数学库 因此,在将-lm与

但是,它可以在32位机器上与TDM-GCC 32位编译器正常工作

另外,当我将数据类型更改为浮动时,它在32位和64位计算机上都能正常工作


这里出了什么问题?

问题如下:

g++.exe -L"C:\Program Files (x86)\GnuWin32\lib" -o main.exe main.cpp
它是在Code::Blocks中固有地使用以下命令(缩小)编译的:

其中C:\ProgramFiles(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


它没有链接旧的
libm.a
,因此无法正确运行。

在带有GCC 5的Linux/x86-64(Debian/Sid)上正常工作。2@BasileStarynkevitch它在MSVC 2012上也能正常工作。使用
-S
并比较两个GCC之间的装配输出。或者,至少,附加两个可执行文件。似乎是。有趣的是,类似于叮当声的东西甚至在运行时都不会出现。
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