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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 03.05.2015, 13:51   #1
Sanscrit
Пользователь
 
Регистрация: 23.03.2015
Сообщений: 24
По умолчанию С++ округление дробных чисел

Здравствуйте! В общем такая проблема: написал программу, которая находит обратную матрицу.
Если исходная матрица берется из учебного примера, то все считается корректно.
Если же значения в матрице заполняются рандомно, то обратная матрица представляет из себя девять нулей. Попробовал эти рандомные матрицы в онлайн калькуляторах, ищущих обратную матрицу, они находят обратную матрицу, но со значениями сильно меньше целого числа.
Отсюда я делаю вывод, что программа округляет результат до целых, хотя используется тип double. Определитель считается правильно в любом случае.
В общем, подскажите что не так, на С++ программирую 3.5 дня, возможно чего-то не понимаю с типом данных.

Код:
#include <iostream>
#include <cmath>
#include <cstdlib>
#include <ctime>

using namespace std;

class Matrix{
	public:
	int a[3][3];
	int D;
	int b[3][3];
	double c[3][3];
	
	void Reshenie();

};

void Matrix::Reshenie(){
	cout << "Исходная матрица:" << endl;
	cout << endl;
	srand(time(NULL));
	/*	a[0][0]=2; // при замене на 1, определитель 0
		a[0][1]=5;
		a[0][2]=7;
		a[1][0]=6;
		a[1][1]=3;
		a[1][2]=4;
		a[2][0]=5; // при замене на 3, определитель 1
		a[2][1]=-2;
		a[2][2]=-3; */
	for(int i=0; i<3; i++){
		for(int j=0; j<3; j++){
			a[i][j] = rand()%10-3;
			cout << a[i][j] << "\t";
		}
		cout << endl;
		cout << endl;
	}
	cout << endl;
	cout << "Определитель матрицы равен: ";
	D = (a[0][0]*a[1][1]*a[2][2])+(a[2][0]*a[0][1]*a[1][2])+(a[1][0]*a[2][1]*a[0][2])-(a[2][0]*a[1][1]*a[0][2])-(a[0][0]*a[2][1]*a[1][2])-(a[1][0]*a[0][1]*a[2][2]);
	cout << D << endl;
	if(D==0){
		cout << endl;
		cout << "Обратной матрицы не существует, т.к. определитель равен нулю."<< endl;
		cout << endl;}
	else{
		cout << endl;
		cout << "Находим матрицу алгебраических дополнений:" << endl;
		cout << endl;
		b[0][0]=a[1][1]*a[2][2]-a[2][1]*a[1][2];
		b[0][1]=(a[1][0]*a[2][2]-a[2][0]*a[1][2])*-1;
		b[0][2]=a[1][0]*a[2][1]-a[2][0]*a[1][1];
		b[1][0]=(a[0][1]*a[2][2]-a[2][1]*a[0][2])*-1;
		b[1][1]=a[0][0]*a[2][2]-a[2][0]*a[0][2];
		b[1][2]=(a[0][0]*a[2][1]-a[2][0]*a[0][1])*-1;
		b[2][0]=a[0][1]*a[1][2]-a[1][1]*a[0][2];
		b[2][1]=(a[0][0]*a[1][2]-a[1][0]*a[0][2])*-1;
		b[2][2]=a[0][0]*a[1][1]-a[1][0]*a[0][1];

		for(int i=0; i<3; i++){
			for(int j=0; j<3; j++){
				cout << b[i][j] << "\t";
		}
		cout << endl;
		cout << endl;
		}
		cout << "Транспонируем матрицу алгебраических дополнений:" << endl;
		cout << endl;
		for(int i=0; i<3; i++){
			for(int j=0; j<3; j++){
				cout << b[j][i] << "\t";
		}
		cout << endl;
		cout << endl;
		}
		cout << "Получаем матрицу, обратную исходной:" << endl;
		cout << endl;
		for(int i=0; i<3; i++){
			for(int j=0; j<3; j++){
				c[j][i] = 1/D*b[j][i];
				cout << c[j][i] << "\t";
		}
		cout << endl;
		cout << endl;
		}

	}
}
	

int main(){
	setlocale(LC_ALL, "Rus");
	Matrix _K;
	_K.Reshenie();
	

	system("pause");
	return 0;
}

Последний раз редактировалось Sanscrit; 03.05.2015 в 13:57.
Sanscrit вне форума Ответить с цитированием
Старый 03.05.2015, 15:26   #2
BDA
МегаМодератор
СуперМодератор
 
Аватар для BDA
 
Регистрация: 09.11.2010
Сообщений: 7,317
По умолчанию

1/D делится целочисленно. Напишите 1.0/D.
Пишите язык программирования - это форум программистов, а не экстрасенсов. (<= это подпись )
BDA вне форума Ответить с цитированием
Старый 03.05.2015, 15:33   #3
Sanscrit
Пользователь
 
Регистрация: 23.03.2015
Сообщений: 24
По умолчанию

Спасибо большое, помогло!
Sanscrit вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Умножение дробных чисел BJIagu Общие вопросы Delphi 9 01.04.2013 10:40
Ввод дробных чисел bloodykz C++ Builder 1 23.03.2013 18:13
перевод дробных чисел ArniLand Общие вопросы C/C++ 0 19.02.2011 18:58
перевод/округление дробных данных в БД kate158 БД в Delphi 3 15.05.2009 16:08
Преобразование дробных чисел Gon Помощь студентам 5 01.05.2008 13:12