Паскаль Ребят, делал домашнее задание с формулировкой "напишите процедуру подсчёта суммы...

0 голосов

Паскаль
Ребят, делал домашнее задание с формулировкой "напишите процедуру подсчёта суммы вещественных чисел a, b, c, d".
Я написал, но выводится какое-то огромное число. Искал решения в сети и там при выведении суммы есть строчка:

writeln('Сумма чисел равна ',rez:0:2);

Что означает это 0:2 ?


спросил от Начинающий (961 баллов) в категории Информатика
оставил комментарий от Архангел (114k баллов)

А это с плавающей точкой! То есть выводит в виде 1,1*10^1

оставил комментарий от Архангел (114k баллов)

Лучше взять другой формат чисел. Например, double. Он, наверное, Вас больше устроит)

оставил комментарий от Архангел (114k баллов)

Точнее лучше будет понятен для школьников)

оставил комментарий от Начинающий (961 баллов)

О, да, действительно, тогда все сходится) Выходит, что он тогда оставляет бесконечное кол-во знаков после запятой

оставил комментарий от Начинающий (961 баллов)

Это тоже вещественный тип?

оставил комментарий от Архангел (114k баллов)

Да. Но не с плавающей точкой и мантиссой. Поэтому тип double предпочтительнее. Но он "кушает" память. Но для Вас это несущественно)

оставил комментарий от Начинающий (961 баллов)

Спасибо большое с:

оставил комментарий от Архангел (114k баллов)

double - двойная точность

оставил комментарий от Архангел (114k баллов)

Пожалуйста

1 Ответ
0 голосов
ответил от Архангел (142k баллов)
 
Лучший ответ
В зависимости от версии компилятора языка Паскаль, вещественные числа по умолчанию выводятся в различном виде. Например, Турбо (Borland) Паскаль выводит их в "научном" представлении, т.е. в виде мантиссы, содержащей один разряд до запятой и десятичного порядка. PascalABC.Net, если может, выводит такие числа в виде привычной десятичной дроби.
В приведенном ниже примере значение 4.03099999999977E+0001 читается следующим образом: 4.030999...977\cdot10^1\approx40,31.
Для того, чтобы получать вывод в "привычном" виде, можно использовать форматирование. Для этого, в операторе вывода после значения переменной указывается конструкция вида m:n, где m- общее количество позиций, отводимое под запись числа (если 0 - то количество позиций определяется автоматически так, чтобы число поместилось), а n- количество позиций, отводимое под дробную часть.
Такая запись может применяться как для общего описателя типа вещественных чисел real, так и для конкретного (например, double - чисел "двойной точности", т.е. восьмибайтных). В примере хорошо видно, как использование двойной точности отражается на выводе результата в "научном" формате .

Пример на Турбо Паскаль
{$G+,N+}
uses Crt;

procedure Sum1(a,b,c,d:real;var r:real);
begin
  r:=a+b+c+d
end;

procedure Sum2(a,b,c,d:double;var r:double);
begin
  r:=a+b+c+d
end;

var
  e,f,g,h,res1:real;
  p,q,r,s,res2:double;
begin
  ClrScr;
  Write('e f g h= '); Read(e,f,g,h);
  Sum1(e,f,g,h,res1);
  Writeln('res1= ',res1,' = ',res1:0:2);
  Write('p q r s= '); Read(p,q,r,s);
  Sum2(p,q,r,s,res2);
  Writeln('res2= ',res2,' = ',res2:0:2);
  ReadKey
end.

Тестовое решение:
e f g h= 12.74 24.17 -5.6 9
res1=  4.03099999999977E+0001 = 40.31
p q r s= 12.74 24.17 -5.6 9
res2=  4.03100000000000E+0001 = 40.31



...