【问题标题】:Why double, long double are always showing 0 as output?为什么 double、long double 总是显示 0 作为输出?
【发布时间】:2020-09-22 15:19:57
【问题描述】:

我正在编写代码来查找点 (25,40000) 与固定点 (47,132000) 的距离。距离始终打印为 0.0000。 我试过检查其他组合,给出较小的点值,然后用 %d 打印它们,效果很好。 但是对于 %ld,%lf,%Lf 有什么不好。请帮忙。

#include<stdio.h>
#include<math.h>

int main()
{
   int x=25,y=40000;  
   //printf("Enter x,y");
   //scanf(%d %d,&x,&y) 
   long double dist;
   dist=sqrt((47-x)*(47-x)+(132000-y)*(132000-y));   
   printf(" x= %d y=%d dist=%Lf\n",x,y,dist);
   return 0;
}

【问题讨论】:

  • 将变量的int类型从int改为long long int。
  • 您是否查看过实际传递给sqrt 的值?如果这不是您所期望的,我不会感到惊讶。
  • 你有很多错别字,你应该注意这一点。
  • 但是,从编辑器中复制代码以确保它可以编译。创建minimal reproducible example
  • 请复制/粘贴您的确切代码Minimal Reproducible Example,这是显示问题的最短完整代码。不是您认为可能相同的东西。

标签: c double long-double


【解决方案1】:

整数溢出发生在您的代码中。以下代码有效 -

int main()
{
   long long int x=25,y=40000;       //int was overflowing and causing you error
   long double dist;
   dist=sqrt((47-x)*(47-x)+(132000-y)*(132000-y));   //this will safely compute within range and return the desired result
   printf("After distance\n");
   printf(" x= %lld y=%lld dist=%Lf\n",x,y,dist);
   return 0;
}

你得到了错误的输出(-nan 当我尝试时),因为sqrt() 中的表达式值溢出并变为负数。 (132000-y)*(132000-y) 不适合整数范围并给出负值。由于未定义负平方根,sqrt() 返回nan 作为结果。将 y 的类型更改为 long long int 将解决错误。

希望这会有所帮助!

【讨论】:

  • 您可能想要对正在发生的事情提供更多解释。虽然 16 位 int 确实不能容纳 40000,但这只是其中的一部分。涉及y 的乘法也可以溢出32 位int。在大多数现代平台上,这可能是遇到的问题。
  • @ThomasJager 我添加了正确的解释。看看是否正确,如果我错过了添加内容,请告诉我。
  • (我在上次编辑之前完成了写作)您编辑的答案不太正确。如果唯一的问题是y 是负数,那么从另一个数字中减去它的事实将确保将正结果传递给sqrt。不管int y 的原始值如何,(132000-y) 都是一个 32 位整数(在传统平台上)。这个结果会溢出,导致UB。这就是为什么仅将long int 用于xy 是不够的,因为您只能保证范围[−2,147,483,647, +2,147,483,647]。虽然这可以轻松容纳 40000,但对于多人来说还不够。
  • long long int 可以保存高达 9223372036854775807 的值。溢出不是因为40000 不能适应 y,而是因为它不能容纳产品(132000-y)*(132000-y)。将其设为long long int 就足以保持价值。因此,它在大多数情况下都可以工作,除非您也愿意在9223372036854775807 范围之外工作,您必须在该范围内实现大整数。
  • @Abhishek 您提供的编辑后的代码也显示相同的输出 0.0000。
猜你喜欢
  • 2013-07-10
  • 1970-01-01
  • 2015-08-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-03-30
相关资源
最近更新 更多