【问题标题】:Floating point value isn't being displayed?没有显示浮点值?
【发布时间】:2019-11-12 18:15:35
【问题描述】:

找到标准偏差后,我将 int 转换为浮点值,但我不确定我是否正确,因为它没有被打印出来。我想知道问题出在conversion 还是cout 本身。

float standardDev(int num[], int count, int average)
{
    int i,standardDev, sum =0;
    for(i=0;count-1;i++)
    {
        sum = sum + (num[i] - average)<<2;
        standardDev = sqrt((1.0/count)*sum);
    }
    std::cout << std::fixed;
    float x = (float)standardDev; //int into floating point
    cout << "The standard deviation is " ;
    std::cout<< x;
    cout << ".";
    return x;
}

目前此函数没有显示任何内容。在将standardDev转换为浮点数之前尝试显示它之后,似乎主要问题在于我正在尝试做的数学。

【问题讨论】:

  • 有什么打印出来的吗?
  • 能否请您提取并提供minimal reproducible example?另外,请使用tour 并阅读How to Ask。实际上,如果您尝试提取一个最小的示例,您可能会自己发现错误(这是相当明显的)。
  • float x = (float)standardDev; 有点没用,因为到那时信息已经丢失了。
  • leftshift 2 (&lt;&lt;2) 的原因是什么,你知道它是在添加之后执行的吗?
  • 首先让standardDeviation 成为一个浮点数怎么样?另请注意,您可以链接您的 cout。 cout

标签: c++


【解决方案1】:

找到标准差 (...)

考虑到循环的编写方式,恐怕发布的代码不会这样做:

for(i=0;count-1;i++)
{ //    ^^^^^^^   This should be a condition like:  i < count
  //    As written, the loop is either skipped (if count == 1, count-1 results in 0,
  //    which is interpreted as false) or endless (count != 1 -> count-1 is true) 

    sum = sum + (num[i] - average)<<2;
    //                            ^^^ Nope. We'll see later.

    standardDev = sqrt((1.0/count)*sum); // That's not how it is calculated and repeating
                                         // it at every iteration is pointless     
}

请注意,没有副作用的无限循环具有未定义的行为,因此允许编译器忽略它。

最重要的是,standardDev(和average)是一个int,后来被转换为一个float来打印,而std::sqrt的结果已经是一个浮点类型。

这里有两个问题。给定一个整数x,按位左移两位将有效地将其乘以 4(假设它没有溢出),而您需要 平方值,在您的公式中。

另外,由于运算符的优先级,在位移之前进行求和

考虑使用一个函数,而不是像

double square(double x)
{
    return x * x;   
}

这会导致以下情况

double standard_deviation(int num[], int count, double average)
{ //                                            ^^^^^^  
    double sum = 0;
    for(int i = 0; i < count; ++i)
    { //           ^^^^^^^^^
        sum += square(num[i] - average);
    }
    return std::sqrt(sum / (count - 1));
}

接下来的改进步骤可能是使用像std::vector 这样的标准容器以及&lt;algorithm&gt; 中定义的一些函数。

【讨论】:

  • 注意:对于数字 2 也是如此,但除非您更改基数,否则其他任何地方都没有。跨度>
【解决方案2】:

您的代码的主要问题在于 for 循环。你永远不要指定i &lt;= count - 1 否则,它会打印一些东西,但不是正确的结果。这是你的代码。现在我推荐以下建议:将num数组转为float,将average转为float。然后计算它。但除非您的 nums 需要为 int 且平均值为 int,否则您可能需要进行一些类型转换。这是我推荐的代码,您的代码没有太大变化。

     // your code with correction             
     float standardDev(int num[], int count, int average)
        {
            int i,standardDev, sum =0;
            for(i=0;i<=count-1;i++)
            {
                sum = sum + (num[i] - average)<<2;
                standardDev = sqrt((1.0/count)*sum);
            }
            std::cout << std::fixed;
            float x = (float)standardDev; //int into floating point
            cout << "The standard deviation is " ;
            std::cout<< x;
            cout << ".";
            return x;
        }
      // my code below 

      float standardDev(float num[], int count, float average){
            int i = 0;
            float sum, standardDev = 0;
            for(i = 0; i <= count-1; i++){ 
                sum += ((num[i] - average)*(num[i] - average));
                standardDev = sqrt((1.0/count)*sum);
            }
            //standardDev = sqrt((1.0/((float) count))*sum);
            std::cout << std::fixed;
            cout << "The standard deviation is ";
            std::cout<<standardDev;
            cout<< ".";
            return standardDev; 
        }

希望我能帮上忙。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2015-05-26
    • 1970-01-01
    • 2023-03-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多