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