c++中float的问题

来源:百度知道 编辑:UC知道 时间:2024/05/29 00:27:45
#include <iostream>
#include"math.h"
using namespace std;

int dist(int a1,int b1,int a2,int b2)
{
int L1;
L1=sqrt((b2-b1)*(b2-b1)+(a2-a1)*(a2-a1));
return L1;
}
float dist(float x1,float y1,float x2,float y2)
{
float L2;
L2=sqrt((y2-y1)*(y2-y1)+(x2-x1)*(x2-x1));
return L2;
}
int main()
{
cout<<"两点(1,2),(3,4)间的距离为:"<<dist(1,2,3,4)<<endl;
cout<<"两点(1.0,2.0),(3.0,4.0)间的距离为:"<<dist(5.1,6.1,7.1,8.1)<<endl;
return 0;
}
这个程序,提示错误是ambiguous call to overloaded function,但改float型为double型就可以了。但5.1,6.1,7.1,8.1这几个数字是在float型内的啊。
我解决的方法有:
1.把5.1,6.1,7.1,8.1改成200 300 400 500等等。
2.把float型改为double型。
这两种方法为什么可行?谁跟我说下、、

5.1,6.1,7.1,8.1 这几个数默认都是 double 型的,只有像 5.1f 这样的才是 float 型数据。浮点数如果没有显式的声明为 float 型的话,编译器默认都是 double 型的。
你的两种该法都可以。
其实,一般情况下,完全没必要使用 float 型数据,用 double 就行。float 型的数主要是比 double 占用内存更小,想想现在动不动就 1G,2G的内存,完全没必要去节省那点内存。何况,double 型数据能表示的数的范围比 float 型大得多。

首先:
5.1,6.1,7.1,8.1
数字默认的类型是double类型的。
当运行到这句:
cout<<"两点(1.0,2.0),(3.0,4.0)间的距离为:"<<dist (5.1,6.1,7.1,8.1)<<endl;
编译器没找到合适的重载函数,会自己进行隐式转化,这样double->int,double->float.都是有精度损失的。都可以转化。所以就出现了这个模糊的调用重载函数的错误。

1.把5.1,6.1,7.1,8.1改成200 300 400 500等等。
这个调用的四个int 参数的那个重载函数。

2.把float型改为double型。
5.1,6.1,7.1,8.1这个当然会调用四个double 参数的那个重载函数。
都是没有参数转化的

c++语言是支持函数重载的,编译系统会根据函数的一些信息,像形式参数的数据类型,悄悄地修改你给函数的命名,再进行编译 连接
所以
1.你把5.1,6.1,7.1,8.1改成200 300 400 500等等,那么dist(200,300,400,500)这个函数是在
int dist(int a1,int b1,int a2,int b2)
{
int L1;
L1=sqrt((b2-b1)*(b2-b1)+(a2-a1)*(a2-a1));
return L1;
}