Поэтому в этой программе я пытаюсь распечатать стандартное отклонение набора чисел, в который вводит пользователь. Формула для расчета стандартного отклонения является правильной (или настолько правильной, какой должна быть), так что это не проблема, но когда я запускаю программу, все идет хорошо, пока консоль не распечатает результаты. Он печатает, что totalStandardDeviation = nan
что именно значит? Нэн такой же, как ноль? он как-то потерял значение и не смог его найти? спасибо за любую помощь, которую вы можете предоставить.
#include <iostream>
#include <cmath>
using namespace std;
double returnStandardDeviation(double x, int counter);
double total;
int userInput = 1;
int counter = 0;
double x;
double x1;
double x2;
double standardDeviation;
double totalStandardDeviation;
int main(int argc, const char * argv[])
{
cout << "Please enter a list of numbers. When done enter the number 0 \n";
cin >> userInput;
while (userInput != 0) // As long as the user does not enter 0, program accepts more data
{
counter++;
x = userInput;
returnStandardDeviation( x, counter); // send perameters to function
cout << "Please enter next number \n";
cin >> userInput;
}
cout << "The standard deviation of your "<< counter
<< " numbers is : "<< returnStandardDeviation(x, counter);
return 0;
}double returnStandardDeviation(double x, int counter)
{
x1 += pow(x,2);
x2 += x;
totalStandardDeviation = 0;
totalStandardDeviation += (sqrt(counter * x1 - pow(x2,2))) / (counter * (counter - 1));
return totalStandardDeviation;
}
Ваша формула неверна. Вы либо делите на ноль, либо берете квадратный корень из отрицательного числа.
Проверьте свою формулу!
Дополнительная информация:
NaN это «не число». Это значение с плавающей запятой IEEE, которое сообщает о недопустимых результатах, таких как log (-1) или sqrt (-4).
Кроме того, знайте, что Положительная Бесконечность и Отрицательная Бесконечность также являются значениями с плавающей запятой.
NaN расшифровывается как «Не число».
NaN может, например, быть результатом:
- Dividing by zero
- Taking the square root of a negative number
В вашей функции оба из них могут произойти. Деление на ноль, например когда counter
является <= 1; а также x1
а также x2
неинициализированы (+=
добавляет значение справа к их ток значение — которое никогда не было установлено, и поэтому является случайным бредом), что может легко привести к тому, что ваша функция попытается получить квадратный корень некоторого значения < 0.
Это выражение
counter * x1 - pow(x2,2)
может очень легко дать отрицательное число. Затем вы переходите к получению его квадратного корня. Это приведет к nan
,
Далее этот
counter * (counter - 1)
доходность 0
когда counter
является 1
, Деление на ноль дает nan
,