|
Serwis Edukacyjny Nauczycieli I-LO w Tarnowie
Materiały dla uczniów liceum |
Wyjście Spis treści Wstecz Dalej
Autor artykułu: mgr Jerzy Wałaszek |
©2026 mgr Jerzy Wałaszek
|
Nasz problem polega na znalezieniu reprezentacji danej liczby dziesiętnej w docelowym systemie pozycyjnym o podstawie p. Część całkowitą przeliczamy wg poznanych zasad. Znalezienie kolejnych cyfr zapisu części ułamkowej w systemie docelowym jest zadziwiająco proste. Rozpiszmy wzór na część ułamkową liczby:

gdzie:
| Lu - wartość części ułamkowej zapisu liczby ci, i = -1,-2,...,-m - kolejne cyfry zapisu części ułamkowej p - podstawa systemu pozycyjnego zapisu liczby stałoprzecinkowej m - liczba cyfr części ułamkowej |
Pomnóżmy część ułamkową przez podstawę p. Otrzymamy:

Co uzyskaliśmy w wyniku? Wynikowa liczba ma przesunięte wszystkie cyfry zapisu o jedną pozycję w lewo. Pierwsza cyfra ułamkowa stała się teraz cyfrą całkowitą. Aby ją wydobyć wystarczy wziąć część całkowitą wyniku mnożenia przez p. Za nową część ułamkową przyjmujemy część ułamkową wyniku mnożenia. Działanie to będziemy kontynuowali dotąd, aż wydobędziemy zadaną ilość cyfr ułamkowych.
Przykład:
Znaleźć zapis liczby dziesiętnej 234,13(10) w systemie czwórkowym z dokładnością do 10 cyfr po przecinku.
Rozdzielamy liczbę na część całkowitą i ułamkową:
| Lc = 234, Lu = 0,13 |
Wyznaczamy cyfry zapisu części całkowitej w systemie czwórkowym:
| 234 div 4 = | 58 | i reszta 2 |
| 58 div 4 = | 14 | i reszta 2 |
| 14 div 4 = | 3 | i reszta 2 |
| 3 div 4 = | 0 | i reszta 3 - koniec |
| 234(10)= 3222(4) |
Teraz wyznaczamy 10 kolejnych cyfr części ułamkowej
| 0,13 · 4 = | 0,52 | - cyfra 0 |
| 0,52 · 4 = | 2,08 | - cyfra 2 |
| 0,08 · 4 = | 0,32 | - cyfra 0 |
| 0,32 · 4 = | 1,28 | - cyfra 1 |
| 0,28 · 4 = | 1,12 | - cyfra 1 |
| 0,12 · 4 = | 0,48 | - cyfra 0 |
| 0,48 · 4 = | 1,92 | - cyfra 1 |
| 0,92 · 4 = | 3,68 | - cyfra 3 |
| 0,68 · 4 = | 2,72 | - cyfra 2 |
| 0,72 · 4 = | 2,88 | - cyfra 2 - koniec, obliczyliśmy zadaną ilość cyfr po przecinku |
| 0,13(10)= 0,0201101322...(4) |
Łączymy wyznaczone cyfry części całkowitej i ułamkowej otrzymując wynik:
| 234,13(10)= 3222,0201101322...(4) |
Zwróć uwagę, iż wyznaczając cyfry ułamkowe nie otrzymaliśmy wyniku równego 0. Oznacza to, iż znalezione rozwinięcie zapisu liczby w systemie czwórkowym jest przybliżone - z dokładnością do 10 cyfr ułamkowych systemu czwórkowego. Fakt ten sygnalizujemy w zapisie trzema kropeczkami za ostatnią cyfrą.
| L - liczba rzeczywista, której reprezentację wyznaczamy w systemie docelowym; L ∈ R+ |
| p - podstawa docelowego systemu pozycyjnego; p ∈ N, p ∈ {2,3,...,10} |
| m - liczba cyfr części ułamkowej w systemie docelowym; m ∈ N |
Ciąg znaków ASCII reprezentujących zapis liczby L w systemie pozycyjnym o podstawie p.
| Lc | - część całkowita liczby L; Lc ∈ N |
| Lu | - część ułamkowa liczby L; Lu ∈ R++ {0} |
| s | - łańcuch znaków, w którym składowane są kolejne cyfry zapisu liczby |
| c | - wartość wyliczonej cyfry; c ∈ N + {0} |
| znak(kod) | - zwraca znak ASCII o podanym kodzie |
| K01: | Czytaj L, p, m |
| K02: | Lc ← [L];
Lu ← L - Lc; s ← "" |
| K03: | c ← Lc mod p |
| K04: | s ← znak(c + 48) + s |
| K05: | Lc ← Lc div p |
| K06: | Jeśli Lc ≠ 0, to idź do kroku K03 |
| K07: | s ← s + "," |
| K08: | Jeśli m ≤ 0, to pisz s i zakończ |
| K09: | Lu ← Lu · p |
| K10: | c ← [Lu] |
| K11: | s ← s + znak(c + 48) |
| K12: | m ← m - 1 |
| K13: | Idź do kroku K08 |

