Форум программистов, компьютерный форум CyberForum.ru

Округление значений в двумерной динамической матрице - C++

Восстановить пароль Регистрация
 
Blueeyer
12 / 12 / 1
Регистрация: 09.10.2013
Сообщений: 220
22.11.2013, 03:35     Округление значений в двумерной динамической матрице #1
Как сделать так, чтобы при делении, вычитании и прочих действий между значениями двумерной матрицы - все они округлялись до 0.001? У меня почему-то вышла такая вещь, что при умножении 4*0,8 и всё это отнять от четверки - выходит -596046e-008 - как я понимаю - это ничтожно малое число, которое при округлении даст 0?
Вот код программки:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
#include<iostream>
#include<cmath>
 
using namespace std;
 
int main()
{
    setlocale(LC_ALL, "Russian");
    float **matrix=NULL;
    int n, m;
    cout<<"Введите кол-во строк: "<<endl;
    cin>>n;
    cout<<"Введите кол-во неизвестных в строке: "<<endl; 
    cin>>m;
 
    matrix=new float *[n];
    for (int i=0; i<n; i++)
   matrix[i]=new float [m+1];
    for (int v=0; v<n; v++){
        for (int j=0; j<m; j++){
            cout<<"Строка #"<<v+1<<" ----- Неизвестная #"<<j+1<<endl;
            cin>>matrix[v][j];
        }
        cout<<"Чему это равно? ("<<v+1<<" строка)"<<endl;
        cin>>matrix[v][m];
    }
    cout<<endl<<endl<<endl<<"Начальная матрица."<<endl;
    for (int k = 0; k < n; k++){
        for (int l = 0; l <= m; l++){          //Для вывода матрицы 
            cout<<matrix[k][l]<<"  ";
        }
        cout<<endl<<endl;    
    }   cout<<endl<<endl<<endl;     
    for (int goo = 1; goo < 2; goo++){ // Там где 2 - поменять на (n+1)
    for (int bl = 0; bl < goo; bl++){ 
        for(int bla = bl; bla <= bl; bla++){
            int la;
            for(la = n; la >= 0; la--){
                int o = bl+bla, ko = bla+la;
                matrix[o][ko]= (float) (matrix[o][ko])/(matrix[bl][bl]);
        }
            }
    }
    }
    cout<<"Делим всю строчку на первое неизвестное."<<endl;
        for (int k = 0; k < n; k++){
        for (int l = 0; l <= m; l++){          //Для вывода матрицы 
            cout<<matrix[k][l]<<"  ";
        }
        cout<<endl<<endl;
        }cout<<endl<<endl<<endl; 
    for(int jgoo = 1; jgoo < n; jgoo++){// строки матрицы
        for(int jbl = m; jbl >= 0; jbl--){// неизвестные
            int jgoal = 0;// первое неизвестное первой строки (надо будет поменять)
            
            matrix[jgoo][jbl] = (float) matrix[jgoo][jbl] - (matrix[jgoo][jgoal])*(matrix[jgoal][jbl]);
        }
    }
        cout<<"Отнимаем от каждой последующей строки первую строчку, умноженную на первое число каждой из них."<<endl;
            for (int k = 0; k < n; k++){
        for (int l = 0; l <= m; l++){          //Для вывода матрицы 
            cout<<matrix[k][l]<<"  ";
        }
        cout<<endl<<endl;
        }cout<<endl<<endl<<endl; 
 
 
    system("PAUSE");
    return 0;
}
Вот как всё это выглядит (Начальные значения матрицы вводятся пользователем в ручную, для простоты я взял однозначные числа).
Округление значений в двумерной динамической матрице
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
22.11.2013, 03:35     Округление значений в двумерной динамической матрице
Посмотрите здесь:

В двумерной матрице отсортировать столбцы методом вставок C++
C++ В двумерной матрице найти минимальные элементы каждой строки и переставить на первое место
C++ Добавление строк динамической матрице
C++ Определить максимальную сумму соседних элементов в двумерной матрице
C++ Определить, есть ли в заданной динамической матрице строка с заданными значениями
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
ПерС
366 / 282 / 84
Регистрация: 05.11.2013
Сообщений: 806
Записей в блоге: 5
Завершенные тесты: 1
22.11.2013, 10:27     Округление значений в двумерной динамической матрице #2
напиши функцию округления до 3 знаков, например,
C++
1
2
3
4
double round3 (double x) {
 double x2=x*1000;
 return (x2 - floor(x2)>=0.5 ? ceil(x2) : floor(x2))/1000;
}
(не лучший вариант из возможных, правда)

и округлять нужно, конечно, не "при делении, вычитании", а после всех действий, перед выводом
Blueeyer
12 / 12 / 1
Регистрация: 09.10.2013
Сообщений: 220
22.11.2013, 14:45  [ТС]     Округление значений в двумерной динамической матрице #3
Цитата Сообщение от ПерС Посмотреть сообщение
напиши функцию округления до 3 знаков, например,
C++
1
2
3
4
double round3 (double x) {
 double x2=x*1000;
 return (x2 - floor(x2)>=0.5 ? ceil(x2) : floor(x2))/1000;
}
(не лучший вариант из возможных, правда)

