Почему когда в паскале пишешь write(exp(ln(3))), то он отвечает 3, а если написать:
if exp(ln(3)) = 3 then
write('да')
else
write('нет')
то он отвечает "нет".
Так exp(ln(3)) = 3 или нет?!
Другие языки программирования и технологии
Вопрос по паскалю
Потому что компьютер не работает с числами. Он работает с моделями чисел - условными их кодами, представляющими числа не точно, а с некоторой конечной точностью. Логарифм трех - число с бесконечным числом знаков после запятой, компьютер его округляет где-то до десяти знаков после запятой. Потом он находит экспоненту от округленного числа, естественно, это не точно 3. Поэтому и введен отдельный тип целых чисел - они кодируются точно, их не округляют. Но целыми числами часто не обойдешься. И если тебе надо сравнивать вещественные числа, то это надо делать, например, так
if abs(exp(ln(3))-3)/3< 1e-8 then ...
Например, программа
begin writeln(3/5*5=3); readln end.
выдаст false, потому что в компьютере 3/5*5 не равно точно 3 ( 0,6 в двоичной системе имеет бесконечное число знаков после запятой ).
Этому учат программистов, но не учат в школах. Существует много и других подводных камней, например, даже квадратное уравнение в вычислительной математике полагается решать по другим формулам, чем школьные, поскольку школьные из-за возможного вычитания близких чисел могут приводить к большой погрешности.
Перед изучением собственно программирования следовало бы учить вычислительную математику, поэтому то, чему учат в школе, не годится для практического использования - возможны ошибки из-за незнания важных тонкостей.
if abs(exp(ln(3))-3)/3< 1e-8 then ...
Например, программа
begin writeln(3/5*5=3); readln end.
выдаст false, потому что в компьютере 3/5*5 не равно точно 3 ( 0,6 в двоичной системе имеет бесконечное число знаков после запятой ).
Этому учат программистов, но не учат в школах. Существует много и других подводных камней, например, даже квадратное уравнение в вычислительной математике полагается решать по другим формулам, чем школьные, поскольку школьные из-за возможного вычитания близких чисел могут приводить к большой погрешности.
Перед изучением собственно программирования следовало бы учить вычислительную математику, поэтому то, чему учат в школе, не годится для практического использования - возможны ошибки из-за незнания важных тонкостей.
Да, странно, видимо есть какая-то дробная часть очень маленькая... )
Попробуй вот так:)) )
var a,b:real;
begin
a:=exp(ln(3));
b:=3;
writeln(a:1:17);
writeln(b:1:17);
end.
Разница присутствует:
3.00000000000000064
3.00000000000000000
Попробуй вот так:)) )
var a,b:real;
begin
a:=exp(ln(3));
b:=3;
writeln(a:1:17);
writeln(b:1:17);
end.
Разница присутствует:
3.00000000000000064
3.00000000000000000
попробуй then и else заключить в операторные скобки.
Если результат вычисления - не целое число, то такое может случаться из-за маленькой разницы в "хвостах" чисел.
Пример: (2.999999999 = 3) = false.
Пример: (2.999999999 = 3) = false.
а что правда есть город шестипальцевск?
где он находится?
где он находится?
Похожие вопросы
- Вопрос по паскалю и его применению.
- Нубские вопросы по паскалю. *)
- Вопросы про паскаль
- возник вопрос по паскалю
- Несколько вопросов по Паскалю =)
- Вопрос по Паскалю
- Люди добрые извиняюсь за тупой и простой вопрос по паскалю но всё же помогите прогу дописать
- Вопрос по паскалю
- Вопрос по ПаскалюВводится дата (день, месяц, год) необходимо посчитать сколько дней прошло с начала года.
- Вопрос по ПАСКАЛЮ!!!!ХЕЛП МИ !!!