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

При возведении числа в степень оно становится равным Nan - C++

Восстановить пароль Регистрация
 
Donville
0 / 0 / 0
Регистрация: 16.02.2014
Сообщений: 112
14.06.2014, 20:26     При возведении числа в степень оно становится равным Nan #1
Доброго времени суток! Имеется функция, которая возводит, ранее введенную матрицу, в степень. Иногда все отображается нормально, а иногда в паре строк значения стают nan. При возведении матрицы размером 2х2, выводит 4 элемента в одну строку и значения их тоже nan.

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
void Expo(long double **mat, long double **step, int row, int exp)
{
    int ex=1;
    long double **temp = 0;
    temp = Allocation(row,row); //allocation of temporary matrix
 
    for (int i=0; i<row; i++)
    {
        for (int j=0; j<row; j++)
        {
            step[i][j] = mat[i][j];
        }
    }
 
    while (++ex <= exp) //Raises the power by multiplying A^n=A*A*...*A - exp times
    {
        for (int i=0; i<row; i++)
        {
            for (int j=0; j<row; j++)
            {
                for (int v=0; v<row; v++)
                {
                    temp[i][j] += step[i][v] * mat[v][j]; //increase element temp[i][j] on step[i][v]*mat[v][j
                }
            }
        }
 
        for (int i=0; i<row; i++)
        {
            for (int j=0; j<row; j++)
            {   step[i][j] = temp[i][j];
                temp[i][j] = 0; //nulling each element of matrix temp
            }
        }
    }
    Deallocation(temp, row); //deallocation of temporary matrix
}
Вызываю так:
C++
1
2
step = Allocation(k,k);
Expo(mat, step, k, exp);
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
14.06.2014, 20:26     При возведении числа в степень оно становится равным Nan
Посмотрите здесь:

C++ Нужно откоректировать программу которая будет при вводе любого числа, выводить чётное оно или нет
вводятся числа a и b. Надо найти сумму таких чисел в диапазоне [a;b], которые при возведении в квадрат дают число с последней цифрой 6. C++
Найти все меньшие 100 натуральные числа, которые при возведении в квадрат дают палиндром. C++
Cколько будет палиндромов в промежутке от 1...9000 при возведении в квадрат? C++
C++ Написать программу с функцией, вычисляющей целую степень дробного числа. Учесть,что степень может быть положительной, отрицательной, нулевой
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
nmcf
4261 / 3692 / 1243
Регистрация: 14.04.2014
Сообщений: 14,470
14.06.2014, 21:01     При возведении числа в степень оно становится равным Nan #2
Числа-то там какие? Может результат не может быть представлен в диапазоне double?
Donville
0 / 0 / 0
Регистрация: 16.02.2014
Сообщений: 112
14.06.2014, 21:44  [ТС]     При возведении числа в степень оно становится равным Nan #3
Там результат в диапазоне +-e021. Но проблема точно не в диапазоне, так как nan выскакивает только при первом вызове функции, а при вызове её со второго раза без выхода из программы проблем не возникает и все работает как надо.
nmcf
4261 / 3692 / 1243
Регистрация: 14.04.2014
Сообщений: 14,470
14.06.2014, 21:52     При возведении числа в степень оно становится равным Nan #4
Проверяй отладчиком на простейшем примере.
Donville
0 / 0 / 0
Регистрация: 16.02.2014
Сообщений: 112
14.06.2014, 22:19  [ТС]     При возведении числа в степень оно становится равным Nan #5
В принципе, проблему решил двойным вызовом функции, то есть так:

C++
1
2
3
4
5
6
7
8
step = Allocation(k,k); //функция выделения памяти под матрицу А^n
Expo(mat, step, k, exp); //функция возведения матрицы в степень
Deallocation(step, k); //функция очищения памяти под матрицу А^n
step = Allocation(k,k);
Expo(mat, step, k, exp);
cout << "\nResult:\n"; 
OutputExp(step,k); //функция вывода матрицы А^n
Deallocation(step, k);
Но все равно при возведении матрицы размером 2х2, выводит 4 элемента в одну строку.
И насколько мое решение является правильным?