и округлять нужно, конечно, не "при делении, вычитании", а после всех действий, перед выводом
Что-то не могу найти - куда мне это засунуть и как. И вообще по сути там должен был выйти ровно 0, но почему-то так не получилось. Почему такое может быть?
ПерС
366 / 282 / 84
Регистрация: 05.11.2013
Сообщений: 806
Записей в блоге: 5
Завершенные тесты: 1
22.11.2013, 14:47     Округление значений в двумерной динамической матрице #4
Как сделать так, чтобы ... все они округлялись до 0.001?
округлять ... перед выводом
выводи не matrix[v][m] а round3(matrix[v][m]) , не?
зачем нужны функции никак?
Blueeyer
12 / 12 / 1
Регистрация: 09.10.2013
Сообщений: 220
22.11.2013, 14:51  [ТС]     Округление значений в двумерной динамической матрице #5
Цитата Сообщение от ПерС Посмотреть сообщение
выводи не matrix[v][m] а round3(matrix[v][m]) , не?
зачем нужны функции никак?
Error: identifer (round) is undefined.
ПерС
366 / 282 / 84
Регистрация: 05.11.2013
Сообщений: 806
Записей в блоге: 5
Завершенные тесты: 1
22.11.2013, 14:53     Округление значений в двумерной динамической матрице #6
Попробуем ещё раз:

зачем нужны функции никак?

считаешь, если не добавить в программу тело функции, она должна работать?

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
#include <iostream.h>
#include <math.h>
 
double round3 (double x) {
 double x2=x*1000;
 return (x2 - floor(x2)>=0.5 ? ceil(x2) : floor(x2))/1000;
}
 
int main () {
 double a[] = { 1.340856, 0.0000007, -1.00223, -4.00501, 1234.5678 };
 for (int i=0; i<5; i++) cout << round3(a[i]) << endl;
 cin.get();
 return 0;
}
1.341
0
-1.002
-4.005
1234.568
Blueeyer
12 / 12 / 1
Регистрация: 09.10.2013
Сообщений: 220
22.11.2013, 17:07  [ТС]     Округление значений в двумерной динамической матрице #7
Цитата Сообщение от ПерС Посмотреть сообщение
Попробуем ещё раз:

зачем нужны функции никак?

считаешь, если не добавить в программу тело функции, она должна работать?

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
#include <iostream.h>
#include <math.h>
 
double round3 (double x) {
 double x2=x*1000;
 return (x2 - floor(x2)>=0.5 ? ceil(x2) : floor(x2))/1000;
}
 
int main () {
 double a[] = { 1.340856, 0.0000007, -1.00223, -4.00501, 1234.5678 };
 for (int i=0; i<5; i++) cout << round3(a[i]) << endl;
 cin.get();
 return 0;
}
Спасибо, помогло. Просто странно, как-то вышло. Из действий, которые происходят в программе - выходит такое:
matrix[2][4] = 4-(5*0.8) = -5.96046e-008 ---- хотя должен ведь выйти ровно 0. В чем может быть дело?
ПерС
366 / 282 / 84
Регистрация: 05.11.2013
Сообщений: 806
Записей в блоге: 5
Завершенные тесты: 1
22.11.2013, 17:12     Округление значений в двумерной динамической матрице #8
Цитата Сообщение от Blueeyer Посмотреть сообщение
В чем может быть дело?
Это один из столпов программирования
Если вкратце, цитато из инета:
Во всех IBM-совместимых компьютерах вещественные числа хранятся как совокупность мантиссы и порядка, что позволяет упростить операции над ними, используя специальную арифметику, отдельно обрабатывающую мантиссу и порядок...
Поскольку размер памяти, отводимой под мантиссу и порядок, ограничен, то вещественные числа всегда представляются в памяти компьютера с некоторой погрешностью. Например, простейшая вещественная дробь 2/3 дает в десятичном представлении 0,666666... и, независимо от размера памяти, выделяемой для хранения числа, невозможно хранить все его знаки в дробной части. Одной из типичных проблем программирования является учет возможных погрешностей при работе с вещественными числами.
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
22.11.2013, 20:32     Округление значений в двумерной динамической матрице
Еще ссылки по теме:

C++ В динамической матрице целых чисел добавить строки после строки, содержащей простое число
C++ Поменять местами числа по диагонали в двумерной матрице
Определить максимальное количество простых чисел в двумерной матрице C++

Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
Blueeyer
12 / 12 / 1
Регистрация: 09.10.2013
Сообщений: 220
22.11.2013, 20:32  [ТС]     Округление значений в двумерной динамической матрице #9
Цитата Сообщение от ПерС Посмотреть сообщение
Это один из столпов программирования
Если вкратце, цитато из инета:
Спасибо за помощь и информацию))
Yandex
Объявления
22.11.2013, 20:32     Округление значений в двумерной динамической матрице
Ответ Создать тему
Опции темы

Текущее время: 11:14. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru