C++中开方出现错误

重点看 k=int(sqrt (m)); 提示说more than one instance of overloaded function "sqrt" matches the argument list:

int _tmain(int argc, _TCHAR* argv[])
{int m,k,i,n=0;
bool prime;
for(m=101;m<=200;m=m+2)
{prime=true ;
k=int(sqrt (m));
for(i=2;i<=k;i++)
if( m%i==0)
{prime=false;
break;
}
if(prime)
{cout<<setw(5)<<m;
n=n+1;}
if(n%10==0)
cout<<endl;
}

return 0;
}

这要看什么……sqrt只有接受三种精度的浮点数的函数重载,而int转换到三种浮点数的优先级相同,所以会报有多个函数的重载形式符合要求的错误,显式指定一下k=int(sqrt ((float)m));或者k=int(sqrtf (m));就是了……追问

我还是不太明白。您能详细讲下吗。
1 这个float是说谁呢? m是int型啊
2 sqrt只有接受三种精度的浮点数的函数重载 是什么意思啊?
3 那为什么又说有多种 sqrt函数 符合要求呢?

追答

首先你知道C++有“函数重载”这个东西对吧。sqrt函数就有三个重载形式,分别是
double sqrt(double _X);
long double sqrt(long double _X);
float sqrt(float _X);
(后两个函数只是调用第一个函数处理)
这三个形式分别是接受一个double 型浮点数,接受一个long double 型浮点数,接受一个float 型浮点数,因此没有完全符合k=int(sqrt (m));里面的m的类型的参数,编译器就会试着转换m的类型,但由于把m的类型转换为double、long double 、float 的优先级相同,每个转换都能找到对应的函数,所以编译器会报错。只有告诉编译器:把m的类型转换为float 型(当然选择另外两种也是可以的,只要你告诉编译器),编译器才能正确地继续编译

温馨提示:内容为网友见解,仅供参考
第1个回答  2013-02-08
不知道是什么编译器,是不是c99。
你需要头文件 #include <cmath> 或 #include <math.h>

k=int(sqrt (m)); 要写成
k= (int) (sqrt ( (double) m));
否则 int(..) 是 函数。(int) 才是强制转换--cast追问

为什么要加(double)啊

追答

sqrt 参数需 double 型。 不加(double)也可以,加了更保险,因为你在调试程序,加了,保证参数无错。放心去查别的地方。

本回答被网友采纳
第2个回答  2013-02-11
用vs2008给出了明确的错误提示:

error C2668: “sqrt”: 对重载函数的调用不明确
可能是“long double sqrt(long double)”
或 “float sqrt(float)”
或 “double sqrt(double)”
第3个回答  2017-08-01
k=int(sqrt (m));改为
k=(int)(sqrt (m));
第4个回答  2013-02-08
math.h用上了吗

C++中开方出现错误
这要看什么……sqrt只有接受三种精度的浮点数的函数重载,而int转换到三种浮点数的优先级相同,所以会报有多个函数的重载形式符合要求的错误,显式指定一下k=int(sqrt ((float)m));或者k=int(sqrtf (m));就是了……

C++ 关于开方的问题
这句不对,因为sqrt的参数基本都是double, float或者long double型的。你下面的调用实际上是进行了类型转换。相当于x = int(sqrt(double(i+100)));

C++ 开平方 算符
std::sqrt(9) \/\/ 是错误的,因为编译器不知道7是float?double?long double?你必须写成 std::sqrt(9.0) \/\/double 它返回的是一个右值(right-value)即它就是3.0,std::sqrt(9.0) = 6.0;是错的 double x;x = std::sqrt(9.0); \/\/ x = 3.0;这样才是对的 如果你要对一个整...

c++,求开方的整数部分,比如求根号3的话,输出是1, 求根号8的话,输出是...
if(t < n) return integerSqrt(n, mid, upperBound);return integerSqrt(n, lowerBound, mid);} 错了一个变量 重新提交了一下 你试试

C++出错,invalid operands to binary expression
开根号,不能这样写 :(1.0-x*sin(t)*sin(t))^0.5)要写成:sqrt( 1.0-x*sin(t)*sin(t) )^是C中的“异或”运算符,不是开方运算符!

c++中的开方数学函数问题
m=pow(n,1\/0.758);pow函数的原型是:double pow(double,double);所以它的返回值是double类型的!!!为什么关闭刚才的问题,这样做涉嫌恶意关闭!

问一个c++迭代法开方的问题:
一、a\/2是可以的,其他值也可以,如a\/3,a\/4等等 二、你的程序有问题,while(fabs(x0-x1)<=1e-5)改为while(fabs(x0-x1)>=1e-5)三、可以 四、不好意思,我暂时还不知道,其实你的方法已经很高效了

c++中,怎么运用开方功能
详细解释如下:一、引入数学库 在C++中,开方运算属于数学运算的一种,因此需要用到标准库中的数学函数。具体到开方运算,可以使用 `` 库中的 `sqrt` 函数。二、使用sqrt函数 `sqrt` 函数用于计算一个数的平方根。它的使用非常简单,只需要在代码中引入 `` 库,然后就可以直接调用 `sqrt` 函数来...

vc++中开根号怎么搞
include <cmath> \/\/ C++ header#include <math.h> \/\/ C headerdouble sqrt(double); \/\/ 还有一系列不同类型参数的重载,平方根double pow(double, double); \/\/ 幂次方,如计算 123的3次开方:double result = pow(123, 1.0 \/ 3);

c++中怎么输入根号
C++中是不能直接输入并使用根号的,如果想进行开方计算的话,可以使用sqrt函数,例如,y=sqrt(x);意即将根号下x赋值给y。值得注意的是,sqrt函数使用之前需要包含<math.h>

相似回答