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

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

Вернуться   Форум программистов > C/C++ программирование > Общие вопросы C/C++
Регистрация

Восстановить пароль
Повторная активизация e-mail

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

Ответ
 
Опции темы Поиск в этой теме
Старый 27.03.2016, 11:23   #1
ilyakonst
Пользователь
 
Регистрация: 27.03.2016
Сообщений: 20
По умолчанию Критерий сериальной корреляции

Помогите найти ошибку. Числа генерируются с помощью ЛКГ. Нужно получить "С" - коэффициент корреляции. Сама формула в прикрепленном файле. U, V - элементы двух последовательностей. Их начальный элемент(объявлены до цикла for - различны), т.е последовательности будут различны. Коэффициент должен получаться от -1 до 1, у меня же выводит -1.#IO
Цитата:
void korel()
{
int i,n=10;
double C=0, koren;
long long c1 = 0, c2 = 0, c3 = 0, z1 = 0, z2 = 0, z3 = 0, z4 = 0, chisl, znam, U=0, V=0;
U = 212;
V = 76;
for (i = 0; i < n; i++) {

U = (1073741829 * U + 17) % 4294967296;
//printf("%d\n", U);
V = (1073741829 * V + 17) % 4294967296;
//printf("%d\n", V);
c1 += U*V;
c2 += U;
c3 += V;
z1 += U*U;
z2 += U;
z3 += V*V;
z4 += V;
}
chisl = n*c1 - c2*c3;
znam = (n*z1 - z2*z2)*(n*z3 - z4*z4);
koren = sqrt(double(znam));
C = chisl / koren;
printf("%.3f",C);

}
ilyakonst вне форума Ответить с цитированием
Старый 27.03.2016, 11:56   #2
kutani
Форумчанин
 
Регистрация: 23.01.2016
Сообщений: 608
По умолчанию

Прицеп потеряли, вот критерий сериальной корреляции из Кнута:


всегда в ЦОС делал по нему )
kutani вне форума Ответить с цитированием
Старый 27.03.2016, 12:11   #3
f.hump
C/C++, Asm
Участник клуба
 
Аватар для f.hump
 
Регистрация: 02.03.2010
Сообщений: 1,323
По умолчанию

может znam у тебя отрицательный получается?

кстати, поменяй % 4294967296 на & 0x0FFFFFFFF, а то меня напрягает немного.

kutani, твоя формула выглядит как самокорреляция, а у тс взаимная корреляция двух полследовательностей. и формульной ошибки я там не вижу.

Последний раз редактировалось f.hump; 27.03.2016 в 12:37.
f.hump вне форума Ответить с цитированием
Старый 27.03.2016, 14:00   #4
kutani
Форумчанин
 
Регистрация: 23.01.2016
Сообщений: 608
По умолчанию

Оставлю это здесь http://computersbooks.net/index.php?...=20012&page=45
kutani вне форума Ответить с цитированием
Старый 27.03.2016, 14:44   #5
ilyakonst
Пользователь
 
Регистрация: 27.03.2016
Сообщений: 20
По умолчанию

Цитата:
Сообщение от kutani Посмотреть сообщение
Прицеп потеряли, вот критерий сериальной корреляции из Кнута:


всегда в ЦОС делал по нему )
нет, моя формула также из Кнута, а то, что вы указали - частный случай моей, который мне не подходит. Прочитайте внимательно условие ее использования
ilyakonst вне форума Ответить с цитированием
Старый 27.03.2016, 14:46   #6
ilyakonst
Пользователь
 
Регистрация: 27.03.2016
Сообщений: 20
По умолчанию

Цитата:
Сообщение от f.hump Посмотреть сообщение
может znam у тебя отрицательный получается?

кстати, поменяй % 4294967296 на & 0x0FFFFFFFF, а то меня напрягает немного.

kutani, твоя формула выглядит как самокорреляция, а у тс взаимная корреляция двух полследовательностей. и формульной ошибки я там не вижу.
в каком именно месте, а то я нубас) и есть ли принципиальная разница? я же мог 2^32 записать через pow, но это лишняя операция. Я думаю, что у меня где-то происходит переполнение, но найти не могу
ilyakonst вне форума Ответить с цитированием
Старый 27.03.2016, 14:51   #7
ilyakonst
Пользователь
 
