【问题标题】:Why there is -nan in the output after a few iterations为什么经过几次迭代后输出中有 -nan
【发布时间】:2021-05-26 12:58:03
【问题描述】:

我的代码是一个用于迭代流程的简单算法。然而,经过几次迭代,我在输出中得到了-nan

代码:

for(int i = 0; i < 100; i++){
    float n = (a+b-c)*(a+c-b)*(b+c-a)/(4*a*b*c);
    printf("%f ",n);
    float an = (b+c-a)*sqrt((a+b-c)*(a+c-b)/(4*b*c)); 
    float bn = (a+c-b)*sqrt((a+b-c)*(b+c-a)/(4*a*c)); 
    float cn = (a+b-c)*sqrt((a+c-b)*(b+c-a)/(4*a*b));
    a = an;
    b = bn;
    c = cn;
}

a, b ,c 是之前声明的浮点数。

在输出中,大约之后。 20-30 个结果我得到了一堆 -nan 我该如何解决?我使用https://www.onlinegdb.com 作为编译器

【问题讨论】:

  • 你的调试器说什么?也许您正试图取负数的平方根。
  • @tadman [Inferior 1(进程3118)正常退出]
  • 嗯,崩溃在哪里?什么线?使用了哪些值?
  • @tadman a、b、c 的初始值为 pi、e 和 ln(2)。 -nan 出现在 50 个结果之后。结果为 0.01 - 0.5
  • float 的限制,在我的电脑上,大约是 2^(-150) ... double2^(-1076)long double2^(-16447)

标签: c nan


【解决方案1】:

如果不知道初始的 a、b、c 值,我们就无法判断发生了什么。但是如果你把这条线代替你的 printf 你会很快得到你的答案

printf("a=%f, b=%f, c=%f, n=%f, ", a, b, c, n);

【讨论】:

  • 谢谢! a、b、c 的初始值为 pi、e 和 ln(2);事实证明,a、b、c 每次迭代都越来越小,几乎为零。
【解决方案2】:

sqrt() 负数会产生nan

【讨论】:

  • 除以零 :-)
猜你喜欢
  • 2019-03-20
  • 1970-01-01
  • 1970-01-01
  • 2018-06-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-11-14
相关资源
最近更新 更多