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

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
Donville
0 / 0 / 0
Регистрация: 16.02.2014
Сообщений: 113
#1

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

14.06.2014, 20:26. Просмотров 523. Ответов 11
Метки нет (Все метки)

Доброго времени суток! Имеется функция, которая возводит, ранее введенную матрицу, в степень. Иногда все отображается нормально, а иногда в паре строк значения стают 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);
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
14.06.2014, 20:26
Здравствуйте! Я подобрал для вас темы с ответами на вопрос При возведении числа в степень оно становится равным Nan (C++):

Неправильный результат при возведении числа в степень - C++
#include&lt;stdio.h&gt; #include&lt;math.h&gt; main() { int n,a; scanf(&quot;%d&quot;,&amp;n); a=pow(2,n); printf(&quot;%d&quot;,a); ...

Ошибка при возведении числа в отрицательную степень - C++
Здравствуйте! Начал учить С++ по книге Лафоре. При выполнении задачи из раздела функции столкнулся со следующей проблемой (задача на...

Длинная арифметика при возведении в степень - C++
Ребята как можно вводить тип с 10^1000000 емкостью?

Найти последнюю цифру при возведении в степень - C++
найти последную цифру A^B. 1&lt;=A&lt;=1000 и 1&lt;=B&lt;=10^9 ввод данных 24 9 ввод данных 4

При возведении в степень выводится результат "1.#INF" - C++
При значении &quot;k&quot; больше 4 выводит значение 1.#INF. Как можно это исправить? #include&quot;stdafx.h&quot; #include&lt;iostream&gt; #include&lt;math.h&gt;...

Найти все меньшие 100 натуральные числа, которые при возведении в квадрат дают палиндром. - C++
Назовем натуральное число палиндромом, если его запись читается одинаково с начала и с конца (как, например, 4884, 393, 1). Найти...

11
nmcf
5354 / 4674 / 1565
Регистрация: 14.04.2014
Сообщений: 18,638
14.06.2014, 21:01 #2
Числа-то там какие? Может результат не может быть представлен в диапазоне double?
0
Donville
0 / 0 / 0
Регистрация: 16.02.2014
Сообщений: 113
14.06.2014, 21:44  [ТС] #3
Там результат в диапазоне +-e021. Но проблема точно не в диапазоне, так как nan выскакивает только при первом вызове функции, а при вызове её со второго раза без выхода из программы проблем не возникает и все работает как надо.
0
nmcf
5354 / 4674 / 1565
Регистрация: 14.04.2014
Сообщений: 18,638
14.06.2014, 21:52 #4
Проверяй отладчиком на простейшем примере.
0
Donville
0 / 0 / 0
Регистрация: 16.02.2014
Сообщений: 113
14.06.2014, 22:19  [ТС] #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. Поэтому и не выводятся. Как исправить? Не пойму что в коде не так.
0
nmcf
5354 / 4674 / 1565
Регистрация: 14.04.2014
Сообщений: 18,638
14.06.2014, 22:29 #6
Ну вот, это уже выходит за диапазон double, там до e308.
Числа-то как в матрицу попадают? Из Allocation()?
0
Donville
0 / 0 / 0
Регистрация: 16.02.2014
Сообщений: 113
14.06.2014, 22:36  [ТС] #7
В матрицу step (матрица А^n) они попадают через функцию Expo(). Код в первом сообщении.
0
nmcf
5354 / 4674 / 1565
Регистрация: 14.04.2014
Сообщений: 18,638
14.06.2014, 22:41 #8
Исходные данные откуда берутся? Ты память выделяешь под матрицу, это Allocation. А данные-то откуда для умножения берутся?
0
Donville
0 / 0 / 0
Регистрация: 16.02.2014
Сообщений: 113
15.06.2014, 14:55  [ТС] #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 Посмотреть сообщение
В принципе, проблему решил двойным вызовом функции, то есть так:
К сожалению, проблема не решилась, есть идеи какие-то?
0
zss
Модератор
Эксперт С++
6484 / 6047 / 1985
Регистрация: 18.12.2011
Сообщений: 15,680
Завершенные тесты: 1
15.06.2014, 15:13 #10
Цитата Сообщение от Donville Посмотреть сообщение
cin>>mat1[i][j]) || (mat[i][j]<(-1000))
может cin>>mat[i][j]
Без единички....
0
Donville
0 / 0 / 0
Регистрация: 16.02.2014
Сообщений: 113
15.06.2014, 16:06  [ТС] #11
Нет, это моя оплошность. Я когда код на форум закидывал, то убирал лишнее, а это не заметил. Сам код там 1.5к строк, но проблема не в этой строчке.
0
Donville
0 / 0 / 0
Регистрация: 16.02.2014
Сообщений: 113
16.06.2014, 23:36  [ТС] #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];
        }
    }
Спасибо добрым людям за это!
0
16.06.2014, 23:36
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
16.06.2014, 23:36
Привет! Вот еще темы с ответами:

Найти все меньшие 100 натуральные числа, которые при возведении в квадрат дают палиндром - C++
Назовём натуральное число палиндромом, если его запись читается одинаково как с начала так и с конца (пример: 4884, 393, 1, 22). Найти...

Определение k, при котором функция становится меньше заданного числа - C++
Текст задачи: ' Составить программу для определения k, при котором функция (x^k / k) становится меньше заданного числа A при заданном x...

вводятся числа a и b. Надо найти сумму таких чисел в диапазоне [a;b], которые при возведении в квадрат дают число с последней цифрой 6. - C++
Помогите пожалуйста написать программку, вот задание - вводятся числа a и b. Надо найти сумму таких чисел в диапазоне , которые при...

поиск среди чисел такого, которое при возведении в куб и сложении со всеми делителями является квадратом какого-нибудь числа - C++
Необходимо написать функцию, которая в качестве аргументов принимает промежуток целых чисел, и осуществляет поиск среди этих чисел такого,...


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

Или воспользуйтесь поиском по форуму:
12
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru