Deather Опубликовано 26 октября, 2006 Жалоба Поделиться Опубликовано 26 октября, 2006 При попытке скомпилировать код выскакивает ошибка: "Run-time Error 207. Invalid floating point operation". Дело в том, что пытаюсь поднести в степень число (-1), то есть, это выглядит таким образом: x:=exp(ln(-1)*(i+4)); ну и так далее по тексту. Именно в этом месте возникает ошибка. Может я минус не туда зачислил, подскажите, плз. Ссылка на комментарий Поделиться на другие сайты Поделиться
DJFlint Опубликовано 26 октября, 2006 Жалоба Поделиться Опубликовано 26 октября, 2006 При попытке скомпилировать код выскакивает ошибка: "Run-time Error 207. Invalid floating point operation". Дело в том, что пытаюсь поднести в степень число (-1), то есть, это выглядит таким образом: x:=exp(ln(-1)*(i+4)); ну и так далее по тексту. Именно в этом месте возникает ошибка. Может я минус не туда зачислил, подскажите, плз. 207 Invalid floating point operation (Неправильная операция над числами с плавающей точкой) Генерируется, если вы попытались получить квадратный корень или логарифм отрицательного числа. Ч.Т.Д. Ссылка на комментарий Поделиться на другие сайты Поделиться
Тролль Опубликовано 26 октября, 2006 Жалоба Поделиться Опубликовано 26 октября, 2006 (изменено) Deather: Естественно. Логарифмов отрицательных чисел не существует. Попробуй сам найти логарифм от -1 ;) . При изменении аргумента от 0 до бесконечности логарифм меняется от минус бесконечности до бесконечности, для отрицательных чисел логарифму пришлось бы выйти за пределы минус бесконечности. Строго говоря, логарифмы отрицательных чисел существуют, но уже не среди обычных чисел, а в пространстве так называемых комплексных чисел, работа с ними в Паскаль не встроена, хотя существуют специальные пакеты программ для работы с комплексными числами. Нецелые степени отрицательных чисел тоже являются комплексными числами, но если отрицательное число возводится в целую степень, то результат - обычное число. Проще всего его можно найти простым умножением отрицательного числа на себя заданное число раз в цикле, хотя существуют алгоритмы уменьшения числа умножений. Так что с возведением отрицательных чисел в целую степень можно справиться без логарифмов. А для возведения в целую степень -1, что часто требуется в разных формулах, все делается еще проще - четная степень от -1 равна 1, нечетная -1, то есть достаточно просто проверить, четная степень или нечетная (для этого, кстати, в Паскале есть специальная функция Odd), и в зависимости от этого выбрать в качестве результата 1 или -1. P.S. А если ты вычисляешь сумму знакопеременного ряда, то и этого не надо. Члены таких рядов удобнее вычислять не по общей формуле для члена ряда, а получая каждый член ряда домножением предыдущего на какое-то выражение. Для знакопеременного ряда оно будет отрицательным, этим будет учитываться смена знака для каждого следующего члена ряда, что при вычислении членов ряда "в лоб", по общей формуле для членов ряда, делалось возведением -1 в степень, равную номеру члена ряда. Всякие такие приемы, их очень много, называются вычислительной математикой. Изменено 26 октября, 2006 пользователем Тролль Ссылка на комментарий Поделиться на другие сайты Поделиться
Deather Опубликовано 27 октября, 2006 Автор Жалоба Поделиться Опубликовано 27 октября, 2006 Спасибо за познание, давно за "вышкой" не сидел, но все же. Я разместил только часть выражения, для которого необходимо набрать нужный код. Я также проверял выданное задание, действительно (-1) в степени (i+4). Мне оператор odd не подходит, так как он будет выбирать только позитивные значение. Может поможете написать то, что надо? Ссылка на комментарий Поделиться на другие сайты Поделиться
Deather Опубликовано 27 октября, 2006 Автор Жалоба Поделиться Опубликовано 27 октября, 2006 Малость не точно, odd - будет функцией выбора нечетного числа. С математической точки зрения, возведение отрицательного числа в целочисленную степень возможно. Соответсвенно, необходим правильный код для преобразования математической функции в машинно-понятный. Ссылка на комментарий Поделиться на другие сайты Поделиться
Тролль Опубликовано 27 октября, 2006 Жалоба Поделиться Опубликовано 27 октября, 2006 Deather: Я только написал, что odd может быть использована для различения четных и нечетных чисел. Для нечетных чисел odd выдает булевское значение true, для четных - false, в соответствии с названием (для тех, кто не знает английского: по-английски odd - нечетный). Преобразовывает запись математической функции в машинный код компилятор Паскаля, в нем мы можем быть уверены, наша задача - правильно записать математическую функцию через обозначения, имеющиеся в Паскале. Итак, обозначим (-1) в степени (i+4) как k. Тогда k вычисляется оператором if odd(i+4) then k:=-1 else k:=1 или, эквивалентно, но немного проще if odd(i) then k:=-1 else k:=1 Все это работает для любых i, и положительных, и отрицательных, и нуля. Можно сделать это и в виде одного выражения, а не оператора, тогда это выражение можно непосредственно включать в формулы: (1 - 2*abs(i mod 2)) Это выражение выдает 1 для четных значений i и -1 для нечетных, то есть то, что и требовалось. Ссылка на комментарий Поделиться на другие сайты Поделиться
Delphi Опубликовано 14 ноября, 2006 Жалоба Поделиться Опубликовано 14 ноября, 2006 Можно в принципе просто проверить степень в которую возводиться число четная или нет и в зависимости от этого делать число отрицательным или положительным мне кажеться это один из самых простых способов Ссылка на комментарий Поделиться на другие сайты Поделиться
nmn Опубликовано 17 декабря, 2006 Жалоба Поделиться Опубликовано 17 декабря, 2006 а как возвести -1 в отрицательную степень? Например -1^(1.123)? а как возвести -1 в отрицательную степень? Например -1^(1.123)? дело не в отрицательной степени а в -1 например -1^(1.121) Ссылка на комментарий Поделиться на другие сайты Поделиться
Тролль Опубликовано 17 декабря, 2006 Жалоба Поделиться Опубликовано 17 декабря, 2006 (изменено) nmn: например -1^(1.121)Твой пример считается очень легко, но результат выражается только комплексным числом: exp(1,121*ln(-1))=exp(1,121*3,1416i)=exp(3,522i)=cos(3,522)+i*sin(3,522)=-0,929-0,371i. Система вещественных чисел, как говорят, не замкнутая, результаты некоторых операций в ней не могут быть записаны вещественными числами.Тогда применяются числа более высокой ступени, называемые комплексными, у них своя форма записи, с символом i. Они стоят в иерархии чисел (натуральные, целые, вещественные, комплексные, кватернионы...) выше, чем обычные числа. Большинство вычислений в электро- и радиотехнике связано с применением комплексных чисел. P.S. Кстати, получился еще один способ вычисления (-1)ª для суммирования членов ряда. (-1)ª=exp(a*πi)=cos(πa)+i*sin(πa) Значит, (-1)ª имеет вещественные значения только когда часть i*sin(πa) равна 0, то есть при a=0,±1,±2,±3... , и равен тогда cos(πa). То есть для целых a можно вместо (-1)ª использовать cos(πa). Впрочем, это было ясно прямо из графика косинуса, хотя мне этот вариант пришел в голову, только когда я посмотрел еще раз на вычисления в примере. Но все же вариант вычисления (-1)ª для целых a функцией odd мне больше нравится. Изменено 17 декабря, 2006 пользователем Тролль Ссылка на комментарий Поделиться на другие сайты Поделиться
Юлия Опубликовано 17 февраля, 2009 Жалоба Поделиться Опубликовано 17 февраля, 2009 У меня возникает ошибка 207 в строке w:=Exp(k*t*ln(x)); Что здесь может быть не так? На всякий случай вот полностью Program primer; var k,y,x,w,t,q,z:real; Begin Write ('введите k='); If k<0 then z:=10 else If k<=10 then z:=Abs(sin(k)) else write ('неверно введено число'); t:=z/(1+Exp(k)); x:=(3*z+arctan(t*z))/(t+1); q:=(ln(sin(x)*sin(x)+Exp(1/2*ln(1+sin(x)*sin(x)*sin(x)))))/(ln(10)); w:=Exp(k*t*ln(x)); y:=w+q; Write ('y=',y); end. Ссылка на комментарий Поделиться на другие сайты Поделиться
Shurr Опубликовано 17 февраля, 2009 Жалоба Поделиться Опубликовано 17 февраля, 2009 Юлия: При k = 0 значение x тоже равно 0; ln(0) в свою очередь равен минус бесконечности. Паскаль, соответственно, вываливает ошибку при попытке вычисления данного логарифма. Ссылка на комментарий Поделиться на другие сайты Поделиться
Рекомендуемые сообщения
Для публикации сообщений создайте учётную запись или авторизуйтесь
Вы должны быть пользователем, чтобы оставить комментарий
Создать учетную запись
Зарегистрируйте новую учётную запись в нашем сообществе. Это очень просто!
Регистрация нового пользователяВойти
Уже есть аккаунт? Войти в систему.
Войти