Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > IT форум > Помощь студентам
Регистрация

Восстановить пароль

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 04.08.2017, 04:07   #1
Hermeneticus
Пользователь
 
Аватар для Hermeneticus
 
Регистрация: 06.07.2017
Сообщений: 15
Печаль Программа ведёт себя не очень..

Короче, как - то странно считает коэф. эксцесса y2. Всё остальное считает хорошо. До этого ещё хотелось выводить центральный момент третьего порядка, но на выходе ему сообщались огромные значения, хотя коэф. ассиметрии
получался таким же, как если считать самому. Что делать, чтоб он посчитал мне коэф. эксцесса нормально?

Код:
#include <stdio.h>
#include <assert.h>
#include <math.h>
#include <locale.h>



int main(void)
{
	setlocale(LC_ALL, "Rus");
	
	double sum, sum_sq, cur, min, max, sum_thr;
	double sum_four, tic, D, v1, v2, v3;
	double v4, m3, m4, M2, y2;
	int n = 1;
	int r = scanf("%lg", &cur);
	assert(r == 1);
	sum = min = max = cur;
	sum_sq = pow (cur, 2);
	while( 1 == (r = scanf("%lg", &cur)))
	{
		if(cur < min)
		{
			min = cur;
		}
		else if(cur > max)
		{
			max = cur;
		}
		++n;
		
		sum+=cur;
		sum_sq+= pow(cur, 2);
		sum_thr+= pow(cur, 3);
		sum_four+= pow(cur, 4);
		
		v1 = sum*pow(n, -1);        //íà÷. ìîìåíò ïåðâîãî ïîðÿäêà
		v2 = sum_sq*pow(n, -1);     //íà÷. ìîìåíò âòîðîãî ïîðÿäêà
		v3 = sum_thr*pow(n, -1);    //íà÷. ìîìåíò òðåòüåãî ïîðÿäêà
		v4 = sum_four*pow(n, -1);   //íà÷. ìîìåíò ÷åòâåðòîãî ïîðÿäêà
		
		M2 = pow(v1, 2);
		tic = v2 - M2;        //äèñïåðñèÿ
		D = sqrt(tic);               //êîðåíü èç äèñïåðñèè
		m3 = v3 - 3*v1*v2 + 2*pow(v1, 3);    //öåíòðàëüíûé ìîìåíò òðåòüåãî ïîðÿäêà
		m4 = v4 - 4*v1*v3+6*v1*v2-3*pow(v1, 4);
		y2 = (m4 / pow(D, 4)) - 3;
	}
	
	assert(r == EOF);
	assert(!ferror (stdin));
	

	printf(("Range:  [%lg, %lg]\n"
		    "Count:  %d\n"
		    "Mean:   %lg\n"
		    "StdDev: %lg\n"
			"SUM:    %lg\n"
			"SUM_SQ: %lg\n"), min, max, n, max/n,
			 sqrt((sum_sq/n)-pow(sum/n,2)), sum, sum_sq);
	printf(("p:      %lg\n"
			"v1:     %lg\n"
			"v2:     %lg\n"
			"v3:     %lg\n"
			"v4:     %lg\n"
			"y1:     %lg\n"), pow(n, -1), v1, v2, v3, v4,
			m3/(pow(D, 3)));
	printf(("y2      %ld\n"), y2);
		    
	return 0;
}
...Спиралями мешкотно падает снег,\Уже запирали, когда он обрюзгший,\Как сползший набрюшник, пошёл в полусне\Валить, засыпая, уснувшую пустошь.\...

Последний раз редактировалось Hermeneticus; 04.08.2017 в 04:11.
Hermeneticus вне форума Ответить с цитированием
Старый 04.08.2017, 07:17   #2
Sciv
Старожил
 
Аватар для Sciv
 
Регистрация: 16.05.2012
Сообщений: 3,211
По умолчанию

Программа ведёт себя, как правило, не так, как Вы хотите, а так, как Вы её написали.

В данном случае увидел много смутно знакомых слов и поленился гуглить, что такое коэф. эксцесса и иже с ним. Может быть, если Вы приведёте конкретную формулу или ссылку на описание алгоритма вычислений - дело пойдёт куда быстрее?
Начал решать проблему с помощью регулярных выражений. Теперь решаю две проблемы...
Sciv вне форума Ответить с цитированием
Старый 04.08.2017, 07:46   #3
Hermeneticus
Пользователь
 
Аватар для Hermeneticus
 
Регистрация: 06.07.2017
Сообщений: 15
По умолчанию

Поменял тип переменной на флоат, всё свершилось как надо, наверное, много данных для дабла оказалось, как - то вскользь читал о таком и вот встретился. Но если формула от этого не стала менее интересной - y2 = (M(X - M(X))^4/(D[X])^(2)) - 3.
...Спиралями мешкотно падает снег,\Уже запирали, когда он обрюзгший,\Как сползший набрюшник, пошёл в полусне\Валить, засыпая, уснувшую пустошь.\...
Hermeneticus вне форума Ответить с цитированием
Старый 04.08.2017, 08:11   #4
p51x
Старожил
 
Регистрация: 15.02.2010
Сообщений: 15,833
По умолчанию

Много данных для дабла, но мало для флоата?... А ничего, что у дабла точность больше?
p51x вне форума Ответить с цитированием
Старый 04.08.2017, 08:37   #5
Hermeneticus
Пользователь
 
Аватар для Hermeneticus
 
Регистрация: 06.07.2017
Сообщений: 15
По умолчанию

Цитата:
Много данных для дабла, но мало для флоата?... А ничего, что у дабла точность больше?
Может и нет, но целочисленное из знаков 9-10, кажется, явно не дало бы -0,17889 при делении на 1,3975. Например. Т.е. выдавало -163,9375/1,5625 = 1,55Е8 что-то такое. А когда присвоил у2 тип флоат, получился вменяемый ответ. Я когда решил отдельно вывести центральный момент третьего порядка отдельно, программа дала мне огромное целое, а коэффициент асимметрии при этом, для вычисления коего я считал в программе этот самый момент, выводился адекватный, почему я здесь и написал, что у меня так вот странно вела себя программа. Хотя в принципе четырёх знаков достаточно,(просто я не знаю, как это исправлять оставив дабл...) я думаю, понятно, что там если ставить например %f вместо %lg точность будет страдать, но флоат поддерживает и этот код. Так что вот. Чёрт. а сейчас нормально работает, какой-то трэш. Извините. Ну вот, там %ld вместо %lg у y2.
...Спиралями мешкотно падает снег,\Уже запирали, когда он обрюзгший,\Как сползший набрюшник, пошёл в полусне\Валить, засыпая, уснувшую пустошь.\...

Последний раз редактировалось Hermeneticus; 04.08.2017 в 08:49.
Hermeneticus вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Программа, выводящая сама себя Gorychev Общие вопросы Delphi 45 31.01.2010 02:45
Программа скриншотит саму себя DimOn4Ik Помощь студентам 5 27.01.2010 21:51
Программа ведёт учёт Электричества и Газа, постоянно работает, есть экспорт в Excel Gennadij2 Microsoft Office Excel 3 24.03.2009 12:41
Несколько очень легких задачек!проверьте себя!!на разные темы,от нах-я суммы до массивов!!прошу решить,кн ruslan55 Паскаль, Turbo Pascal, PascalABC.NET 3 17.06.2008 12:43
Программа печатающая саму себя :o K@$K@ Паскаль, Turbo Pascal, PascalABC.NET 7 09.04.2008 16:24