sqrt编译报错,是怎么回事

时间:2022-06-02 04:47:26
大家看一下以下是怎么回事,sqrt为什么用不了?



#include "stdafx.h"
#include "math.h" 


int _tmain(int argc, _TCHAR* argv[])
{

long int i,x,y,z; 
for (i=1;i<100000;i++) 

x=sqrt(i+100);    /*x为加上100后开方后的结果*/ 
y=sqrt(i+268);    /*y为再加上168后开方后的结果*/ 
if(x*x==i+100&&y*y==i+268)/*如果一个数的平方根的平方等于该数,这说明此数是完全平
  方数*/ 
  printf("\n%ld\n",i); 

return 0;
}





错误描述以下:

错误 1 error C2668: “sqrt”: 对重载函数的调用不明确 d:\mydocuments\visual studio 2008\studysubject\studysubject\studysubject.cpp 14

错误 2 error C2668: “sqrt”: 对重载函数的调用不明确 d:\mydocuments\visual studio 2008\studysubject\studysubject\studysubject.cpp 15

11 个解决方案

#1


这样写:

x = (double)sqrt((double)(i + 100));
y = (double)sqrt((double)(i + 268));

我想是因为C++中sqrt()函数有多个重载的缘故
不过我不大懂C++……

#2



-------------- 构建: Debug in 11 ---------------

正在链接 控制台可执行: bin\Debug\11.exe
main.cpp
main.cpp(10) : error C2668: “sqrt”: 对重载函数的调用不明确
        D:\CodeBlocksSVN\build\vc\include\math.h(589): 可能是“long double sqrt(long double)”
        D:\CodeBlocksSVN\build\vc\include\math.h(541): 或       “float sqrt(float)”
        D:\CodeBlocksSVN\build\vc\include\math.h(127): 或       “double sqrt(double)”
        尝试匹配参数列表“(long)”时

#3


由于 i+100 可以是float,也可以是double,还有可能long double
 所以造成了编译器无法识别调用那个重载的函数。 
你可以用强制的类型转换: 
double   i   =   sqrt((double)9);

#4


把文件名改成.c

#5


这是因为sqrt()这个函数的参数和返回值都要求是float或者double,而你的参数是int,就报错了。

所以你要强制类型转换,都强制转换为float或者doble类型,就可以来的。

#6


(double)x = (double)sqrt((double)(i + 100));
(double)y = (double)sqrt((double)(i + 268));

#7


还有浮点数,通常是不能用“==”来判断大小的。

如果要比较大小,可以这样才是正确的,

这个是和零比较的例子: 

const   float   EPSINON   =   0.00001;//此处根据精度定 
if   ((x   > =   -   EPSINON)   &&   (x   <=   EPSINON))

LZ可以根据自己情况再写,这样严密一些。

#8


引用 7 楼 tianmo2010 的回复:
还有浮点数,通常是不能用“==”来判断大小的。

如果要比较大小,可以这样才是正确的,

这个是和零比较的例子: 

const float EPSINON = 0.00001;//此处根据精度定 
if ((x > = - EPSINON) &amp;&amp; (x <= EPSINON))

LZ可以根据自己情况再写,这样严密一些。


我发现公司上好多代码都是用==的。

#9


引用 1 楼 icemornings 的回复:
这样写:

C/C++ code

x = (double)sqrt((double)(i + 100));
y = (double)sqrt((double)(i + 268));


我想是因为C++中sqrt()函数有多个重载的缘故
不过我不大懂C++……


重载惹的祸 -- 天下没有白吃的午餐

#10


引用 7 楼 tianmo2010 的回复:
还有浮点数,通常是不能用“==”来判断大小的。

如果要比较大小,可以这样才是正确的,

这个是和零比较的例子: 

const   float   EPSINON   =   0.00001;//此处根据精度定 
if   ((x   > =   -   EPSINON)   &amp;&amp;   (x   <=   EPSINON))

LZ可以根据自己情况再写,这样严……



呵呵 ,
++

#11


既然用vc2008为何不用C++方式写代码?

#1


这样写:

x = (double)sqrt((double)(i + 100));
y = (double)sqrt((double)(i + 268));

我想是因为C++中sqrt()函数有多个重载的缘故
不过我不大懂C++……

#2



-------------- 构建: Debug in 11 ---------------

正在链接 控制台可执行: bin\Debug\11.exe
main.cpp
main.cpp(10) : error C2668: “sqrt”: 对重载函数的调用不明确
        D:\CodeBlocksSVN\build\vc\include\math.h(589): 可能是“long double sqrt(long double)”
        D:\CodeBlocksSVN\build\vc\include\math.h(541): 或       “float sqrt(float)”
        D:\CodeBlocksSVN\build\vc\include\math.h(127): 或       “double sqrt(double)”
        尝试匹配参数列表“(long)”时

#3


由于 i+100 可以是float,也可以是double,还有可能long double
 所以造成了编译器无法识别调用那个重载的函数。 
你可以用强制的类型转换: 
double   i   =   sqrt((double)9);

#4


把文件名改成.c

#5


这是因为sqrt()这个函数的参数和返回值都要求是float或者double,而你的参数是int,就报错了。

所以你要强制类型转换,都强制转换为float或者doble类型,就可以来的。

#6


(double)x = (double)sqrt((double)(i + 100));
(double)y = (double)sqrt((double)(i + 268));

#7


还有浮点数,通常是不能用“==”来判断大小的。

如果要比较大小,可以这样才是正确的,

这个是和零比较的例子: 

const   float   EPSINON   =   0.00001;//此处根据精度定 
if   ((x   > =   -   EPSINON)   &&   (x   <=   EPSINON))

LZ可以根据自己情况再写,这样严密一些。

#8


引用 7 楼 tianmo2010 的回复:
还有浮点数,通常是不能用“==”来判断大小的。

如果要比较大小,可以这样才是正确的,

这个是和零比较的例子: 

const float EPSINON = 0.00001;//此处根据精度定 
if ((x > = - EPSINON) &amp;&amp; (x <= EPSINON))

LZ可以根据自己情况再写,这样严密一些。


我发现公司上好多代码都是用==的。

#9


引用 1 楼 icemornings 的回复:
这样写:

C/C++ code

x = (double)sqrt((double)(i + 100));
y = (double)sqrt((double)(i + 268));


我想是因为C++中sqrt()函数有多个重载的缘故
不过我不大懂C++……


重载惹的祸 -- 天下没有白吃的午餐

#10


引用 7 楼 tianmo2010 的回复:
还有浮点数,通常是不能用“==”来判断大小的。

如果要比较大小,可以这样才是正确的,

这个是和零比较的例子: 

const   float   EPSINON   =   0.00001;//此处根据精度定 
if   ((x   > =   -   EPSINON)   &amp;&amp;   (x   <=   EPSINON))

LZ可以根据自己情况再写,这样严……



呵呵 ,
++

#11


既然用vc2008为何不用C++方式写代码?