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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 31.08.2017, 13:09   #1
Hermeneticus
Пользователь
 
Аватар для Hermeneticus
 
Регистрация: 06.07.2017
Сообщений: 15
По умолчанию Неопределённость

Отчего возникает неопределённость отрицательная, при извлечении кв. корня и как её избежать, может кто-нибудь кратко и доступно изложить, пожалуйста? Язык Си. Если код необходим, то
Код:
#include <stdio.h>
#include <stdlib.h>
#include <locale.h>
#include <malloc.h>
#include <math.h>

/* Для аппроксимации */
int main(void)
{
	setlocale(LC_ALL, "Rus");
	
	double *x, *y, *ycount, sumx, sumy, sqrx, xy, a, b, c, pogr, diffy;
	double ysqrx, x_in_3, x_in_4, det, det1, det2, det3, qux, std_x, std_y, std_2_x, std_2_y, r, r_2, midx, midy, d;
	int n, choice;
	int i;
	
	printf("Enter n:");
	scanf("%d", &n);
	
	x = (double*)malloc(n * sizeof(double));//выделение памяти
	
	printf("Enter x:\n");
	for(i = 0; i < n;i++)
	{
		scanf("%lg", &x[i]);
		sumx+=x[i];
		sqrx+=pow(x[i], 2);
		x_in_3+=pow(x[i], 3);
		x_in_4+=pow(x[i], 4);

	}

	midx = sumx/n;

	y = (double*)malloc(n * sizeof(double));
	printf("Enter y:\n");
	for(i = 0; i < n; i++)
	{
		scanf("%lg", &y[i]);
		sumy+=y[i];
		xy+=x[i] * y[i];
		ysqrx+=pow(x[i],2) * y[i];
	}
	
	midy = sumy/n;

	printf("What kind of Approximation do you need?\n1 - Linear;\n2 - Quadratic;\n");
	scanf("%d", &choice);

	ycount = (double*)malloc(n * sizeof(double));//

	switch(choice)
	{
		case 1: 
  	a = ((n * xy) - (sumx * sumy))/(n * sqrx - pow(sumx, 2));
  	b = (sumy - a * sumx)/n;
  	
  	a = round(a*100)/100;
  	b = round(b*100)/100;

  	for(i = 0; i < n; i++)
  	{
  		ycount[i] = a * x[i] + b;
  		diffy = fabs((y[i] - ycount[i])/y[i]);
  		pogr+=(pow(n,-1)*diffy*100);

  		std_2_x += pow((x[i] - midx),2)/n;
  		std_2_y += pow((y[i] - midy),2)/n;
	}

	std_x = sqrt(std_2_x);
	std_y = sqrt(std_2_y);

	d = (std_x/std_y);
	r = b * d;
	r_2 = pow(r, 2);

	pogr = round(pogr*100)/100;
	
  	printf("\n\n\n");
  	printf(("y = %lgx + %g\n"
	  		"A = %lg\%\%\n"
	  		"StdDevx = %lg\n"
	  		"StdDevy = %lg\n"
	  		"r = %lg\n"), a, b, pogr, std_x, std_y, r);
  		break;

  		case 2:
  			det=pow(sqrx,3)+pow(sumx,2)*x_in_4+n*pow(x_in_3,2)-n*sqrx*x_in_4-sumx*x_in_3*sqrx-sqrx*x_in_3*sumx;
  			det1=sumy*pow(sqrx, 2)+pow(sumx, 2)*ysqrx+n*xy*x_in_3-n*sqrx*ysqrx-sumy*sumx*x_in_3-sqrx*xy*sumx;
  			det2=pow(sqrx, 2)*xy+sumx*sumy*x_in_4+n*x_in_3*ysqrx-n*xy*x_in_4-sumy*x_in_3*sqrx-sqrx*ysqrx*sumx;
  			det3=pow(sqrx,2)*ysqrx+sumx*xy*x_in_4+pow(x_in_3,2)*sumy-sumy*sqrx*x_in_4-sumx*x_in_3*ysqrx-sqrx*x_in_3*xy;

  			a = round((det1/det)*100)/100;
  			b = round((det2/det)*100)/100;
  			c = round((det3/det)*100)/100;
  			
  			for(i = 0; i < n; i++)
  			{
  				qux=pow(x[i], 2);
  				ycount[i] = (a*qux + (b*x[i]) + c);
  				diffy = fabs((y[i] - ycount[i])/y[i]);
  				pogr+=(pow(n,-1)*diffy*100);

  				std_2_x += pow((x[i] - midx),2)/n;
  				std_2_y += pow((y[i] - midy),2)/n;
  			}

  			std_x = sqrt(std_2_x);
			std_y = sqrt(std_2_y);

			d = (std_x/std_y);
			r = d*b;
			r_2 = pow(r, 2);

  			pogr=round(pogr*100)/100;

  			printf("\n\n\n");
  			printf(("y = %lgx^2 + %lgx + %lg\n"
  					"A = %lg\%\%\n"
  					"StdDevx = %lg\n"
  					"StdDevy = %lg\n"
  					"r = %lg\n"), a, b, c, pogr, std_x, std_y, r);

  		break;
  	}
  	free(ycount);
  	free(x);
  	free(y);
  	
  	getchar();getchar();
	return 0;
}
...Спиралями мешкотно падает снег,\Уже запирали, когда он обрюзгший,\Как сползший набрюшник, пошёл в полусне\Валить, засыпая, уснувшую пустошь.\...
Hermeneticus вне форума Ответить с цитированием
Старый 31.08.2017, 13:29   #2
Serge_Bliznykov
Старожил
 
