Funkcja przeliczanie systemów


(Scar9) #1

mam do napisania funkcje w c++ która bedzie przeliczac liczbe (podana jako łancuch znaków) w jakims systemie liczbowym na inny system. Liczby sa rzeczywiste.


(rgabrysiak) #2

Zobacz:

http://www.coderscity.net/ptopic4203.html


(Marcin Obala) #3

Jeśli liczby są rzeczywiste to część całkowitą obliczasz według tego w linku natomiast część ułamkową musisz przeliczyć w następujący sposób

mamy liczbe 0,625

mnożymy x2 wychodzi 1,25

usuwamy część całkowitą i zapisujemy sobie ją gdzieś do tablicy

1

0,25 znowu mnożymymy i wychodzi 0,5

usuwamy część całkowitą a że jej nie ma to zapisujemy do tablicy 0

0

mamy teraz 0,5 mnożymy x2 i mamy 1,0

usuwamy część całkowitą i zapisujemy

1

zostaje nam 0 więc juz nic nie robimy pętla skończona

0,625 (10) = 0,101 (2)

pętle wykonujemy dopóki nie otrzymamy 0 po usunięciu cześci całkowitej lub jeśli uzyskamy odpowiednią ilość liczb po przecinku


(Fiołek) #4

Marcin511 , to rozwiązanie nie działa. Czy 101 binarnie to 625 w dziesiętnym? Nie. Nie widzę sensu tego algorytmu. IMHO należy wyciągnąć część ułamkową i dopiero ją zamienić.


(Marcin Obala) #5

Nie, 101 w binarnym to nie 625 w dziesiętnym tylko 0.101 w dwójkowym to 0.625 w dziesiętnym

http://www.i-lo.tarnow.pl/edu/inf/alg/num/pages/011.php

i fragment z tej strony

Sposób pierwszy


Obliczamy wartość części całkowitej sumując wagi pozycji zawierających cyfrę 1:


110101(2) = 32 + 16 + 4 + 1 = 53(10)


Identycznie obliczamy wartość części ułamkowej:


0,111011(2) = 1/2 + 1/4 + 1/8 + 1/32 + 1/64

0,111011(2) = 32/64 + 16/64 + 8/64 + 2/64 + 1/64

0,111011(2) = 59/64


Łączymy obie części w całość otrzymując wynik:


110101,111011(2) = 53 59/64

więc wynika z tego że moja liczba 0.101 to 1/2 + 1/8 (przy 1/4 jest 0) więc 1/2 + 1/8 = 0.5 + 0.125 = 0.625

Z resztą w szkole też mnie tak uczyli jak tutaj piszę.