Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Delphi программирование > Паскаль, Turbo Pascal, PascalABC.NET
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 03.10.2012, 00:22   #1
Bulletinn
 
Регистрация: 03.10.2012
Сообщений: 5
Вопрос Invalid floating point operation

Помогите пожалуйста, на завтра лабу здавать, а прога работает неполноценно- если задавать переменным небольших значений( 1,2,3) всё норм вычисляется, но при 8,9,10,.... выбрасывает ошибку 207. Проблемы взникают при вычислении значения b.

Код:
program lab1;
var a,b,x,y,z: real;
begin
 writeln('Please enter x:');
 readln(x);
 writeln('Please enter y:');
 readln(y);
 writeln('Please enter z:');
 readln(z);
  if (exp(abs(x-y))=x/2) or (x=y) then
    begin
     writeln('There is no a');
     b:=exp(ln(2)*exp(ln(y)*x))+ln(exp(ln(3)*exp(ln(x)*y)));
     writeln('b=',b:8:5);
    end
  else
    begin
     a:=abs(x-y)*(1+sqr(sin(z))/(x-y))/(exp(abs(x-y))-x/2);
     b:=exp(ln(2)*exp(ln(y)*x))+ln(exp(ln(3)*exp(ln(x)*y)));
     writeln('a=',a:8:5,'; b=',b:8:5,';');
    end;
 readln;
end.

Последний раз редактировалось Bulletinn; 03.10.2012 в 00:35.
Bulletinn вне форума Ответить с цитированием
Старый 03.10.2012, 06:29   #2
TinMan
Форумчанин
 
Аватар для TinMan
 
Регистрация: 05.09.2011
Сообщений: 869
По умолчанию

Цитата:
Сообщение от Bulletinn Посмотреть сообщение
Помогите пожалуйста,
А как тебе помочь, если ты не говоришь, что тебе нужно сделать? Мы тебе тут кто? дизассемблеры? Думаешь, оно так приятно - догадываться, что твоя прога ДОЛЖНА БЫЛА сделать? Когда ты приходишь к доктору, ты говоришь, что у тебя болит? или - пусть сам догадывается?..

Короче.. я НЕ ЗНАЮ, что ты ХОТЕЛ сказать этой строкой:
Код:
     b:=exp(ln(2)*exp(ln(y)*x))+ln(exp(ln(3)*exp(ln(x)*y)));
- но только считать экспоненту от экспоненты (!!) - тут любой компьютер загнется и запросит пощады (еще хорошо, если не взорвется.. ))
Предпочитаю на "ты".
TinMan вне форума Ответить с цитированием
Старый 03.10.2012, 13:26   #3
Bulletinn
 
Регистрация: 03.10.2012
Сообщений: 5
По умолчанию

Цитата:
Сообщение от TinMan Посмотреть сообщение
А как тебе помочь, если ты не говоришь, что тебе нужно сделать? Мы тебе тут кто? дизассемблеры? Думаешь, оно так приятно - догадываться, что твоя прога ДОЛЖНА БЫЛА сделать? Когда ты приходишь к доктору, ты говоришь, что у тебя болит? или - пусть сам догадывается?..

Короче.. я НЕ ЗНАЮ, что ты ХОТЕЛ сказать этой строкой:
Код:
     b:=exp(ln(2)*exp(ln(y)*x))+ln(exp(ln(3)*exp(ln(x)*y)));
- но только считать экспоненту от экспоненты (!!) - тут любой компьютер загнется и запросит пощады (еще хорошо, если не взорвется.. ))
Вычислить нужно b=2^(y^x )+ln3^(x^y ). Если выносить x^y за логорифм ничего не меняется, к тому же небольшие цифры оно считает.
Bulletinn вне форума Ответить с цитированием
Старый 03.10.2012, 15:41   #4
DiemonStar
Старожил
 
Регистрация: 08.02.2012
Сообщений: 2,173
По умолчанию

Смотрим на функцию pow() и стараемся больше не извращаться c логарифмами.

а теперь посчитаем: real может содержать значения порядка 2^64, т.е. X^Y не должно превышать 64...


upd.
Даже и того меньше: http://programmersforum.ru/showthread.php?t=130193
порядка 39-40
Правильно поставленная задача - три четверти решения.

Последний раз редактировалось DiemonStar; 03.10.2012 в 16:43.
DiemonStar вне форума Ответить с цитированием
Старый 04.10.2012, 03:35   #5
TinMan
Форумчанин
 
Аватар для TinMan
 
Регистрация: 05.09.2011
Сообщений: 869
По умолчанию

Цитата:
Сообщение от Bulletinn Посмотреть сообщение
Вычислить нужно b=2^(y^x )+ln3^(x^y ). Если выносить x^y за логорифм ничего не меняется, к тому же небольшие цифры оно считает.
Bulletinn, заметь - никто ни разу (кроме тебя самого) не намекнул даже, что у тебя код неправильный (хотя, как я вижу сейчас, после приведения условия, он, похоже, действительно неправильный). Но дело в том, что само условие задачи такое, которое дает ОЧЕНЬ БОЛЬШИЕ числа, которые невозможно обработать на компьютере в стандартных типах. Твоя прога вылетает по ошибке, но это не твоя программная ошибка, а нормальное переполнение. Ты что-нибудь слышал про диапазоны чисел в компьютере? Ты понимаешь, что есть пределы, в которых он может считать? Вот тебе диапазон для действительных типов:
Код:
Длина  Название  Количество значащих цифр  Диапазон десятичного порядка 
6        Real             11 ... 12          -39 ...+38 
8        Double           15 ... 16          -324 ... +308
10       extended         19 ... 20          -4951 ... +4932
Ты использовал тип real, максимальное значение которого ~10^38. Если бы ты использовал тип extended, то мог бы считать до ~10^4932. Замечу, что это число НАМНОГО БОЛЬШЕ, чем число атомов ВО ВСЕЙ ВСЕЛЕННОЙ (по оценкам, 10^80) - заметь, не в Солнечной системе, и даже не в Галактике, а ВО ВСЕЙ ВСЕЛЕННОЙ. А теперь посмотрим, что ты на самом деле пытаешься считать..

при x~y~z~10 (знак ~ означает приблизительное равенство) мы получаем первое слагаемое в твоей исходной формуле,

2^(y^x ) = 2^(10^10) = 2^10000000000 ~ 10^3000000000.

Я затрудняюсь тебе объяснить, насколько громадное это число.. Представить это невозможно. Если бы каждый атом представлял бы целую вселенную, вложенную в нашу, а каждый атом той вселенной представлял бы тоже целую вселенную, как наша, и таких уровней было бы столько же, сколько атомов в нашей Вселенной, то суммарное количество атомов во всех этих воображаемых вселенных было бы НАМНОООООГО МЕНЬШЕ, чем то число, которое ты пытаешься скормить бедному компьютеру.. Чтобы только записать все его цифры, потребуется 3-терабайтный диск. Тебе еще продолжает казаться странным, что твой комп подавился?

Я не знаю, откуда у тебя эта задача. Но я сильно подозреваю, что тот, кто тебе ее дал, либо сам сделал ошибку, либо хотел показать тебе, что возможности компьютеров (да и вообще человеческие) все-таки ограничены, либо хотел просто посмеяться, глядя как ты мучаешься .

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

Последний раз редактировалось TinMan; 04.10.2012 в 03:54.
TinMan вне форума Ответить с цитированием
Старый 04.10.2012, 16:55   #6
Bulletinn
 
Регистрация: 03.10.2012
Сообщений: 5
По умолчанию

Цитата:
Сообщение от TinMan Посмотреть сообщение

Да, маленькие входные числа твоя программа сможет осилить. Но это еще ничего не значит. Экспонента - это слишком быстро растущая функция. С ней шутки плохи. Понял? ))
Спасибо), задача из методички по программированию. Уже не знал что с ней делать, ведь extended не помогал, задание условий тоже. Значит оставлю как есть....
Bulletinn вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
floating point invalid operation dimavit Общие вопросы Delphi 6 12.08.2012 18:52
Invalid floating point operation _SatanA_ Общие вопросы Delphi 11 01.02.2012 11:26
invalid floating point operation Mikhail91 Общие вопросы C/C++ 5 24.03.2010 00:05
invalid floating point operation mosq Общие вопросы Delphi 7 01.11.2009 13:28
Invalid floating point operation Skytis Помощь студентам 3 07.05.2008 12:16