不显示浮点值吗?

时间:2019-11-12 18:15:35

标签: c++

找到标准偏差后,我将整数转换为浮点值,但是由于不确定它没有被打印出来,因此我不确定是否正确。我想知道问题出在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转换为浮点数之后,它似乎已经出现了,主要的问题似乎出在我想做的数学运算中。

2 个答案:

答案 0 :(得分: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进行打印,而{{ 1}}已具有浮点类型。

  

<< 2基本上应该是pow的较短版本。

这里有两个问题。给定整数std::sqrt,向左移两位将有效地乘以4 (假设它不会溢出),而您需要平方您的公式中的值。

此外,由于运算符的优先级,总和是在移位之前执行的

请考虑使用函数

x

这将导致以下情况

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

下一步的改进可能是使用std::vector之类的标准容器以及<algorithm>中定义的某些功能。

答案 1 :(得分:0)

您的代码的主要问题是在for循环中。您永远不要指定i <= count - 1,否则它将打印出一些内容,但不会显示正确的结果。这是您的代码。现在,我建议以下建议:将num数组设置为float,将average设置为float。然后计算它。但是除非您的nums必须为int,而average为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; 
        }

希望我能帮上忙。