0 / 0 / 0
Регистрация: 13.04.2011
Сообщений: 13
1

Числа в формате с плавающей запятой (Pascal)

10.05.2011, 17:18. Показов 2872. Ответов 0
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Постановка задачи: Постановка задачи: Число в форме с плавающей запятой определяется с помощью двух параметров: p – смещенный порядок в битах; и m – длинны мантиссы в битах. Для заданной битовой последовательности R необходимо получить представление числа в 2-ичной системе счисления в виде:

|Знак m|P r-1|...|P 1 |P 0 |*|m -1 |m -2 |...|m –n |

Примечание: Для упрощения операций над порядками их приводят к целым положительным числам, смещенный порядок. Для этого к истинному порядку добавляется целое положительное число – смещение. Например, в системе со смещением 128 порядок -3 представляется как 125 (-3 + 128). Если для записи числа с плавающей запятой используется база 2(q = 2), то применяют еще один способ повышения точности представления мантиссы, называемый приемом скрытой единицы. Суть его в том, что в нормализованной мантиссе старшая цифра всегда равна единице (для представления нуля используется специальная кодовая комбинация), следовательно, эта цифра может не записываться, а подразумеваться. Запись мантиссы начинают с ее второй цифры, и это позволяет задействовать дополнительный значащий бит для более точного представления числа. В алгоритме предусмотрен анализ ситуации переполнения порядка и отношений: длина битовой последовательности больше или меньше длинны мантиссы.


Например:
Вводим: 75,285
Результат: + 0,75285 * 10^3 (в 8-ную систему)


Из кусочков собрала вот такую программу, хотелось бы знать свои ошибки. Если не трудно, можете подкорректировать ибо я реальный нуб...

Pascal
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
Uses
 CRT;
 
const
 a: string[36] = '0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ'; {задаём строку для поиска
  в ней символов}
var
  rez, s, s2, s3: string;
  t, cc, ind, cc2, k: integer;
 
{процедура для разделения дробной и целой части числа}
procedure Del(var ss: string);
var
  i: integer;
begin
  ind := 0;  {инициализируем переменные}
  s2 := '';
  for i := 1 to length(ss) do  {идём по строке}
    if ss[i] in [',', '.'] then {если символ входит в множество то}
    begin
      ind := i; {запомнили его индекс}
      break{прервали цикл}
    end
    else    {иначе}
      s2 := s2 + ss[i]; {пишим в строку по символам целую часть}
  s3 := '';  {инициализируем переменную}
  if ind <> 0 then {если символ из множества [',','.'] есть в строке то}
  begin
    delete(s, 1, ind); {удаляем с первой позиции по ind элементы из строки
    (т.е. целую часть + [',','.'])}
    s3 := ss; {остаток исходной строки заносим в s3 (т.е. дробную часть)}
  end;
end;
 
 
{функция для перевода дробной части числа из 10-й в любую сс}
function Drob(d: string; t, c: integer): string;
var
  s, l: string;
  l2, m: real;
  i, k: integer;
begin
if pos('E',d)=0 then {если в строке нет E то)
то добавляем к строке "0."}
 val(('0.'+d),m,k)
else {иначе}
val(d,m,k); {переводим строку (без добавления "0.") в число}
  s := '';  {инициализируем переменные}
  i := 0;
  if t <> 0 then  {если точность не равна 0 то переводим}
  begin
    repeat
      l2 := m * c;
      m := frac(l2); {умножаем число на c (основание СС) берём целую часть и
      снова умножаем дробную}
      s := s + a[round(int(l2)) + 1]; {ищим в строке элемент на позиции round(int(l2))+1
      (целая часть от умножения числа на c +1)}
      inc(i); {увеличиваем счётчик}
    until i = t;
  end
  else  {иначе}
   s := '0'; {присваиваем s '0'}
  Drob := s;
end;
 
{функция для проверки может ли быть это число в заданной системе счисления}
Function prov(c:integer;s:string):boolean;
Var
 i,kol,j:integer;
