C++调用平方根函数问题

调用cmath中的sqrt函数,定义了一个int m,然后定义double sqrtm=sqrt(m),报错“有多个重载函数"sqrt"实例与参数列表匹配”,后来发现钱能的C++教程上写的是sqrt(m*1.0).请问这是怎么回事?

迭代法求某数a的平方根

已知求平方根的迭代公式为:x n+1 = (xn + a / xn) / 2
要求前后两次求出的差的绝对值小于10-5。

算法如下:

① 设定一个x的初值x0 ; (在如下程序中取x0=a/2, 通过迭代公式求出x1,可以肯定与真正的平方根相比,误差很大。)

② 用上述公式求出x的下一个值 x1 ;

③ 如此继续下去,直到前后两次求出的x值(x n+1和xn)满足以下关系:|x n+1-xn|<10-5 .

扩展资料:

样例:

/* sqrt example */

#include <stdio.h>      /* printf */

#include <math.h>       /* sqrt */ 

int main ()

{

double param, result;

param = 1024.0;

result = sqrt (param);

printf ("sqrt(%f) = %f\n", param, result );

return 0;

}

温馨提示:答案为网友推荐,仅供参考
第1个回答  推荐于2017-09-13

C++中cmath头文件中的sqrt函数能计算一个数的平方根。其原型在C++ 11中有四个:

double sqrt (double x);
float sqrt (float x);
long double sqrt (long double x);
double sqrt (T x);           // additional overloads for integral types

其中最后一个是为整型类型提供的重载版本,其会先将x转换为double类型再进行计算。这是C++ 11提供的新功能。因此在C++ 11以前像sqrt(1)这类的语句是非法的,因为编译器不知道匹配哪个函数(只有前三个版本),在C++ 11之后这样的语句就合法了,编译器会匹配最后一个版本。

样例:(摘自cplusplus.com)

/* sqrt example */
#include <stdio.h>      /* printf */
#include <math.h>       /* sqrt */

int main ()
{
  double param, result;
  param = 1024.0;
  result = sqrt (param);
  printf ("sqrt(%f) = %f\n", param, result );
  return 0;
}

第2个回答  2012-08-01
汗,C语言中,由于没有重载,你直接sqrt(m)它会把m转成浮点型.
但是C++中,类型不匹配时,它首先看的是有没有重载函数.
而不巧,sqrt函数就有很多个第一个参数是int的多参数重载函数(这点是从报错信息上看出来的.)
m*1.0的结果是一个浮点数,有和它匹配的函数,所以正常运行.
解决方案就是"兔子和小强"写的,他写的那三种都行.
比如 sqrt( (double)m );

LZ的C++基本功不够啊=,=
第3个回答  2012-08-01
sqrt()的参数须为浮点,不可为整数,转换 一下就可以了: sqrt((double)m)追问

这和重载函数有什么关系?

追答

cmath.h非标准的,不知这个cmath.h 有没有定义多个sqrt()重载函数

本回答被提问者采纳
第4个回答  2012-08-01
(double)m
m + 0.0
m * 1.0
相似回答