Перейти к содержанию
СофтФорум - всё о компьютерах и не только

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


Рекомендуемые сообщения

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

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

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

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

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

Ссылка на комментарий
Поделиться на другие сайты

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

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

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

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

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

207 Invalid floating point operation (Неправильная операция над числами с плавающей точкой)

Генерируется, если вы попытались получить квадратный корень или логарифм отрицательного числа.

Ч.Т.Д.

Ссылка на комментарий
Поделиться на другие сайты

Deather:

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

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

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

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

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

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

Изменено пользователем Тролль
Ссылка на комментарий
Поделиться на другие сайты

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

Ссылка на комментарий
Поделиться на другие сайты

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

Ссылка на комментарий
Поделиться на другие сайты

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 для нечетных, то есть то, что и требовалось.

Ссылка на комментарий
Поделиться на другие сайты

  • 3 недели спустя...

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

Ссылка на комментарий
Поделиться на другие сайты

  • 1 месяц спустя...

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

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

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

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

Ссылка на комментарий
Поделиться на другие сайты

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 мне больше нравится.

Изменено пользователем Тролль
Ссылка на комментарий
Поделиться на другие сайты

  • 2 года спустя...

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

Ссылка на комментарий
Поделиться на другие сайты

Юлия:

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

Ссылка на комментарий
Поделиться на другие сайты

Для публикации сообщений создайте учётную запись или авторизуйтесь

Вы должны быть пользователем, чтобы оставить комментарий

Создать учетную запись

Зарегистрируйте новую учётную запись в нашем сообществе. Это очень просто!

Регистрация нового пользователя

Войти

Уже есть аккаунт? Войти в систему.

Войти
  • Последние посетители   0 пользователей онлайн

    • Ни одного зарегистрированного пользователя не просматривает данную страницу
×
×
  • Создать...