begin
kol:=0; {инициализируем переменную}
for i:=1 to c do {идём по строке а (где с-заданная система счисления)}
begin
 for j:=1 to length(s) do {идём по строке s (заданному числу)}
 if s[j]=a[i] then {если символ нашего числа равен символу из строки а то}
  inc(kol); {увеличиваем счётчик на 1}
end;
if kol=length(s) then {если кол-во символов=длине строки (т.е. все символы в этой СС то) }
 prov:=true {истина}
else  {иначе}
 prov:=false; {ложь}
end;
 
 
begin
  ClrScr;
  repeat
    write('Из какой будем переводить сс: ');
    readln(cc2);
    write('Введите СС в которую хотите перевести: ');
    readln(cc);
  until (cc2 in [2..36]) and (cc in [2..36]); {проверка ввода}
  repeat
   write('ввод числа в ', cc2, '-й СС: ');
   readln(s);
   Del(s); {разбиваем на дробную и целую части строку}
   if not prov(cc2,s2) and not prov(cc2,s3)  then
    write('Некорректное число.Повторите ')
  until prov(cc2,s2) and prov(cc2,s3);
  if cc2 = 10 then {если перевод из 10 то юзаем функции Cel и Drob}
  begin
    write('Введите точность: ');
    readln(t);
    if (s3='') then {если дробная часть числа=0 то юзаем Cel}
      rez := Cel(s2, cc)
    else     {иначе юзаем обе и добавляем , между дробной и целой}
      rez := Cel(s2, cc) + ',' + Drob(s3, t, cc);
  end
  else {иначе если перевод не из 10-й СС }
  begin
    if ind = 0 then
      rez := Cel(ToDec(s2, cc2), cc) {переводим сначала из любой в 10-ю сс, а затем из
     10-й в любую}
    else
      rez := Cel(ToDec(s2, cc2), cc) + ',' + drob(drob2(s3, cc2), length(s3), cc); {переводим из любой сс
      в другую }
  end;
  write('Число ',s,'_',cc2,' в ',cc,'-й системе счисления:=',rez); { THE END }
  readkey
end.
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
10.05.2011, 17:18
Ответы с готовыми решениями:

Сложить числа в формате с плавающей запятой
Сложить числа -26 И 8 в формате с плавающей запятой на ДСДК или ДСОК, разрядная сетка Кф=16....

Погрешность числа в 32-разрядном формате с плавающей запятой
Доброго времени суток, помогите, пожалуйста, определить погрешность числа 2*10^38 в 32-разрядном...

Представить заданные десятичные числа в формате с плавающей запятой
Извините что не по теме. Не могу понять как решить эту задачу, помогите пожалуйста. 1.Представить...

Сложение чисел в формате с плавающей запятой
Доброго времени суток! Есть два числа А=0.25 и В=-3 Нужно их перевести в двоичную систему в...

0
10.05.2011, 17:18
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
10.05.2011, 17:18
Помогаю со студенческими работами здесь

Вычисления значения функции в формате с плавающей запятой
Задание такое - Написать программу для решения функции y=х^2-x^4, где х меняется от -2 до +2 с...

Поместить в матрицу число в формате с плавающей запятой
Здравствуйте. Как вставить реальное число в матрицу?Вставляю 0.0002, беру из ячейки 2. Конечно...

Вычитание чисел с плавающей запятой в формате double ассемблер
Доброго времени суток. Прошу помочь, нужно написать программу:&quot;Вычитание чисел с плавающей точкой в...

Перевести десятичное число с плавающей запятой (точкой) в шестнадцатеричную систему и в 4-байтовом формате
Здравствуйте. Как перевести десятичное число с плавающей запятой (точкой) в шестнадцатиричную...

Числа с плавающей запятой
есть программа которая подсчитывает сумму чисел, введенных с командной строки. к примеру С:\&gt;...

Числа с плавающей запятой
Всем привет! как сравнивать числа с плавающей запятой? var c : real; begin c := 0; if...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
1
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru