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

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

Вернуться   Форум программистов > IT форум > Помощь студентам
Регистрация

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 23.09.2017, 15:57   #1
Max$$
Пользователь
 
Регистрация: 23.09.2017
Сообщений: 17
По умолчанию Паскаль.Почему условие не срабатывает?

Добрый день! Нужна ваша помощь. По л/р на Pascal написал прогу.
Код:
 x: real;
  y: real;
begin
  x := -10;
  while x <= 2 do
  begin
    if (x>=-8) and (x<0) then y:=cos(x);
    if x<-8 then y:=cos(x)/cos(x) + (power (x,0.1*x)); 
    if x>=0 then y:=(power(x,1/3))/sin(x) + x*x*x;
    if (x>-10) and (x<>-8.8) and (x<-7.9) then writeln ('x=',x,'  функция не определена') else writeln('x=',x,'  y=',y);
    x := x + 0.3;
  end;
end.
Вопрос такой: почему условие (x<>-8.8) не срабатывает? Когда х=-8.8 все равно выводится ФУНКЦИЯ НЕ ОПРЕДЕЛЕНА.
Мне самому не нравится, как выглядит эта строка, но я не нашел подходящее исключение, чтобы вместо вывода NaN на экран выводить текст. А он выводится в результате вычисления (power (x,0.1*x)) при отрицательном дробном Х.



________
Код нужно оформлять по правилам:
тегом [CODE]..[/СODE]
(это кнопочка на панели форматирования с решёточкой #)
Не забывайте об этом!

Модератор.

Последний раз редактировалось Serge_Bliznykov; 23.09.2017 в 21:16.
Max$$ вне форума Ответить с цитированием
Старый 23.09.2017, 21:21   #2
Serge_Bliznykov
Старожил
 
Регистрация: 09.01.2008
Сообщений: 26,229
По умолчанию

вещественные числа НЕЛЬЗЯ сравнивать на совпадение.
(т.е. нельзя для них использовать операции =, <=, >= )
Это особенности машинного представления вещественных (дробных) чисел.

почему так - смотрите, например, в темах на форуме:
http://www.programmersforum.ru/showp...05&postcount=9
http://www.programmersforum.ru/showthread.php?t=307730
http://programmersforum.ru/showthread.php?p=1281382

вот, попробуйте заменить строчку на такую:
Код:
if (x>-10) and (abs(x+8.8)>0.0001) and (x<-7.9) 
   then writeln ('x=',x,'  функция не определена') else writeln('x=',x,'  y=',y);
только мне не понятно - зачем сначала вычислять, а потом оперделять, что функция не определена?
может быть, стоит делать наоборот - проверять область допустимых значений и только если функция определена, тогда вычислять её?

Последний раз редактировалось Serge_Bliznykov; 23.09.2017 в 21:26.
Serge_Bliznykov вне форума Ответить с цитированием
Старый 24.09.2017, 15:55   #3
Max$$
Пользователь
 
Регистрация: 23.09.2017
Сообщений: 17
По умолчанию

Спасибо. Условие сработало, но теперь при значении переменной -8,8 программа выводит ответ NaN, хотя калькулятор говорит, что значение есть (0,147521...). Не понимаю, в чём дело.

Значение -8,8 рассчитывается вот этой функцией:
if x<-8 then y:=cos(x)/cos(x) + (power (x,x/10));

Калькулятор её считает нормально, паскаль выводит NaN. Кто прав?
Max$$ вне форума Ответить с цитированием
Старый 24.09.2017, 16:07   #4
Aleksandr H.
2 the Nation Glory
Старожил
 
Аватар для Aleksandr H.
 
Регистрация: 27.05.2014
Сообщений: 3,289
По умолчанию

offtop
Код:
cos(x)/cos(x)
Кто умер, но не забыт, тот бессмертен.
Лао-Цзы.
Aleksandr H. вне форума Ответить с цитированием
Старый 24.09.2017, 16:24   #5
Max$$
Пользователь
 
Регистрация: 23.09.2017
Сообщений: 17
По умолчанию

согласен ) . Была формула такая дана.

if x<-8 then y:= 1 + (power (x,0.1*x));

Паскаль выдает:

x=-8.8 y=NaN
Max$$ вне форума Ответить с цитированием
Старый 24.09.2017, 16:44   #6
Max$$
Пользователь
 
Регистрация: 23.09.2017
Сообщений: 17
По умолчанию

хотя -8.8^-0.88 считается на калькуляторе вполне: 0,14752147583696697713276877352338
Max$$ вне форума Ответить с цитированием
Старый 24.09.2017, 17:53   #7
Аватар
Старожил
 
Аватар для Аватар
 
Регистрация: 17.11.2010
Сообщений: 18,922
По умолчанию

Возведение в действительную степень не определено для отрицательных чисел. А power в данном случае считает его действительным и вычисляет как Exp(-0.88 * Ln(-8.8)). Чему равен логарифм от -8.8? То-то и оно. А если показатель степени считать рациональным, то нет проблем - корень 100 степени из (-8.8)^88 ну и обратить - все ok, что и посчитал калькулятор. Умней чем паскаль на компьютере )) По идее калькулятор должен сдохнуть, если предложить посчитать -8.8^-0.87, разве что с комплексными умеет работать
Если бы архитекторы строили здания так, как программисты пишут программы, то первый залетевший дятел разрушил бы цивилизацию

Последний раз редактировалось Аватар; 24.09.2017 в 17:57.
Аватар вне форума Ответить с цитированием
Старый 24.09.2017, 22:38   #8
Serge_Bliznykov
Старожил
 
Регистрация: 09.01.2008
Сообщений: 26,229
По умолчанию

Цитата:
Сообщение от Аватар Посмотреть сообщение
По идее калькулятор должен сдохнуть, если предложить посчитать -8.8^-0.87
угу. но мелкософт так не думает.
windows 7. стандартный виндовый калькулятор спокойно считает -8.8^-0.87
причём, он выдаёт одинаковый ответ и для -8.8^-0.87 и для 8.8^-0.87
Serge_Bliznykov вне форума Ответить с цитированием
Старый 24.09.2017, 23:52   #9
Вадим Мошев

Старожил
 
Аватар для Вадим Мошев
 
Регистрация: 12.11.2010
Сообщений: 8,568
По умолчанию

Цитата:
Сообщение от Аватар Посмотреть сообщение
По идее калькулятор должен сдохнуть, если предложить посчитать -8.8^-0.87, разве что с комплексными умеет работать
Если не ошибаюсь, операция возведения отрицательного числа в дробную степень не определена в принципе.
А логарифм от отрицательных чисел вполне вычисляем - но только на множестве комплексных чисел.
Если что, ОБЩАЯ ФОРМУЛА вычисления логарифма записывается так: Ln(z) = ln(|z|) + i*arg(z). У положительных действительных чисел аргумент равен нулю, поэтому мнимой части у результата нет. По такой формуле можно вычистить логарифм любого, отличного нуля, комплексного числа. Действительные числа также являются комплексными.

Но ни в одном из известных мне ЯП логарифм отрицательного числа нигде не давал комплексного результата - в лучшем случае - это NaN, в худшем - ошибка Invalid floating point operation.
Встроенный ЯП в MathCAD - исключение - он вычисляет логарифм на множестве комплексных чисел.

Последний раз редактировалось Вадим Мошев; 24.09.2017 в 23:58.
Вадим Мошев вне форума Ответить с цитированием
Старый 25.09.2017, 15:42   #10
Max$$
Пользователь
 
Регистрация: 23.09.2017
Сообщений: 17
По умолчанию

Т.е. нет программного решения? Если есть, то как в программе описать, я не понял, извините...
Max$$ вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Паскаль! Как сделать условие: чем дальше планеты от солнца, тем медленнее они крутятся? Почему Луна немного косит? Jenee Помощь студентам 3 16.04.2017 09:09
Что-то не срабатывает в коде: Почему не происходит пропорциональное масштабирование DIV'а ne4Euusmvyo HTML и CSS 2 15.02.2017 20:37
Почему не срабатывает preg_replace? Karyuudo Помощь студентам 3 20.09.2015 01:16
Не срабатывает условие сравнения чисел. Solvinder Помощь студентам 1 28.04.2011 23:01
Условие не срабатывает segail Microsoft Office Excel 5 15.08.2010 15:10