You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

为什么计算两点距离的C++程序会输出NaN或0?

问题根因

你的代码核心错误是欧几里得距离公式书写错误:两点坐标距离的计算公式为 √[(x₂-x₁)² + (y₂-y₁)²],你在disCoord函数中将两个平方项的求和写成了求差。当y坐标差值的平方大于x坐标差值的平方时,sqrt函数的入参为负数,就会返回NaN;如果两个平方项数值刚好相等,计算结果就为0,完全匹配你遇到的异常输出现象。

修复后代码
#include<iostream>
#include<cmath>
using namespace std;
class point{
    int x,y;
    friend void disCoord(const point&, const point&);
    public:
    point(int a,int b){
        x=a;
        y=b;
    }
    void displaypoint(){
        cout<<"the point is("<<x<<","<<y<<")"<<endl;
    }

};
void disCoord(const point& o1, const point& o2){
    // 把减号改为加号,替换pow为直接乘法优化
    double dis = sqrt((o2.x-o1.x)*(o2.x-o1.x) + (o2.y-o1.y)*(o2.y-o1.y));
    cout<<"The distance between point"<<"("<<o1.x<<","<<o1.y<<") and point"<<"("<<o2.x<<"," 
<<o2.y<<") is "<<dis<<endl;
}

int main(){
    point A=point(1,2);
    point B=point(1,3);
    A.displaypoint();
    B.displaypoint();
    disCoord(A,B);
    return 0;
}

修复后你的测试用例输出的距离值为1,符合预期。

可选优化建议
  • 整数平方计算避免使用pow:pow是为浮点运算设计的函数,整数平方直接用差值相乘的方式效率更高,也不会引入浮点精度误差
  • 友元函数参数改为常量引用:避免传递对象时产生不必要的拷贝开销,同时保证不会意外修改对象的私有属性
  • 生产环境建议移除using namespace std;:避免全局命名空间污染,更规范的写法是显式添加std::前缀调用标准库函数

内容的提问来源于stack exchange,提问作者Techy Bhoot

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.23 16:36:04