C++ 标准偏差-C+的输出为NaN+;

C++ 标准偏差-C+的输出为NaN+;,c++,standard-deviation,C++,Standard Deviation,在我的客户程序中,我有一个迭代自定义向量的过程,并执行一些计算来计算标准偏差。它将风速从m/s转换为km/h,因此需要将其*3.6进行转换。对于我的西格玛值,当然还有需要西格玛值的标准偏差,我的输出是NaN,我不明白为什么会这样 Main.cpp: float sum; float convertedspeed[windlog.size()]; float sigma; float averagespeed; //float conversion; flo

在我的客户程序中,我有一个迭代自定义向量的过程,并执行一些计算来计算标准偏差。它将风速从m/s转换为km/h,因此需要将其*3.6进行转换。对于我的西格玛值,当然还有需要西格玛值的标准偏差,我的输出是NaN,我不明白为什么会这样

Main.cpp:

float sum;
    float convertedspeed[windlog.size()];
    float sigma;
    float averagespeed;
    //float conversion;
    float sd;
    int nrofel;

    ofstream ofile("testoutput.csv");

    ofile << "WAST, S, \n";

for(int i = 0; i < windlog.size(); i++){

    nrofel = windlog.size();

    convertedspeed[i] = (windlog[i].speed*3.6);

    sum += convertedspeed[i];
    averagespeed = (sum/nrofel);

    sigma += (convertedspeed[i] - averagespeed)*(convertedspeed[i] - averagespeed);

    sd = sqrt(sigma/(nrofel - 1));
浮点数;
浮点转换速度[windlog.size()];
浮动西格玛;
浮动平均速度;
//浮点数转换;
浮动sd;
内特诺费尔;
文件流(“testoutput.csv”);

ofile在使用之前必须初始化变量

严格地说,在这种情况下,您不必初始化
nrofel
averagespeed
sd
,因为它们在循环中被分配了一些值,而在分配之前没有被读取


另一方面,您必须初始化
sum
sigma
,因为它们的值是在赋值之前读取的。

您必须在使用前初始化变量

严格地说,在这种情况下,您不必初始化
nrofel
averagespeed
sd
,因为它们在循环中被分配了一些值,而在分配之前没有被读取


另一方面,您必须初始化
sum
sigma
,因为它们的值是在赋值之前读取的。

float-convertedspeed[windlog.size()
这很可能是UB,因为我非常怀疑
.size()
是一个constexpr。我不确定UB和constexpr是什么,但windlog.size()是我的Vector类中的一个方法,它只返回向量的大小。请注意,这是我自己的自定义模板类Vector,我没有使用内置的std::Vector。这个初始化有什么问题吗?@thedafferg
float-convertedspeed[windlog.size()]这不是合法的C++,如果<代码> siz()//>不是一个常量表达式。C++中的数组必须用常数表达式表示它们的大小,而不是运行时值。因此,第一条评论比你可能相信的更准确。C++中的动态数组是通过使用<代码> STD::向量< /代码>来完成的。既然你有自己的
Vector
类,为什么不在这里使用它呢<代码>矢量转换速度(windlog.size())。你说得对,我没有使用自己的向量类来转换速度,我只是觉得没有必要。是的,这绝对是一个正确的方法,在读了一点关于它的内容后,我明白了为什么,谢谢。当然,有一种与人交谈的方式,尽管我在学习编程方面很天真,但我知道我比第一条更欣赏你的评论:)
float-convertedspeed[windlog.size()
这很可能是UB,因为我非常怀疑
.size()
是一个constexpr。我不确定UB和constexpr是什么,但windlog.size()是我的Vector类中的一个方法,它只返回向量的大小。请注意,这是我自己的自定义模板类Vector,我没有使用内置的std::Vector。这个初始化有什么问题吗?@thedafferg
float-convertedspeed[windlog.size()]这不是合法的C++,如果<代码> siz()//>不是一个常量表达式。C++中的数组必须用常数表达式表示它们的大小,而不是运行时值。因此,第一条评论比你可能相信的更准确。C++中的动态数组是通过使用<代码> STD::向量< /代码>来完成的。既然你有自己的
Vector
类,为什么不在这里使用它呢<代码>矢量转换速度(windlog.size())。你说得对,我没有使用自己的向量类来转换速度,我只是觉得没有必要。是的,这绝对是一个正确的方法,在读了一点关于它的内容后,我明白了为什么,谢谢。当然,有一种与人交谈的方式,尽管我在学习编程方面很幼稚,但我知道我比第一次更欣赏你的评论:)