Дробные числа

Перед преобразованием числа из десятичной системы счисления в двоичную необходимо выделить целую и дробную части. Целая часть преобразуется одним из вышеуказанных способов. Перевод дробной части чисел из десятичной системы в двоичную методом разложения по отрицательным степеням двойки может оказаться слишком трудоёмким, поэтому будем использовать следующий способ:

Дробная часть десятичного числа записывается в начале колонки (см. рис.1.9), затем последовательно умножается на два. Результат записывается ниже в колонку. Если в произведении получилось больше разрядов, чем было до умножения, то старший разряд (единица) отбрасывается в колонку слева. Если разрядов не прибавилось, то в колонку слева пишется нуль. Дробное двоичное число собирается из левой колонки, записывая верхний ряд первым разрядом после точки и далее по порядку.

Процесс умножения на 2 заканчивается, если произведение становится равным нулю или если точность полученного числа не меньше точности искомого. Приблизительно можно считать, что каждый десятичный разряд соответствует 3,32 разрядам двоичного числа (). Например, два разряда десятичного дробного числа по точности соответствуют семи разрядам двоичного числа ( – округление следует проводить в бόльшую сторону).

Рис. 1.10. Преобразование дробного десятичного числа 0.17 в двоичное.

Преобразование дробного двоичного числа в десятичный вид можно совершать двумя способами:

1й способ. Суммирование отрицательных степеней двойки, которые соответствуют единичным битам двоичного числа:

Рис. 1.11. Преобразование дробного двоичного числа 0.00101012
в десятичное (1й способ).

2й способ. Дробная часть двоичного числа записывается по одному биту колонкой сверху вниз. Крайний правый бит находится внизу. Нижняя строка это 0.5. Число из нижнего ряда переходит вверх, суммируясь с битом текущего ряда, а сумма делится на 2. Результат получается в самом верхнем ряду:

Рис. 1.12. Преобразование дробного двоичного числа 0.00101012
в десятичное (2й способ).

При написании программ на языке Си важно помнить типы данных для задания и хранения числовых значений.

Таблица 1.4. Стандартные числовые типы данных языка Си.

Имя типа Длина в битах Диапазон значений
unsigned char   0 … 255
char   -128 … 127
     
enum   -32 768 … 32 767
unsigned int   0 … 65,535
short int   -32 768 … 32 767
int   -32 768 … 32 767
     
unsigned long   0 … 4 294 967 295
long   -2 147 483 648 … 2 147 483 647
float   3.4 * (10-38) … 3.4 * (10+38)
     
double   1.7 * (10-308) … 1.7 * (10+308)
     
long double   3.4 * (10-4932) … 1.1 * (10+4932)

Для того чтобы успешно выполнить лабораторное задание, напомним функции и приемы языка Си, которые могут понадобиться при написании программы.

Пример 1.1. Поиск символа «.» в строке s и вывод номера его позиции.

#include <stdio.h>

#include <string.h>

void main()

{ char s [80];

scanf("%s",s);

char * ptr = strchr(s, '.');

if (ptr)

printf("\n Символ точка стоит на %d месте", ptr-s);

}

В примере 1.1 используется функция strchr, которая возвращает указатель на первый встретившийся символ «.» строки, указанный вторым аргументом. Если таких символов несколько, то программа их не обнаружит. При выводе номера позиции используется разница между адресом строки и указателем на символ.

Пример 1.2. Программа преобразования целых двоичных чисел в шестнадцатеричные.

#include <stdio.h>

#include <stdlib.h>

#include <conio.h>

#include <string.h>

int i;

char s [80], bin [16];

char bin2hex (char * s); // объявление функции

void main ()

{

clrscr();

scanf("%s",s);

for(int i=0; i<strlen(s);i++)

if ((s[i]!='0')&&(s[i]!='1'))

{

printf("\n Не верный символ %c\n",s[i]);

abort();

}

if ((strlen(s)%4)!=0)

do {

strrev(s);

strcat(s,"0");

strrev(s);

} while ((strlen(s)%4)!=0);

for(i=strlen(s)/4;i>0;i--)

{

memcpy (bin, s, 4);

strrev(s);

s[(i-1)*4]='\0';

strrev(s);

printf("\nbin2hex %s = %c",bin,bin2hex(bin));

}

getch();

}

char bin2hex (char * s)

{

if (strlen(s)>4) return '*';

if (strcmp(s,"0000")==0) return '0';

.......

if (strcmp(s,"1111")==0) return 'F';

}

В примере 1.2 используются следующие функции:

strrev(s) – изменяет порядок следования символов в строке s на противоположный;

strlen(s) – определяет число символов в строке s;

strcmp(s,"1111") – сравнивает строки; если результат равен нулю, то это означает, что строки равны;

memcpy (bin, s, 4) – копирует 4 символа из строки s в строку bin.

Пример 1.3. Программа преобразования десятичных чисел в двоичные (1й способ)

#include <STDIO.H>

#include <STDLIB.H>

int x, // вводимое число

x1, // промежуточная переменная

i; // счетчик

int a[9]; // массив степеней двойки

char s[9];// выходной массив двоичного представления

void main()

{ a[0]=1; // первое число массива

for (i=1;i<=8;i++)

{ a[i]=a[i-1]*2; //... остальные значения массива

s[i]='0'; //двоичное представление числа "0" }

printf("\n Введите десятичное число-->");

scanf("%i",&x);

if ((x<0)||(x>255)){printf(" Число д.б. от 0 до 255!");

_exit(10); };

if (x==0) goto ans;

x1=x; i=1;

while (1)

{if (x1<a[i])

{ s[i]='1';

x1-=a[i-1];

if (x1==0) break;

i=1; };

if (x1>=a[i]) i++; };

ans: printf(" Двоичный вид числа %i=",x);

for (i=8;i>=1;i--)

printf("%c",s[i]);

}

В примере 1.3 используется функция scanf(), которая вводит данные со стандартного устройства ввода (клавиатуры). Обратите внимание, для ввода строковых данных не используется префикс адреса &.

Пример 1.4. Программа преобразования двоичных чисел в десятичные (1й способ)

#include <STDIO.H>

#include <STDLIB.H>

#include <String.h>

int x, // выводимое число

i; // счетчик

int a[9]; // массив степеней двойки

char s[100];// входной массив двоичного представления

void main()

{

a[0]=1; // первое число массива

for (i=1;i<=8;i++) a[i]=a[i-1]*2;// остальные значения

printf("\n Введите двоичное число-->");

scanf("%s",&s);

if (strlen(s)>8)

{ printf("Длина вводимого числа не д.б. больше 8\n");

_exit(10); }

for (i=0;i<=7;i++)

{

if ((s[i]!='0')&&(s[i]!='1')&&(s[i]!=0))

{printf("Плохой символ двоичного числа s[%i]=%c\n",

i,s[i]);

_exit(10); }

if (s[i]==0) break;

}

x=0;

for (i=0;i<strlen(s);i++)

x+=a[strlen(s)-1-i]*(s[i]-48);

printf("Десятичное число =%i",x);

}


Понравилась статья? Добавь ее в закладку (CTRL+D) и не забудь поделиться с друзьями:  



double arrow
Сейчас читают про: