Jump to content

Возведение в степень: возникает ошибка


Recommended Posts

При попытке скомпилировать код выскакивает ошибка: "Run-time Error 207. Invalid floating point operation". Дело в том, что пытаюсь поднести в степень число (-1), то есть, это выглядит таким образом:

x:=exp(ln(-1)*(i+4));

ну и так далее по тексту.

Именно в этом месте возникает ошибка.

Может я минус не туда зачислил, подскажите, плз.

Link to comment
Share on other sites

При попытке скомпилировать код выскакивает ошибка: "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

Deather:

Естественно. Логарифмов отрицательных чисел не существует. Попробуй сам найти логарифм от -1 ;) .

При изменении аргумента от 0 до бесконечности логарифм меняется от минус бесконечности до бесконечности, для отрицательных чисел логарифму пришлось бы выйти за пределы минус бесконечности.

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

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

А для возведения в целую степень -1, что часто требуется в разных формулах, все делается еще проще - четная степень от -1 равна 1, нечетная -1, то есть достаточно просто проверить, четная степень или нечетная (для этого, кстати, в Паскале есть специальная функция Odd), и в зависимости от этого выбрать в качестве результата 1 или -1.

P.S. А если ты вычисляешь сумму знакопеременного ряда, то и этого не надо. Члены таких рядов удобнее вычислять не по общей формуле для члена ряда, а получая каждый член ряда домножением предыдущего на какое-то выражение. Для знакопеременного ряда оно будет отрицательным, этим будет учитываться смена знака для каждого следующего члена ряда, что при вычислении членов ряда "в лоб", по общей формуле для членов ряда, делалось возведением -1 в степень, равную номеру члена ряда. Всякие такие приемы, их очень много, называются вычислительной математикой.

Edited by Тролль
Link to comment
Share on other sites

Спасибо за познание, давно за "вышкой" не сидел, но все же. Я разместил только часть выражения, для которого необходимо набрать нужный код. Я также проверял выданное задание, действительно (-1) в степени (i+4). Мне оператор odd не подходит, так как он будет выбирать только позитивные значение. Может поможете написать то, что надо?

Link to comment
Share on other sites

Малость не точно, odd - будет функцией выбора нечетного числа. С математической точки зрения, возведение отрицательного числа в целочисленную степень возможно. Соответсвенно, необходим правильный код для преобразования математической функции в машинно-понятный.

Link to comment
Share on other sites

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

  • 3 weeks later...

Можно в принципе просто проверить степень в которую возводиться число четная или нет и в зависимости от этого делать число отрицательным или положительным мне кажеться это один из самых простых способов

Link to comment
Share on other sites

  • 1 month later...

а как возвести -1 в отрицательную степень? Например -1^(1.123)?

а как возвести -1 в отрицательную степень? Например -1^(1.123)?

дело не в отрицательной степени а в -1

например -1^(1.121)

Link to comment
Share on other sites

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 by Тролль
Link to comment
Share on other sites

  • 2 years later...

У меня возникает ошибка 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

Юлия:

При k = 0 значение x тоже равно 0; ln(0) в свою очередь равен минус бесконечности. Паскаль, соответственно, вываливает ошибку при попытке вычисления данного логарифма.

Link to comment
Share on other sites

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 account

Sign in

Already have an account? Sign in here.

Sign In Now
 Share

  • Recently Browsing   0 members

    • No registered users viewing this page.
×
×
  • Create New...