【问题标题】:Returning a double value in C++在 C++ 中返回一个双精度值
【发布时间】:2017-01-31 21:52:45
【问题描述】:

我正在尝试制作一个程序,它可以为我提供系列 1!+2/2!+3/3!.......n/n! 的总和! 这是我的代码。

#include "stdafx.h"
#include<conio.h>
#include <stdio.h>
#include <stdlib.h>

int n;

double sumseries(double sum, double count)
{
    double fac = 1, i;
    for (i = 1; i <= count; i++)
        fac = fac*i;

    sum += (count++ / fac);
    if (count <= n)
        sumseries(sum, count);
    else {
        printf("sum of series is:%lf", sum);
        return sum;
    }
}

int main()
{
    printf("enter the limit");
    scanf_s("%d", &n);
    double z = sumseries(0,1);
    printf("\n%lf",z);
    system("pause");
 }

现在,当我们从 sumseries() 函数打印 sum 时,会打印出正确的值。但在下一行,我们返回总和并将其保存在 main() 函数的 z 变量中。当我们尝试打印该值时,它会显示 -nan(ind)

我的问题不是如何解决这个问题或如何使这个程序工作。我要问的是在上面的代码中是什么导致了这个问题。为什么没有返回正确的值。

【问题讨论】:

  • 将编译器的警告提高到更高级别。它会立即告诉你。您有递归,但您没有在整个链中执行returns。或者在调试器中逐行运行代码,你会看到会发生什么。
  • 我不知道双打有后缀增量。谁用它?
  • 根据this SO answer,使用double++反复加错。

标签: c++ visual-c++


【解决方案1】:

在您的 sumseries 函数中,并非所有流控制路径都返回值。

你至少应该写

if (count <= n)
    return sumseries(sum, count);

而不是

if (count <= n)
    sumseries(sum, count);

【讨论】:

    【解决方案2】:

    你的编译器应该给你一个警告,甚至是一个错误的问题。如果不是,请将警告级别调高。

    您有一个 recursive 函数 sumseries,但您不会从通向结尾的所有路径返回值。因此返回值是不确定的。

    递归函数不只返回一次,您必须从每一步返回。在这种情况下,您返回最后一个值,但之前对该函数的调用将其丢弃。你需要继续退货。因此你需要使用

    return sumseries(sum, count);
    

    继续将值返回到上一步。

    【讨论】:

      【解决方案3】:

      sumseries() 中的控制流可能会到达终点并返回未定义的值。您需要在代码中使这种情况变得不可能。可能你想使用这个语句:

      if (count <= n)
          return sumseries(sum, count);
      

      而不仅仅是

      if (count <= n)
             sumseries(sum, count);
      

      【讨论】:

        猜你喜欢
        • 2020-06-10
        • 1970-01-01
        • 2016-03-31
        • 2010-10-05
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2013-06-12
        • 1970-01-01
        相关资源
        最近更新 更多