![]() |
Прежде чем задать вопрос, смотрите FAQ.
Рекомендуем загрузить DRKB.
![]() |
P-Tigr |
![]() ![]()
Сообщение
#1
|
Группа: Пользователи Сообщений: 9 Пол: Мужской Репутация: ![]() ![]() ![]() |
Столкнулся с одной проблемой, 2 дня уже бьюсь... что делать - не знаю...
Если коротко, то дело вот в чем. Я написал процедуру для подсчета определителя матрицы любого порядка (методом Гаусса). И там над матрицей выполняются различные преобразования (складывания строк и т.д.). Причем - внимание - по условию задания матрица должна быть обязательно динамической! Процедура работает нормально, определитель находит, НО в то же время изменяет исходную матрицу, а этого нельзя допустить!! Происходит это, как мне кажется, из-за того, что такие матрицы - ссылки на память, поэтому передать ее в процедуру строго по значению нельзя... Замучился я с этими динамическими структурами... ![]() Please, умные люди, help me! |
![]() ![]() |
P-Tigr |
![]()
Сообщение
#2
|
Группа: Пользователи Сообщений: 9 Пол: Мужской Репутация: ![]() ![]() ![]() |
ОК, ошибка "Floating divizion by zero" устранена... Мне надо ставить 2 за внимательность...
![]() Но осталась 2-я ошибка - "Invalid floating point operation". Итак, код такой: function Opred_Gauss(A:TDMAtr):real; При данных 1 1 1 возникает вышеописанная ошибка в той же строке mnoj:=a[j,i]/a[i,i]; Немного помучившись и покапавшись в справочниках, нашел, что это бывает связано с проблемами сопроцессора, и устраняется путем добавления строчки asm FINIT end; тогда вместо ошибки возвращается константа NAN. Окончательный вариант кода выглядит так: function Opred_Gauss(A:TDMAtr):real;Вот теперь (!) все работает без ошибок... УРА! Но интересно, есть ли другие пути решения проблемы, без асмы? И отчего она все-таки, эта ошибка? |
volvo |
![]()
Сообщение
#3
|
Гость ![]() |
Цитата(P-Tigr @ 16.03.05 17:40) ОК, ошибка "Floating divizion by zero" устранена... Мне надо ставить 2 за внимательность... Вам надо еще раз поставить 2 за "внимательность"... Неужели нельзя было проверить все ли A заменены на AC? Ведь NaN появляется при той же самой ошибке - "деление на 0"... Почему? Проверяется на 0 значение AC, а операция производится с A !!!![]() Но осталась 2-я ошибка - "Invalid floating point operation". Итак, код такой: function Opred_Gauss(A:TDMAtr):real; В общем, окончательный вариант функции без всякого Асма: Function Opred_Gauss(A:TDMatr):double; |
![]() ![]() |
![]() |
Текстовая версия | 27.07.2025 11:14 |