c ++中的sqrt问题

时间:2010-11-18 17:12:04

标签: 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.x))+((a.y-b.y)*(a.y-b.y)));
}

int main(){
    return 0;
}

构建输出:

1>------ Build started: Project: distance, Configuration: Debug Win32 ------
1>  distance.cpp
1>d:\...\distance.cpp(13): error C2668: 'sqrt' : ambiguous call to overloaded function
1>          c:\...\vc\include\math.h(589): could be 'long double sqrt(long double)'
1>          c:\...\vc\include\math.h(541): or       'float sqrt(float)'
1>          c:\...\vc\include\math.h(127): or       'double sqrt(double)'
1>          while trying to match the argument list '(const int)'
========== Build: 0 succeeded, 1 failed, 0 up-to-date, 0 skipped ==========

6 个答案:

答案 0 :(得分:4)

sqrt需要一个double(显然是你编译器中的各种不同的双精度数) - 你传递的是一个int

只做sqrt((double)....)

确定 - 更确切地说,sqrt()必须采用浮点数 - 浮点数或双精度数。由于各种历史原因,它通常能够在不同的浮点类型之间进行转换。执行sqrt计算的CPU位可​​能(假设为x86)以80位进行计算,既不是float也不是double /

答案 1 :(得分:4)

这应该有效

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

sqrt()不将int作为参数。

答案 2 :(得分:4)

你不能取整数的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,然后(int)将其转换回int。您还应该考虑是否要始终如一地使用双打。

答案 3 :(得分:4)

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

如果使用整数参数(例如sqrt)调用sqrt(9),则可以将整数强制转换为这三种类型中的任何。那么应该调用哪个函数?编译器不知道。这是不明确的,所以你得到一个错误迫使你明确选择你想要的重载。只需转换参数以匹配其中一个重载:sqrt(static_cast<float>(((a.x-b.x)*(a.x-b.x))+((a.y-b.y)*(a.y-b.y)))

答案 4 :(得分:0)

有三种sqrt方法:一种采用long,一种采用float,另一种采用double值。

尝试

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

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

答案 5 :(得分:0)

您实际上已将int传递给sqrt,该float只接受doublelong doublesqrt类型的参数。此外,int不会返回float k = sqrt((float)(...)); float k = sqrt(static_cast<float>(...)); 。编译器无法猜测要进行的类型转换,因此您必须自己使用C风格的转换或“新风格”转换来强制转换:

{{1}}

另外,正确缩进代码;它使阅读更容易。