首先,正如 zbjzbj 所言,根本不是“为什么d总是为1?”,对于自己提的问题就不能认真些?就不能明确地讲“我输入0 0 3 4,期待输出5.00,为什么实际输出是 1 呢”?
然后看你的代码
scanf("%lf %lf %lf %lf" 之间为什么要加空格呢?虽然是个小问题
(double)pow((x1-x2),2) 之类,为什么要将double强转为double?
int c=0; 你明明用的都是浮点数,怎么又要截断为整型?
int c=0; c=……; 为什么不按C标准建议的那样写成 int c = ……; ?
明明是(x1-x2)*(x1-x2),为什么用 pow((x1-x2),2) ?你是不是觉得数学上它俩相等,实际运行时也没什么差别,所以就可以瞎写?
明明是sqrt(c),为什么用 pow(c,0.5) ?同上,C标准是闲得没事做,才增加sqrt/cbrt等函数?
当你使用 (x^2 + y^2)^0.5 这个算法求距离时,有没有想过中间过程(即 x^2 + y^2 )会丢失精度,会溢出?只是问问,没责怪你,所以C标准才提供 hypot 函数专门来干这事。
如果在你原来的代码上改,就是:
程序代码:
#include <stdio.h>
#include <math.h>
double dist( double x1, double y1, double x2, double y2 );
int main( void )
{
double x1, y1, x2, y2;
scanf( "%lf%lf%lf%lf", &x1, &y1, &x2, &y2 );
printf( "dist = %.2f\n", dist(x1,y1,x2,y2) );
}
double dist( double x1, double y1, double x2, double y2 )
{
return sqrt( (x1-x2)*(x1-x2) + (y1-y2)*(y1-y2) );
// 以上未考虑精度丢失和溢出的问题,正确的做法应该是
// return hypot( x1-x2, y1-y2 );
}