Deather Posted October 26, 2006 Report Share Posted October 26, 2006 При попытке скомпилировать код выскакивает ошибка: "Run-time Error 207. Invalid floating point operation". Дело в том, что пытаюсь поднести в степень число (-1), то есть, это выглядит таким образом: x:=exp(ln(-1)*(i+4)); ну и так далее по тексту. Именно в этом месте возникает ошибка. Может я минус не туда зачислил, подскажите, плз. Link to comment Share on other sites More sharing options...
DJFlint Posted October 26, 2006 Report Share Posted October 26, 2006 При попытке скомпилировать код выскакивает ошибка: "Run-time Error 207. Invalid floating point operation". Дело в том, что пытаюсь поднести в степень число (-1), то есть, это выглядит таким образом: x:=exp(ln(-1)*(i+4)); ну и так далее по тексту. Именно в этом месте возникает ошибка. Может я минус не туда зачислил, подскажите, плз. 207 Invalid floating point operation (Неправильная операция над числами с плавающей точкой) Генерируется, если вы попытались получить квадратный корень или логарифм отрицательного числа. Ч.Т.Д. Link to comment Share on other sites More sharing options...
Тролль Posted October 26, 2006 Report Share Posted October 26, 2006 (edited) Deather: Естественно. Логарифмов отрицательных чисел не существует. Попробуй сам найти логарифм от -1 ;) . При изменении аргумента от 0 до бесконечности логарифм меняется от минус бесконечности до бесконечности, для отрицательных чисел логарифму пришлось бы выйти за пределы минус бесконечности. Строго говоря, логарифмы отрицательных чисел существуют, но уже не среди обычных чисел, а в пространстве так называемых комплексных чисел, работа с ними в Паскаль не встроена, хотя существуют специальные пакеты программ для работы с комплексными числами. Нецелые степени отрицательных чисел тоже являются комплексными числами, но если отрицательное число возводится в целую степень, то результат - обычное число. Проще всего его можно найти простым умножением отрицательного числа на себя заданное число раз в цикле, хотя существуют алгоритмы уменьшения числа умножений. Так что с возведением отрицательных чисел в целую степень можно справиться без логарифмов. А для возведения в целую степень -1, что часто требуется в разных формулах, все делается еще проще - четная степень от -1 равна 1, нечетная -1, то есть достаточно просто проверить, четная степень или нечетная (для этого, кстати, в Паскале есть специальная функция Odd), и в зависимости от этого выбрать в качестве результата 1 или -1. P.S. А если ты вычисляешь сумму знакопеременного ряда, то и этого не надо. Члены таких рядов удобнее вычислять не по общей формуле для члена ряда, а получая каждый член ряда домножением предыдущего на какое-то выражение. Для знакопеременного ряда оно будет отрицательным, этим будет учитываться смена знака для каждого следующего члена ряда, что при вычислении членов ряда "в лоб", по общей формуле для членов ряда, делалось возведением -1 в степень, равную номеру члена ряда. Всякие такие приемы, их очень много, называются вычислительной математикой. Edited October 26, 2006 by Тролль Link to comment Share on other sites More sharing options...
Deather Posted October 27, 2006 Author Report Share Posted October 27, 2006 Спасибо за познание, давно за "вышкой" не сидел, но все же. Я разместил только часть выражения, для которого необходимо набрать нужный код. Я также проверял выданное задание, действительно (-1) в степени (i+4). Мне оператор odd не подходит, так как он будет выбирать только позитивные значение. Может поможете написать то, что надо? Link to comment Share on other sites More sharing options...
Deather Posted October 27, 2006 Author Report Share Posted October 27, 2006 Малость не точно, odd - будет функцией выбора нечетного числа. С математической точки зрения, возведение отрицательного числа в целочисленную степень возможно. Соответсвенно, необходим правильный код для преобразования математической функции в машинно-понятный. Link to comment Share on other sites More sharing options...
Тролль Posted October 27, 2006 Report Share Posted October 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 для нечетных, то есть то, что и требовалось. Link to comment Share on other sites More sharing options...
Delphi Posted November 14, 2006 Report Share Posted November 14, 2006 Можно в принципе просто проверить степень в которую возводиться число четная или нет и в зависимости от этого делать число отрицательным или положительным мне кажеться это один из самых простых способов Link to comment Share on other sites More sharing options...
nmn Posted December 17, 2006 Report Share Posted December 17, 2006 а как возвести -1 в отрицательную степень? Например -1^(1.123)? а как возвести -1 в отрицательную степень? Например -1^(1.123)? дело не в отрицательной степени а в -1 например -1^(1.121) Link to comment Share on other sites More sharing options...
Тролль Posted December 17, 2006 Report Share Posted December 17, 2006 (edited) 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 мне больше нравится. Edited December 17, 2006 by Тролль Link to comment Share on other sites More sharing options...
Юлия Posted February 17, 2009 Report Share Posted February 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. Link to comment Share on other sites More sharing options...
Shurr Posted February 17, 2009 Report Share Posted February 17, 2009 Юлия: При k = 0 значение x тоже равно 0; ln(0) в свою очередь равен минус бесконечности. Паскаль, соответственно, вываливает ошибку при попытке вычисления данного логарифма. Link to comment Share on other sites More sharing options...
Recommended Posts
Create an account or sign in to comment
You need to be a member in order to leave a comment
Create an account
Sign up for a new account in our community. It's easy!
Register a new accountSign in
Already have an account? Sign in here.
Sign In Now