Добавлено через 24 минуты
Проверил Debugger`ом там значения +-е+3717. Поэтому и не выводятся. Как исправить? Не пойму что в коде не так.
nmcf
4261 / 3692 / 1243
Регистрация: 14.04.2014
Сообщений: 14,470
14.06.2014, 22:29     При возведении числа в степень оно становится равным Nan #6
Ну вот, это уже выходит за диапазон double, там до e308.
Числа-то как в матрицу попадают? Из Allocation()?
Donville
0 / 0 / 0
Регистрация: 16.02.2014
Сообщений: 112
14.06.2014, 22:36  [ТС]     При возведении числа в степень оно становится равным Nan #7
В матрицу step (матрица А^n) они попадают через функцию Expo(). Код в первом сообщении.
nmcf
4261 / 3692 / 1243
Регистрация: 14.04.2014
Сообщений: 14,470
14.06.2014, 22:41     При возведении числа в степень оно становится равным Nan #8
Исходные данные откуда берутся? Ты память выделяешь под матрицу, это Allocation. А данные-то откуда для умножения берутся?
Donville
0 / 0 / 0
Регистрация: 16.02.2014
Сообщений: 112
15.06.2014, 14:55  [ТС]     При возведении числа в степень оно становится равным Nan #9
Числа в матрицу попадают либо вручную
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
for (i=0; i<k; i++)//Fill array manually
{
    for (j=0; j<m; j++)
    {
        cout << "Enter element [" << i+1 << "][" <<j+1 << "]  (-1000 to 1000) : ";
        while(!(cin>>mat1[i][j]) || (mat[i][j]<(-1000)) || (mat[i][j]>1000) || cin.get() != '\n' ) //incorrect input protection
        {
            cout<<"Input incorrect. Please, try again.\n";
            cin.clear(); // resets all bits of stream
            cin.sync(); //remove data from the buffer
            cout << "Enter element [" << i+1 << "][" <<j+1 << "]  (-1000 to 1000) : ";
        }
    }
cout<<endl;
}
либо рандомно
C++
1
2
3
4
5
6
for (i = 0; i<k; i++)
{
    for (int j = 0; j<m; j++)
        cout << (mat[i][j] = -100 + rand()%200 + rand()%101/1000.) << "\t"; //generates numbers from range [-100;100] with 3 characters after point
    cout << "\n";
}
Но в обоих случаях выбивает nan.

Добавлено через 16 часов 1 минуту
Цитата Сообщение от Donville Посмотреть сообщение
В принципе, проблему решил двойным вызовом функции, то есть так:
К сожалению, проблема не решилась, есть идеи какие-то?
zss
Модератор
Эксперт С++
 Аватар для zss
5942 / 5547 / 1783
Регистрация: 18.12.2011
Сообщений: 14,155
Завершенные тесты: 1
15.06.2014, 15:13     При возведении числа в степень оно становится равным Nan #10
Цитата Сообщение от Donville Посмотреть сообщение
cin>>mat1[i][j]) || (mat[i][j]<(-1000))
может cin>>mat[i][j]
Без единички....
Donville
0 / 0 / 0
Регистрация: 16.02.2014
Сообщений: 112
15.06.2014, 16:06  [ТС]     При возведении числа в степень оно становится равным Nan #11
Нет, это моя оплошность. Я когда код на форум закидывал, то убирал лишнее, а это не заметил. Сам код там 1.5к строк, но проблема не в этой строчке.
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
16.06.2014, 23:36     При возведении числа в степень оно становится равным Nan
Еще ссылки по теме:

C++ поиск среди чисел такого, которое при возведении в куб и сложении со всеми делителями является квадратом какого-нибудь числа
При возведении в степень выводится результат "1.#INF" C++
Найти числа от 1 до 99 - палиндромы, которые при возведении в квадрат также дают палиндромы (используя циклы) C++

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

Или воспользуйтесь поиском по форуму:
Donville
0 / 0 / 0
Регистрация: 16.02.2014
Сообщений: 112
16.06.2014, 23:36  [ТС]     При возведении числа в степень оно становится равным Nan #12
Ошибка в инициализация массива. Нужно дописать
C++
1
2
3
4
5
6
7
8
 for (int i=0; i<row; i++)
    {
        for (int j=0; j<row; j++)
        {
           temp[i][j] = 0;     //дописаная строка     
     step[i][j] = mat[i][j];
        }
    }
Спасибо добрым людям за это!
Yandex
Объявления
16.06.2014, 23:36     При возведении числа в степень оно становится равным Nan
Ответ Создать тему
Опции темы

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