0 / 0 / 1
Регистрация: 16.02.2014
Сообщений: 113
1

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

14.06.2014, 20:26. Показов 1556. Ответов 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
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
14.06.2014, 20:26
Ответы с готовыми решениями:

Ошибка NAN при возведении в степень
Ребята помогите пожалуйста в чем проблема у меня в результатах пишет -NAN вот задание ...

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

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

Ошибка 207 при возведении числа в степень
for i:=1 to n do a:=(exp(i*ln(-1))) как возвести -1 в степень подскажите?

11
7166 / 6141 / 2802
Регистрация: 14.04.2014
Сообщений: 26,462
14.06.2014, 21:01 2
Числа-то там какие? Может результат не может быть представлен в диапазоне double?
0
0 / 0 / 1
Регистрация: 16.02.2014
Сообщений: 113
14.06.2014, 21:44  [ТС] 3
Там результат в диапазоне +-e021. Но проблема точно не в диапазоне, так как nan выскакивает только при первом вызове функции, а при вызове её со второго раза без выхода из программы проблем не возникает и все работает как надо.
0
7166 / 6141 / 2802
Регистрация: 14.04.2014
Сообщений: 26,462
14.06.2014, 21:52 4
Проверяй отладчиком на простейшем примере.
0
0 / 0 / 1
Регистрация: 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
7166 / 6141 / 2802
Регистрация: 14.04.2014
Сообщений: 26,462
14.06.2014, 22:29 6
Ну вот, это уже выходит за диапазон double, там до e308.
Числа-то как в матрицу попадают? Из Allocation()?
0
0 / 0 / 1
Регистрация: 16.02.2014
Сообщений: 113
14.06.2014, 22:36  [ТС] 7
В матрицу step (матрица А^n) они попадают через функцию Expo(). Код в первом сообщении.
0
7166 / 6141 / 2802
Регистрация: 14.04.2014
Сообщений: 26,462
14.06.2014, 22:41 8
Исходные данные откуда берутся? Ты память выделяешь под матрицу, это Allocation. А данные-то откуда для умножения берутся?
0
0 / 0 / 1
Регистрация: 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
Модератор
Эксперт С++
12080 / 9759 / 5902
Регистрация: 18.12.2011
Сообщений: 26,202
15.06.2014, 15:13 10
Цитата Сообщение от Donville Посмотреть сообщение
cin>>mat1[i][j]) || (mat[i][j]<(-1000))
может cin>>mat[i][j]
Без единички....
0
0 / 0 / 1
Регистрация: 16.02.2014
Сообщений: 113
15.06.2014, 16:06  [ТС] 11
Нет, это моя оплошность. Я когда код на форум закидывал, то убирал лишнее, а это не заметил. Сам код там 1.5к строк, но проблема не в этой строчке.
0
0 / 0 / 1
Регистрация: 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
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
16.06.2014, 23:36
Помогаю со студенческими работами здесь

Найти целые числа, которые при возведении в x^2, x^3,x^4 и x^5 степень дают палиндромы
найти все целые числа на диапазоне от 1 до 100 которые при возведении в x^2, x^3,x^4 и x^5 степень...

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

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

Найдите целые числа, которые при возведении в 3, или 4, или 5 степень дают палиндромы
Найдите целые числа, которые при возведении в 3, или 4, или 5 степень дают палиндромы, например,...


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

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

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2022, CyberForum.ru