Zamień z systemu dziesiętnego na dwójkowy liczbę

Jefferson Darcy
Użytkownik
Użytkownik
Posty: 57
Rejestracja: 4 lis 2007, o 10:59
Płeć: Mężczyzna
Lokalizacja: Polska
Podziękował: 1 raz

Zamień z systemu dziesiętnego na dwójkowy liczbę

Post autor: Jefferson Darcy »

Zamień z systemu dziesiętnego na dwójkowy liczbę
a) 367
b) 0,125
c) 0,025
d) 170,105
Xitami

Zamień z systemu dziesiętnego na dwójkowy liczbę

Post autor: Xitami »

Kod: Zaznacz cały

//działa dla r>=1
  m=2^?    // np. m=256
  input r
  s= 0

  while m>r 
      m /= 2

  while s != r 
      if s+m > r  print(0)
      else
          print(1)
          s += m
      if m==1 then print('.')
      m /= 2

  while m >= 1
      print (0)
      m /= 2
np:
1.025 (dec) =
1.000001100110011001100110011001100110011001100110011001100110011 (bin)
liczba dwójkowych cyfr które otrzymamy, zależy od typu użytych zmiennych, tu extended albo long double
dla double otrzymamy 1.025 (dec) =
1.000001100110011001100110011001100110011001100110011 (bin)
a single da
1.025 (dec) =
1.00000110011001100110011 (bin)

Widać tu ciekawą rzecz, rzecz z której nie każdy zdaje sobie sprawę.
Dziesiętna liczba 1.025, dwójko jest liczbą okresową. Podobnie jak 0.1.
Skoro jest okresowa, to znaczy, że NIE ZMIEŚCI SIĘ W PAMIĘCI KOMPUTERA!

Ile razy obróci się pętla?

Kod: Zaznacz cały

x=0
while x<1
     x += 1/1000000
Z tego też wynika, że pisanie

Kod: Zaznacz cały

 if y==0.1 
jest zwykle błędem
Ostatnio zmieniony 4 lut 2008, o 13:22 przez Xitami, łącznie zmieniany 1 raz.
MGT
Użytkownik
Użytkownik
Posty: 107
Rejestracja: 7 lis 2006, o 12:03
Płeć: Mężczyzna
Lokalizacja: Gdańsk
Pomógł: 20 razy

Zamień z systemu dziesiętnego na dwójkowy liczbę

Post autor: MGT »

\(\displaystyle{ (367)_{10} = (101101111)_{2}\\
(0,125)_{10} = (0,001)_{2}\\
(0,025)_{10} = (0,000(0011))_{2}\\
(170,105)_{10} \approx (10101010,000110101110000101000111101011)_{2}\\}\)


widzę, że ktoś uprzedził :>
Xitami

Zamień z systemu dziesiętnego na dwójkowy liczbę

Post autor: Xitami »

\(\displaystyle{ (170.105)_{10}=(10101010.00011(01011100001010001111))_2}\)
MGT
Użytkownik
Użytkownik
Posty: 107
Rejestracja: 7 lis 2006, o 12:03
Płeć: Mężczyzna
Lokalizacja: Gdańsk
Pomógł: 20 razy

Zamień z systemu dziesiętnego na dwójkowy liczbę

Post autor: MGT »

Xitami pisze: Ile razy obróci się pętla?

Kod: Zaznacz cały

x=0
while x<1
     x += 1/1000000

nieskończenie wiele

Xitami pisze:\(\displaystyle{ (170.105)_{10}=(10101010.00011(01011100001010001111))_2}\)
wiedziałem, że gdzieś tu jest okres
Xitami

Zamień z systemu dziesiętnego na dwójkowy liczbę

Post autor: Xitami »

Wiedziałem, że musi być i w dodatku mały. W ogólności byłoby z tym trochę kłopotu.

Kod: Zaznacz cały

x=0
while x<1
     x += 1/1000000.0
Dodałem dziesiętny przecinek, a teraz?
MGT
Użytkownik
Użytkownik
Posty: 107
Rejestracja: 7 lis 2006, o 12:03
Płeć: Mężczyzna
Lokalizacja: Gdańsk
Pomógł: 20 razy

Zamień z systemu dziesiętnego na dwójkowy liczbę

Post autor: MGT »

milion.
kwestia, że w pierwszy przypadku jest dzielenie całkowitoliczbowe. tak samo jak:
x += 2/3 jest równoważne z x+=1
x+=1.0/1000 - to zadziała poprawnie [w sensie zgodnie z intuicją]
x+=1/(double)1000 też zadziała
Xitami

Zamień z systemu dziesiętnego na dwójkowy liczbę

Post autor: Xitami »

gdy X jest typu single, wynik jest dość zaskakujący
warto podywagować
ODPOWIEDZ