Odczytujemy liczbę L, podstawę docelowego systemu pozycyjnego p, na który mamy przeliczyć liczbę L oraz ilość cyfr po przecinku m, które mają się pojawić w rozwinięciu zapisu liczby L w systemie pozycyjnym o podstawie p.
Liczbę L rozdzielamy na dwie części - całkowitą Lc oraz ułamkową Lu.
W pierwszej pętli wyznaczamy kolejne cyfry (od tyłu) zapisu części całkowitej Lc w docelowym systemie pozycyjnym. Zastosowany tutaj algorytm opisaliśmy w rozdziale o przeliczaniu liczby na inny system pozycyjny.
Po wyznaczeniu tych cyfr dodajemy do zapisu znak przecinka.
Druga pętla wyznacza m cyfr rozwinięcia części ułamkowej Lu. Lu mnożymy przez podstawę p. Cyfrę otrzymujemy z części całkowitej wyniku tego iloczynu. Otrzymaną cyfrę zamieniamy na znak ASCII i dopisujemy do zmiennej s. Za nową część ułamkową Lu przyjmujemy część ułamkową iloczynu poprzedniej części ułamkowej Lu i podstawy p. Zmniejszamy licznik cyfr m o 1. Pętla jest kontynuowana aż do wyzerowania tego licznika.
Po zakończeniu obu pętli w zmiennej s mamy kompletny zapis liczby L w systemie pozycyjnym o podstawie p. Wypisujemy zawartość tej zmiennej i kończymy algorytm.
Zwróć uwagę, iż dla prostoty algorytm nie sprawdza poprawności wprowadzonych przez użytkownika danych. Zaproponuj odpowiednią modyfikację algorytmu, aby takie sprawdzenie było wykonywane. Szczególnie niebezpieczna jest sytuacja, gdy podstawa docelowego systemu pozycyjnego p otrzyma wartość 1. Wtedy pętla pierwsza stanie się pętlą nieskończoną (dlaczego?) i program po prostu się zawiesi.
Na podstawie algorytmu tworzymy programy przeliczające liczbę w zapisie dziesiętnym na zapis w systemie pozycyjnym o podstawie od 2 do 10. Przy wprowadzaniu liczby zamiast przecinka używaj kropki do oddzielenia części całkowitej od ułamkowej - wymaga tego biblioteka we/wy języka Pascal.
C++// Przeliczanie dziesiętnej
// liczby stałoprzecinkowej
// na zapis w systemie
// pozycyjnym o podstawie
// 2...10
//---------------------------
// (C)2005 mgr Jerzy Wałaszek
// I Liceum Ogólnokształcące
// w Tarnowie
//---------------------------
#include <cmath>
#include <iostream>
#include <iomanip>
#include <string>
using namespace std;
main()
{
string s;
double L,Lu;
unsigned p,c,Lc,m;
cout << setprecision(10)
<< fixed;
cout <<
"Staloprzecinkowa liczba dziesietna\n"
"na liczbe w systemie pozycyjnym\n"
"o podstawie 2...10\n"
"----------------------------------\n"
"(C)2005 mgr Jerzy Walaszek\n\n"
"Podaj liczbe L = ";
cin >> L;
cout << "\nPodaj p (2..10) = ";
cin >> p;
cout << "\nCyfry ulamkowe = ";
cin >> m;
cout << endl;
Lc = (unsigned)floor(L);
Lu = L - Lc;
s = "";
do
{
c = Lc % p;
s = (char)(c + 48) + s;
Lc = Lc / p;
} while(Lc);
s += ",";
while(m--)
{
Lu *= p;
c = (unsigned)floor(Lu);
s += (char)(c + 48);
Lu -= c;
};
cout << L << "(10) = "
<< s << "(" << p
<< ")\n\n";
system("pause");
return 0;
}
|
Pascal// Przeliczanie dziesiętnej
// liczby stałoprzecinkowej
// na zapis w systemie
// pozycyjnym o podstawie
// 2...10
//---------------------------
// (C)2005 mgr Jerzy Wałaszek
// I Liceum Ogólnokształcące
// w Tarnowie
//---------------------------
program pldz;
{$APPTYPE CONSOLE}
var
s : string;
L,Lu : real;
p,c,Lc,m : cardinal;
begin
writeln('Staloprzecinkowa liczba dziesietna');
writeln('na liczbe w systemie pozycyjnym');
writeln('o podstawie 2...10');
writeln('----------------------------------');
writeln('(C)2005 mgr Jerzy Walaszek');
writeln;
write('Podaj liczbe L = '); readln(L);
writeln;
write('Podaj p (2..10) = '); readln(p);
writeln;
write('Cyfry ulamkowe = '); readln(m);
writeln;
Lc := trunc(L); Lu := L - Lc;
s := '';
repeat
c := Lc mod p;
s := char(c + 48) + s;
Lc := Lc div p;
until Lc = 0;
s := s + ',';
while m > 0 do
begin
Lu := Lu * p;
c := trunc(Lu);
s := s + char(c + 48);
Lu := Lu - c;
dec(m);
end;
writeln(L:0:10,'(10) = ',s,'(',p,')');
writeln;
writeln('Nacisnij ENTER...');
readln;
end.
|
Basic' Przeliczanie dziesiętnej
' liczby stałoprzecinkowej
' na zapis w systemie
' pozycyjnym o podstawie
' 2...10
'---------------------------
' (C)2005 mgr Jerzy Wałaszek
' I Liceum Ogólnokształcące
' w Tarnowie
'---------------------------
Dim As String s
Dim As Double L, Lu
Dim As UInteger p, c, Lc, m
Print "Staloprzecinkowa liczba dziesietna"
Print "na liczbe w systemie pozycyjnym"
Print "o podstawie 2...10"
Print "----------------------------------"
Print "(C)2005 mgr Jerzy Walaszek"
Print
Input "Podaj liczbe L = ", L
Print
Input "Podaj p (2..10) = ", p
Print
Input "Cyfry ulamkowe = ", m
Print
Lc = Int(L)
Lu = L - Lc
s = ""
Do
c = Lc Mod p
s = Chr(c + 48) + s
Lc \= p
Loop Until Lc = 0
s += ","
While m > 0
Lu *= p
c = Int(Lu)
s += Chr(c + 48)
Lu -= c
m -= 1
WEnd
Print L;"(10) = ";s;"(";p;")"
Print
Print "Naciśnij klawisz..."
Sleep
End
|
Python
(dodatek)# Przeliczanie dziesiętnej
# liczby stałoprzecinkowej
# na zapis w systemie
# pozycyjnym o podstawie
# 2...10
#---------------------------
# (C)2005 mgr Jerzy Wałaszek
# I Liceum Ogólnokształcące
# w Tarnowie
#---------------------------
print("Stałoprzecinkowa liczba dziesiętna")
print("na liczbę w systemie pozycyjnym")
print("o podstawie 2...10")
print("----------------------------------")
print("(C)2005 mgr Jerzy Wałaszek")
print()
L = float(input("Podaj liczbę L = "))
print()
p = int(input("Podaj p (2..10) = "))
print()
m = int(input("Cyfry ułamkowe = "))
print()
Lc = int(L)
Lu = L - Lc
s = ""
while(Lc):
c = Lc % p
s = chr(c + 48) + s
Lc //= p
s += ","
while m:
Lu *= p
c = int(Lu)
s += chr(c + 48)
Lu -= c
m -= 1
print(L,"(10) = ",s,"(",p,")",sep="")
print()
input("Naciśnij Enter...")
|
| Wynik: |
Stałoprzecinkowa liczba dziesiętna na liczbę w systemie pozycyjnym o podstawie 2...10 ---------------------------------- (C)2005 mgr Jerzy Wałaszek Podaj liczbę L = 12.5 Podaj p (2..10) = 5 Cyfry ułamkowe = 10 12.5(10) = 22,2222222222(5) Naciśnij Enter... |
JavaScript<html>
<head>
</head>
<body>
<div style="overflow-x: auto;"
align="center">
<table
border="0"
cellpadding="4"
style="border-collapse:
collapse">
<tr>
<td nowrap>
<form
name="frm"
style="text-align: center;
background-color:
#E7E7DA">
<b>Stałoprzecinkowa liczba
dziesiętna<br/>
na liczbę w systemie
pozycyjnym<br/>
o podstawie 2...10</b><br/><br/>
(C)2026 mgr
Jerzy Wałaszek
I LO w Tarnowie
<hr>
<div
align="center">
<table
style="border-collapse:
collapse;"
border="0"
cellpadding="4">
<tr>
<td align="right">
Liczba =
</td>
<td>
<input value="12.5"
name="inp_l" size="15"
style="text-align:
right;">
</td>
</tr>
<tr>
<td align="right">
Podstawa (2...10) =
</td>
<td>
<input value="5"
name="inp_p" size="15"
style="text-align:
right;">
</td>
</tr>
<tr>
<td align="right">
Ilość cyfr po przecinku =
</td>
<td>
<input name="inp_m"
size="15" value="10"
style="text-align:
right;"
type="text">
</td>
</tr>
</table>
</div>
<hr>
<input onclick="main();"
value="Przelicz" name="B1"
type="button">
<hr/>
<b>Wynik:</b>
<div id="out">.</div>
</form>
</td>
</tr>
</table>
</div>
<script language="javascript">
// Przeliczanie dziesiętnej
// liczby stałoprzecinkowej
// na zapis w systemie
// pozycyjnym o podstawie
// 2...10
//---------------------------
// (C)2005 mgr Jerzy Wałaszek
// I Liceum Ogólnokształcące
// w Tarnowie
//---------------------------
function main()
{
var s,t,L,Lu,p,c,Lc,m;
L = parseFloat(document.frm.inp_l.value);
p = parseInt(document.frm.inp_p.value);
m = parseInt(document.frm.inp_m.value);
if(isNaN(L) || isNaN(p) || isNaN(m))
t = "<span style='color:Red'>" +
+ "<b>Złe dane</b></span>";
else
{
Lc = Math.floor(L);
Lu = L - Lc;
s = "";
do
{
c = Lc % p;
s = String.fromCharCode(c + 48) + s;
Lc = Math.floor(Lc / p);
} while(Lc);
s += ",";
while(m)
{
Lu *= p;
c = Math.floor(Lu);
s += String.fromCharCode(c + 48);
Lu -= c;
m--;
};
t = L + "<sub>(10)</sub>= " + s +
"<sub>(" + p + ")</sub>";
};
document.getElementById("out")
.innerHTML = t;
}
</script>
</body>
</html>
|
Przelicz liczbę 238,32(10) na system dwójkowy, trójkowy, czwórkowy, piątkowy i ósemkowy z dokładnością do 5 cyfr po przecinku.
Wyznacz rozwinięcie dwójkowe liczby dziesiętnej 0,1(10) z dokładnością do 16 cyfr dwójkowych po przecinku.
Co możesz powiedzieć o otrzymanym wyniku? Podaj dwa dalsze przykłady ułamków dziesiętnych o takich właściwościach.
Oblicz w promilach błąd przeliczenia liczby 2,4(10) na system czwórkowy z dokładnością do 4 cyfr po przecinku. Wynik zaokrąglij w dół do setnych promila.
Przy wyznaczaniu zapisu liczby w innym systemie liczbowym może się zdarzyć, iż dostaniemy liczbę o nieskończonym rozwinięciu części ułamkowej. Określ, kiedy otrzymamy rozwinięcie nieskończone (okresowe), a kiedy skończone.
Podany algorytm jest niejednorodny. Czy można go przekształcić, tak aby cała liczba stałoprzecinkowa była wyznaczana w jednym przebiegu bez podziału na część całkowitą i ułamkową? Czy potrafisz ocenić wady takiego rozwiązania?
Zobacz dalej...
Wartość liczby pozycyjnej | Schemat Hornera | Przeliczenia na inny zapis pozycyjny | Wartość liczby stałoprzecinkowej | Systemy pozycyjne o podstawie większej od 10 | Zapis zmiennoprzecinkowy
![]() |
Zespół Przedmiotowy Chemii-Fizyki-Informatyki w I Liceum Ogólnokształcącym im. Kazimierza Brodzińskiego w Tarnowie ul. Piłsudskiego 4 ©2026 mgr Jerzy Wałaszek |
Materiały tylko do użytku dydaktycznego. Ich kopiowanie i powielanie jest dozwolone pod warunkiem podania źródła oraz niepobierania za to pieniędzy.
Pytania proszę przesyłać na adres email:
Serwis wykorzystuje pliki cookies. Jeśli nie chcesz ich otrzymywać, zablokuj je w swojej przeglądarce.
Informacje dodatkowe.