Loading...
hwfbcisod avatar hwfbcisod 80 Точки

Floating-point number -> binary

Въпросът ми е: Как мога да преобразувам число с плаваща запетая (float,double,decimal) от десетична към двоична бройна система?Алгоритъма с взимането на остатъците в обратен ред няма да работи, особено в случаите +-(0<x<1).

Тагове:
0
Programming Basics 03/06/2016 18:30:09
Curious avatar Curious 33 Точки
Best Answer

Дробната част се умножава последователно с основата на бройната система S. Цялата част от произведението P = A*S се записва като ai (a с индекс i) , а дробната част – като A и участва в следващата стъпка (следващо умножение). Алгоритъмът продължава до получаване на 0 за дробната част. Правилни са ти разсъжденията за случаите, когато х е в интервала [0,1], в този случай трябва да се въведе допълнително условие за край (напр. брой знаци след десетичната запетая), това е интересен случай, който илюстрира причината, защо стойностите на променливи от тип float или double никога не са абсолютно точни. Резултатът се формира от целите части ai (а с индекс и) , записани в реда на получаването им.

 

1. Установява се i = -1.

2. Дробната част A се умножава с основата S, т.е. P = A*S

3. Записва се цялата част от P като ai .

4. На числото A се присвоява дробната част от P.

5. Установява се следващият разряд, т.е. i=i-1;

6. Повтарят се стъпки 2, 3, 4, 5, 6, докато А>0.

7. При А<=0 алгоритъмът завършва. Преобразуваното число се формира от целите части: а-1а-2а-3…(а с индекс [-1, n])

Пример:
0,0625 в двоична бройна система:

i = -1 | P = 0,0625 * 2 = 0,125 | a-1 = 0  | i = i-1 = -2  | A = R = 0,125

i = -2 | P = 0,125 * 2 = 0,25     | a-2 = 0  | i = i-1 = -3  | A = R = 0,25

i = -3 | P = 0,25 * 2 = 0,5        | a-3 = 0  | i = i-1 = -4  | A = R = 0,5

i = -4 | P = 0,5 * 2 = 1,0          |a-4 = 1   |А = R = 0 .

край 0,0625(10) = 0,0001(2)

Извинявам се за лошото форматиране, надявам се да съм бил полезен. Можеш да използваш този алгоритъм и за други бройни системи, не само за двоична.

Полезни ресурси:
тема в Wikipedia
MSDN
П.С: също така, бих ти препоръчал за в бъдеще да се поразровиш за алгоритми за сравняване на реални числа, не знам дали в C# има готови методи, които можеш до ползваш, но все пак няма да навреди да научиш как се случват нещата на по-ниско ниво.


 

1
08/06/2016 13:40:29
hwfbcisod avatar hwfbcisod 80 Точки

Страхотен пост! Благодаря!

0
08/06/2016 18:57:46
Можем ли да използваме бисквитки?
Ние използваме бисквитки и подобни технологии, за да предоставим нашите услуги. Можете да се съгласите с всички или част от тях.
Назад
Функционални
Използваме бисквитки и подобни технологии, за да предоставим нашите услуги. Използваме „сесийни“ бисквитки, за да Ви идентифицираме временно. Те се пазят само по време на активната употреба на услугите ни. След излизане от приложението, затваряне на браузъра или мобилното устройство, данните се трият. Използваме бисквитки, за да предоставим опцията „Запомни Ме“, която Ви позволява да използвате нашите услуги без да предоставяте потребителско име и парола. Допълнително е възможно да използваме бисквитки за да съхраняваме различни малки настройки, като избор на езика, позиции на менюта и персонализирано съдържание. Използваме бисквитки и за измерване на маркетинговите ни усилия.
Рекламни
Използваме бисквитки, за да измерваме маркетинг ефективността ни, броене на посещения, както и за проследяването дали дадено електронно писмо е било отворено.