Регистрация: 09.01.2008
Сообщений: 26,229
По умолчанию

так. а где Вы присваиваете начальное значение переменным
std_2_x, std_2_y ?

попробуйте туда записывать ноль перед циклами.
должно помочь.
Serge_Bliznykov вне форума Ответить с цитированием
Старый 31.08.2017, 13:44   #3
Hermeneticus
Пользователь
 
Аватар для Hermeneticus
 
Регистрация: 06.07.2017
Сообщений: 15
По умолчанию

Я им не присваиваю, но из std_2_x берёт нормально корень, а вот с игрек...ну ладно, попробую сейчас. Помогло, спасибо.
...Спиралями мешкотно падает снег,\Уже запирали, когда он обрюзгший,\Как сползший набрюшник, пошёл в полусне\Валить, засыпая, уснувшую пустошь.\...

Последний раз редактировалось Hermeneticus; 31.08.2017 в 13:47.
Hermeneticus вне форума Ответить с цитированием
Старый 31.08.2017, 14:10   #4
Serge_Bliznykov
Старожил
 
Регистрация: 09.01.2008
Сообщений: 26,229
По умолчанию

Цитата:
Сообщение от Hermeneticus Посмотреть сообщение
Я им не присваиваю
это зря.
запомните - прежде чем обращаться к любой переменной, нужно сначала её иницилизировать (записать туда начальное значение).

вот пример.
Вы дали Буратино 2 яблока. Сколько сейчас яблок у Буратино?

Ответ - "неизвестно сколько! Ведь мы не знаем, сколько у него яблок было до того, как мы ему что-то дали"

я Вам больше скажу. современные компиляторы не дают скомпилировать код, если видят обращение к неиницилизированной переменной. И это правильно.
Конечно, многие компиляторы сами заполняют нулями глобальные переменные.
Но это Вам никто не гарантирует.
Поэтому в переменной может оказаться произвольная информация (т.н. "мусор").
Что, пои видимому, и произошло в вашем случае.

Ладно. Заканчиваю мини-лекцию.
Успехов в программировании.
Serge_Bliznykov вне форума Ответить с цитированием
Ответ


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

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

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