48040 (608438), страница 3
Текст из файла (страница 3)
де
- максимальне значення модуля порядку.
Так, при p=7
-1=
=63 і діапазон представлення модулів нормалізованих чисел:
Таким чином, діапазон чисел:
Для розширення діапазону чисел, що представляються, при фіксованій довжині рорядної сітки (m+p) як основа системи числення вибирається
. При цьому число, що представляється в розрядній сітці, набуває значень
. Нормалізована мантиса 16-ого числа з плаваючою комою має значення в діапазоні
. Ознакою нормалізації такого числа є наявність хоч би однієї одиниці в чотирьох старших розрядах модуля мантиси. Діапазон представлення чисел в цьому випадку істотно розширюється, знаходячись при тій же кількості розрядів в межах від
до
.
При записі чисел в кодах ASCII цифрам від 0 до 9 поставлені у відповідність восьмирозрядні двійкові коди від 00110000 до 00111001.
ЕОМ, призначені для обробки економічної інформації, наприклад IBM AT, дозволяють проводити арифметичні операції в десятковій системі числення над числами, представленими в двійково-десяткових кодах і кодах ASCII.
5. Висновки
В процесі налагодження програм та в деяких інших ситуаціях у програмуванні актуальною є проблема переведення чисел з однієї позиційної системи числення в іншу. Якщо основа нової системи числення дорівнює деякому степеню старої системи числення, то алгоритм переводу дуже простий: потрібно згрупувати справа наліво розряди в кількості, що дорівнює показнику степеня і замінити цю групу розрядів відповідним символом нової системи числення. Цим алгоритмом зручно користуватися коли потрібно перевести число з двійкової системи числення у вісімкову або шістнадцяткову. Наприклад, 101102=10 110=268, 10111002=101 1100=5C8
У двійковому відбувається за зворотнім правилом: один символ старої системи числення заміняється групою розрядів нової системи числення, в кількості рівній показнику степеня нової системи числення. Наприклад, 4728=100 111 010=1001110102, B516=1011 0101=101101012
Як бачимо, якщо основа однієї системи числення дорівнює деякому степеню іншої, то перевід тривіальний. У протилежному випадкові користуються правилами переведення числа з однієї позиційної системи числення в іншу (найчастіше для переведення із двійкової, вісімкової та шістнадцяткової систем числення у десяткову, і навпаки).
6. Програмна реалізація
Програма розроблена для перетворення чисел з однієї системи числення в іншу.Реалізована в середовищі програмування Borland C++Builder.
Лістінг програми:
#include
#pragma hdrstop
#include "Unit1.h"
#include
#include
#include
#include
//---------------------------------------------------------------------------
#pragma package(smart_init)
#pragma resource "*.dfm"
TForm1 *Form1;
//---------------------------------------------------------------------------
__fastcall TForm1::TForm1(TComponent* Owner)
: TForm(Owner)
{
}
//---------------------------------------------------------------------------
void __fastcall TForm1::Button1Click(TObject *Sender)
{
//зчитуваня початкового числа
sprintf(s,"%s",Edit1->Text.c_str()); // копіюємо текст в рядок S
sscanf(s,"%s",&szInitialNumber); // зчитуємо значення із рядка S
l=strlen(s);
// зчитування початкової системи числення
sprintf(s,"%s",Edit2->Text.c_str());
sscanf(s,"%i",&InitialSystem);
//зчитування потрібної системи числення
sprintf(s,"%s",Edit3->Text.c_str());
sscanf(s,"%i",&NecessarySystem);
}
//---------------------------------------------------------------------------
void __fastcall TForm1::Button2Click(TObject *Sender)
{
for(i=0; i if( szInitialNumber[i]=='.') SplitPoint=i; for(i=0; i szIntegralPart[i]=szInitialNumber[i]; for(i=SplitPoint+1; i szFractionalPart[i]=szInitialNumber[i]; l2=l-SplitPoint-1; l1=l-l2-1; // перетворення цілої частини for(i=0; i for(j=0;j<=100;j++) if(szIntegralPart[i]==( j >= 10 ? 'A' + j - 10 : '0' + j )) u[i]=j; e=0; for(i=0; i e=(u[i]+e)*InitialSystem; n=e+u[l1-1]; m=0; for(i=0; n>=m; i++) { m=pow(NecessarySystem, i); ll=i-1; } for(k=ll; k>=0; k--) { t=pow(NecessarySystem, k); x=n/t; o[k]=x; for(j=0; j<100; j++) if(o[k]==j) w[k]=( j >= 10 ? 'A' + j - 10 : '0' + j ) ; n=n%t; } lll=strlen(w); for(i=0; i<=ll; i++) szGetIntegralPart[i]=w[ll-i]; // перетворення дробової частини for(i=SplitPoint+1; i for(j=0; j<=100; j++) if(szFractionalPart[i]==( j >= 10 ? 'A' + j - 10 : '0' + j )) u1[i]=j; e1=0; pp=InitialSystem; r=1/pp; for(i=l-1;i>SplitPoint;i--) e1=(u1[i]+e1)*r; n1=e1; nn[0]=n1; for(i=0; i<20; i++) { nn[i+1]=nn[i]*NecessarySystem; if(nn[i+1]>=1) { nnn[i+1]=nn[i+1]; nn[i+1]=nn[i+1]-nnn[i+1]; } else { nn[i+1]=nn[i+1]; nnn[i+1]=nn[i+1]; } } for(k=1; k<20; k++) for(j=0; j<100; j++) if(nnn[k]==j) szGetFractionalPart[k]=( j >= 10 ? 'A' + j - 10 : '0' + j ); for(k=0; k<20; k++) szGetFractionalPart[k]=szGetFractionalPart[k+1]; Edit4->Text=PP; if(u[0]==0) szGetIntegralPart[0]='0'; sprintf(s,"%s.%s", szGetIntegralPart, szGetFractionalPart); Edit4->Text=s; for(i=0;i<=ll;i++) szGetIntegralPart[i]=PP[i]; for(i=0;i<=40;i++) szGetFractionalPart[i]=PP[i]; } //--------------------------------------------------------------------------- void __fastcall TForm1::N1Click(TObject *Sender) { Close(); } Контрольні приклади: Приклад 1. Перетворити число 109 з десяткової системи числення в двійкову. Приклад 2. Перетворити число 1011100000001111 з двійкової системи числення в шістнадцяткову систему числення. Список використаної літератури Григоренко Я.М., Панкратова Н. Д. “Обчислювальн методи в задачах прикладно математики”. Навч.посбник.-К.:Либдь,1995.-280с. “Численные методы в инженерных исследованиях” / В. Е. Краскевич, К. Х. Зеленский, В. И. Гречко.-К.: Вища шк. Головное изд-во,1986.-263 с. Фейсон Т. « Объектно-ориентированное программирование на Borland C++ 4.5». Киев, «Диалектика»,1996. Каган Б.М. Электронные вычислительные машины и системы, М.: Энергоатомиздат, 1985. Фомин С.В. Системы счисления, М.: Наука, 1987. Выгодский М.Я. Справочник по элементарной математике, М.: Государственное издательство технико-теоретической литературы, 1956.















