Вопрос № 60990: Здравствуйте, уважаемые эксперты!
Помогите, пожалуйста, чайнику! Выполнил я простенькое задание по программированию (в приложении), однако, порой при вводе данных выдается Error 207: Invalid floating point operation, например при вводе таких данн...
Вопрос № 60.990
Здравствуйте, уважаемые эксперты!
Помогите, пожалуйста, чайнику! Выполнил я простенькое задание по программированию (в приложении), однако, порой при вводе данных выдается Error 207: Invalid floating point operation, например при вводе таких данных: 5,4,3,6. Насколько я понимаю, ошибка выдается из-за того, что exp(ln(...)/3) работает только с положительными числами, в связи с чем возникает вопрос: как можно обойти это ограничение. В принципе, формально я задание выполнил, но хотелось бы для себя знать - как это все должно работать.
Надеюсь, не будете ругать за ламерский вопрос... Большое спасибо!
Приложение:
Отправлен: 02.11.2006, 05:52
Вопрос задал: Mangoost (статус: Посетитель)
Всего ответов: 3 Мини-форум вопроса >>> (сообщений: 0)
Отвечает: Andronik
Здравствуйте, Mangoost!
Invalid floating point operation - это ошибка при обработке вещественных чисел. В данном случае (при вводе) просто наблюдается ошибка, когда пользователь вводит вещественное число с разделителем-точкой вместо запятой. И все.
Ну а если существует боязнь с экспонентой, то почему бы не взять ее модуль?
--------- Запрограммировать можно все... кроме собственного поведения
Ответ отправил: Andronik (статус: 1-ый класс)
Ответ отправлен: 02.11.2006, 05:58
Отвечает: sir henry
Здравствуйте, Mangoost!
Давайте сначала рассмотрим функции SIN() и COS().
В эти функции аргументом вводится угол в радианах, причем в документации к FreePascal специально предупреждается, что аргумент должен быть не более чем 263, иначе результатом функции будет полная фигня. Думаю, что в Turbo Pascal стоит то же самое ограничение. Отсюда вывод - переменные, которые Вы передаете аргументами в функции SIN() и COS() должны быть типа BYTE, либо, в крайнем случае, введите тип-диапазон:
Type
t: 0..263;
Тем самым Вы избежите на выходе программы результата который, как любил говорить Ленин: "По форме правильно, а по сути - издевательство!". :)
Далее. Ваше большое и неудобное для понимания вычислисляемое выражение необходимо разбить на два более мелких:
Var
v1, v2: single;
Begin
...
v1:=m*(sin(t)/cos(t))*t;
v2:=abs(c*sin(t));
...
End.
Согласитесь, так они выглядят куда понятнее. :)
И поскольку применяемые в них SIN/COS могут дать, при определенных аргументах, отрицательный результат, необходимо перед выполнением дальнейших действий проверять эти выражения на неотрицательность:
Begin
...
If(v1+v2)>0 Then
Begin
f:=exp(ln(v1+v2)/3);
z:=m * cos(b*t*sin(t)) + c;
...
End
Else
WriteLn('Ваши данные - это провокации меньшевиков и эсеров! Не буду с ними работать! Хочу обратно в Разлив! :)');
End.
Ответ отправил: sir henry (статус: Академик) Россия, Красноярск ---- Ответ отправлен: 02.11.2006, 06:56
Отвечает: Wass
Здравствуйте, Mangoost!
exp(ln(...)/3) еще должен не быть равным нулю.
--------- "Шило в ж**** не помеха.мы студенты ВОЕНМЕХа !!!"
Ответ отправил: Wass (статус: 1-ый класс)
Ответ отправлен: 02.11.2006, 11:29