PascalABC.NET Вот кусочек программки: // x=3.1 (введено с клавиатуры) // y=0.8 (введено с клавиатуры) // p=2 (рассчитано программой выше) a:=Frac(x); // =0,1 b:=Frac(y)-0.5; // =0,3 kp:=sqrt(sqr(0.5-a)+b*b); // =0,5 if kp бо...

PascalABC.NET Вот кусочек программки: // x=3.1 (введено с клавиатуры) // y=0.8 (введено с клавиатуры) // p=2 (рассчитано программой выше) a:=Frac(x); // =0,1 b:=Frac(y)-0.5; // =0,3 kp:=sqrt(sqr(0.5-a)+b*b); // =0,5 if kp>=0.5 then p:=p+1; и вот тут компьютер почему-то считает, что kp<0,5 т.е. при выводе на экран, - выводится значение kp=0.5, но при сравнении с 0,5 оно оказывается меньше. Перепробовала все, что смогла придумать. Даже сравнивала kp с корнем из 0.25 (чем оно и является). Безрезультатно. Мне нужны конкретные ответы на вопросы: 1) Почему переменная, равная 0,5, меньше, чем 0,5?! 2) Как это можно исправить? Заранее спасибо. PS: вычисление корня заменить ничем нельзя (нахождение гипотенузы)
Гость
Ответ(ы) на вопрос:
Гость
Чтобы разъяснить происходящее, были сделаны следующие шаги. 1. Константы 3.1 и 0.8 переведены в машинное представление а затем назад в десятичное с максимальной для паскалевских данных вещественного типа real (он же double) точностью (вложения 1 и 2). 2. В системе компьютерной алгебры, позволяющей работать с произвольной точностью (выбрана точность в 30 значащих цифр) для полученных констант выполнены соответствующие заданному фрагменту программы вычисления (вложение 3) 3. Результат 0.499999999999999955591079014996 был переведен в машинное представление. Затем в машинное представление была переведена константа 0.5, которая, как видно во вложении 4, представляется в компьютере точно. Поэтому проверка на точное равенство с 0.5 дает не тот результат, который Вы ожидали. 4. Можно было также воспользоваться программой на паскале. begin   var x:=3.1;   var y:=0.8;   var p:=2;   var a:=Frac(x); // =0,1   var b:=Frac(y)-0.5; // =0,3   var kp:=sqrt(sqr(0.5-a)+b*b); // =0,5   if abs(kp-0   Writeln(kp-0.5) end. Результат: -5.55111512312578E-17 Это как раз то, что так портит Вам всю картину. По поводу Вашего условия if kp>=0.5 then p=p+1; Ошибка имеет порядок 0.6·10⁻¹⁶ и наверно ничего страшного не будет, если оператор (с запасом) подправить на if kp>=(0.5-1e-15) then p:=p+1;
Не нашли ответ?
Ответить на вопрос
Похожие вопросы