Регистрация: 27.03.2016
Сообщений: 20
По умолчанию

Цитата:
Сообщение от f.hump Посмотреть сообщение
может znam у тебя отрицательный получается?
не должно быть, в формуле все в квадрат возводится, не может быть отрицательных чисел.
UPD: знаменатель действительно отрицательный, хотя это невозможно.
Цитата:
void korel()
{
int i,n=10;
double C=0, koren;
long long c1 = 0, c2 = 0, c3 = 0, z1 = 0, z2 = 0, z3 = 0, z4 = 0, chisl, znam, U=0, V=0;
U = 2102;
V = 76;
for (i = 0; i < n; i++) {

U = (1073741829 * U + 17) % 4294967296;
//printf("%d\n", U);
V = (1073741829 * V + 17) % 4294967296;
//printf("%d\n", V);
c1 += U*V;
c2 += U;
c3 += V;
z1 += U*U;
z2 += U;
z3 += V*V;
z4 += V;

}
printf("%d\n", z1); printf("%d\n", z2); printf("%d\n", z3); printf("%d\n", z4); //добавил вывод частей знаменателя
chisl = n*c1 - c2*c3;
znam = (n*z1 - z2*z2)*(n*z3 - z4*z4);
//printf("%lld\n", znam);
koren = sqrt(double(znam));
C = chisl / koren;
printf("%.3f",C);

}
Добавил вывод, там при разных входных параметрах числа, возведенные в квадрат почему-то получается отрицательными.
UPD: изменил количество генерируемых эл-ов, теперь оно четное, всегда получается коэффициент. Но он должен быть в пределах от -1..1, а у меня 10ки тыясч, значит где-то в формуле идет ошибка

Последний раз редактировалось ilyakonst; 27.03.2016 в 15:03.
ilyakonst вне форума Ответить с цитированием
Старый 27.03.2016, 14:57   #8
Аватар
Старожил
 
Аватар для Аватар
 
Регистрация: 17.11.2010
Сообщений: 19,042
По умолчанию

Цитата:
c1 += U*V;
Почему бы здесь не быть переполнению, или ниже по аналогичному
Если бы архитекторы строили здания так, как программисты пишут программы, то первый залетевший дятел разрушил бы цивилизацию
Аватар вне форума Ответить с цитированием
Старый 27.03.2016, 15:10   #9
ilyakonst
Пользователь
 
Регистрация: 27.03.2016
Сообщений: 20
По умолчанию

Цитата:
Сообщение от Аватар Посмотреть сообщение
Почему бы здесь не быть переполнению, или ниже по аналогичному
проверил, переполнений нет нигде.
все высчитывается
Изображения
Тип файла: jpg qБезымянный.jpg (17.2 Кб, 120 просмотров)
ilyakonst вне форума Ответить с цитированием
Старый 27.03.2016, 15:43   #10
f.hump
C/C++, Asm
Участник клуба
 
Аватар для f.hump
 
Регистрация: 02.03.2010
Сообщений: 1,323
По умолчанию

Аватар прав.
у тебя там в каждой операции целочисленные переполнения.

сделай
c1 = 0, c2 = 0, c3 = 0, z1 = 0, z2 = 0, z3 = 0, z4 = 0, chisl, znam
даблом

и в аккумуляторах делай каст (double)U, (double)V
f.hump вне форума Ответить с цитированием
Ответ


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

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Критерий серий Veryn4ik1993 Паскаль, Turbo Pascal, PascalABC.NET 0 18.01.2014 11:43
ВПР критерий Artem_85 Microsoft Office Excel 10 08.11.2012 13:59
критерий Сильвестра Roman Фриланс 1 19.04.2012 19:02
критерий Сильвестра Roman Общие вопросы C/C++ 4 12.04.2012 02:30
решение урав-й типа Vn=a+b/Vg и определение коэф.корреляции serjufa Помощь студентам 2 11.11.2010 06:32