C++ c+中的sqrt问题+;

C++ c+中的sqrt问题+;,c++,C++,为什么这里有错误 #include <iostream> #include <math.h> #include <vector> #include <ostream> using namespace std; struct Point { int x,y; }; int distance (const Point& a,const Point& b){ int k= sqrt(((a.x-b.x)*(a.x-b

为什么这里有错误

#include <iostream>
#include <math.h>
#include <vector>
#include <ostream>

using namespace std;

struct Point {
    int x,y;
};

int distance (const Point& a,const Point& b){
    int k= sqrt(((a.x-b.x)*(a.x-b.x))+((a.y-b.y)*(a.y-b.y)));
}

int main(){
    return 0;
}
sqrt接受一个double(显然编译器中有各种不同的double)——您正在向它传递一个int

只需做sqrt((双)…)


Ok-更准确地说,sqrt()必须采用浮点数-浮点数或双精度浮点数。由于各种历史原因,它通常能够在不同的浮点类型之间转换。执行sqrt计算的CPU位(假设x86)可能是以80位进行计算,这既不是浮点也不是双精度的计算。有三种sqrt方法:一种是长精度的,一种是浮点精度的,另一种是双精度的

试一试

要告诉编译器您要使用双精度版本,然后再转换回int。

应该可以

   float k= sqrt((float)((a.x-b.x)*(a.x-b.x))+((a.y-b.y)*(a.y-b.y)));

sqrt()不接受int作为参数。

不能接受整数的sqrt。它必须是一个浮点数

您需要这样做:

int k= (int)sqrt((double)((a.x-b.x)*(a.x-b.x))+((a.y-b.y)*(a.y-b.y)));

(double)将int转换为double ant,之后(int)将其转换回int。你也应该考虑是否要使用双打。

你实际上通过了<代码> int >代码> <代码> Sqrt>代码>,它只接受类型<代码>浮标,<代码>双或<代码> long double < /代码>。此外,
sqrt
不会返回
int
。编译器无法猜测要进行什么类型转换,因此您必须使用C样式转换或“新样式”转换自己进行转换:

float k=sqrt((float)(…);
浮球k=sqrt(静态抛投(…);

此外,适当缩进代码;它使阅读更容易。

有三个
sqrt
重载,它们采用不同的参数:
float-sqrt(float)
double-sqrt(double)
long-double-sqrt(long-double)
。您可以在编译器输出中看到这些


如果使用整数参数调用
sqrt
,如
sqrt(9)
,则可以将整数转换为这三种类型中的任何一种。那么应该调用哪个函数呢?编译器不知道。它是不明确的,因此会出现一个错误,迫使您显式选择所需的重载。只需将参数投给一个重载,以匹配这样的代码:<代码> Sqt(StasyType((A.X-B.X)*(A.X-B.X))+((A.Y.BY)*(A.Y.B.Y))< < /P> <代码> SqRt> /Case>,对于C++代码>浮点< /C> >,>代码>长双双/代码>和<代码>双< /C> > C++。(参见26.5 [ LI.C.MaTi])…和<代码>浮点< /代码>“另一个
double
".@You-这只是一个正在节食的替身。从c++11开始,你可以将int传递给sqrt。查找cpp参考网站,例如What's
std::dynamic\u cast
?!!和
dynamic\u cast
dynamic\u cast
在没有虚拟函数的类型上不起作用。这应该是
static\u cast
。几乎可以。
static\u cast
请使用“代码> STD::/CODE >。使用双优先于浮点。为什么放弃精度,FPU可能会在双操作上运行,然后丢弃精度转换回浮点。显然,当前的C++标准要求调用SqRT(int)。转换为double而不出现过载警告/错误。有关详细信息,请参阅Shafik的答案:但是,由于编译器版本会有所不同,转换为double可能仍然是一个好主意。
   float k= sqrt((float)((a.x-b.x)*(a.x-b.x))+((a.y-b.y)*(a.y-b.y)));
int k= (int)sqrt((double)((a.x-b.x)*(a.x-b.x))+((a.y-b.y)*(a.y-b.y)));
float k = sqrt((float)(...));
float k = sqrt(static_cast<float>(...));