|
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
|
Dotychczasowe rozważania dotyczyły liczb naturalnych. Zapis pozycyjny można w prosty sposób rozszerzyć na liczby ułamkowe wprowadzając pozycje o wagach ułamkowych. Przyjrzyjmy się liczbie dziesiętnej:
| Wagi pozycji | 103 | 102 | 101 | 100 | 10-1 | 10-2 | 10-3 | 10-4 | 10-5 | |
|
Cyfry zapisu |
3 | 5 | 7 | 9 | , | 8 | 2 | 9 | 1 | 4 |
| Numery pozycji | 3 | 2 | 1 | 0 | -1 | -2 | -3 | -4 | -5 | |
| Część całkowita |
Część ułamkowa |
|||||||||
Liczba stałoprzecinkowa może być potraktowana jako złożenie dwóch liczb - części całkowitej oraz części ułamkowej rozdzielone przecinkiem. Umówmy się, iż pozycje ułamkowe będziemy numerować kolejnymi liczbami ujemnymi. Przy takiej umowie wagi pozycji ułamkowych wciąż będą równe podstawie podniesionej do potęgi o wartości numeru pozycji. Zasada obliczania wartości liczby stałoprzecinkowej jest identyczna do poznanej wcześniej zasady: wartość liczby stałoprzecinkowej jest równa sumie iloczynów jej cyfr przez wagi pozycji tych cyfr. W systemie pozycyjnym o podstawie innej niż dziesięć jest tak samo.
Przykład:
Obliczyć wartość liczby stałoprzecinkowej 213,132(4).
| 213,132(4)= 2 · 42+ 1 · 41+ 3 · 40+ 1 · 4-1+ 3 · 4-2+ 2 · 4-3 213,132(4)= 2 · 16 + 1 · 4 + 3 · 1 + 1 · 1/4+ 3 · 1/16+ 2 · 1/64 213,132(4)= 32 + 4 + 3 + 1/4+ 3/16+ 2/64 213,132(4)= 39 + 16/64+ 12/64+ 2/64 213,132(4)= 39 30/64 |
Obliczyć wartość liczby stałoprzecinkowej 537,462(8).
| 537,462(8)= 5 · 82+ 3 · 81+ 7 · 80+ 4 · 8-1+ 6 · 8-2+ 2 · 8-3 537,462(8)= 5 · 64 + 3 · 8 + 7 · 1 + 4 · 1/8+ 6 · 1/64+ 2 · 1/512 537,462(8)= 320 + 24 + 7 + 4/8+ 6/64+ 2/512 537,462(8)= 351 + 256/512+ 48/512+ 2/512 |
Obliczenie wartości liczby stałoprzecinkowej według podstawowego wzoru wymaga obliczeń na ułamkach. Z doświadczenia wiem, iż tutaj uczniowie zwykle popełniają najwięcej pomyłek (nawet w klasie matematycznej). Podam zatem prosty sposób znajdowania wartości części ułamkowej bez sumowania ułamków. Najpierw przyjrzyjmy się kilku liczbom dziesiętnym:




Czy zauważasz tutaj pewną prawidłowość? Jeśli potraktujemy część ułamkową jako liczbę całkowitą, to wartość części ułamkowej będzie po prostu iloczynem tej liczby i wagi pozycji ostatniej cyfry zapisu stałoprzecinkowego. W powyższych przykładach waga pozycji ostatniej cyfry wynosi kolejno:

W innych systemach pozycyjnych zasada ta wciąż obowiązuje, gdyż system dziesiętny nie jest przecież żadnym wyróżnionym systemem pozycyjnym.
Przykład:
Oblicz wartość liczby stałoprzecinkowej 0,4231(5).
Część całkowita wynosi 0. Część ułamkową potraktujemy jako liczbę całkowitą, obliczymy jej wartość i pomnożymy ją przez wagę ostatniej cyfry zapisu stałoprzecinkowego, czyli przez:

| 4231(5)= 4 · 53+ 2 · 52+ 3 · 51+ 1 · 50 4231(5)= 4 · 125 + 2 · 25 + 3 · 5 + 1 · 1 4231(5)= 500 + 50 + 15 + 1 4231(5)= 566 |
Zatem:
Sprawdzamy:
| 0,4231(5)= 0 · 50+ 4 · 5-1+ 2 · 5-2+ 3 ·
5-3+ 1 · 5-4 0,4231(5)= 0 · 1 + 4 · 1/5+ 2 · 1/25+ 3 · 1/125+ 1 · 1/625 0,4231(5)= 0 + 4/5+ 2/25+ 3/125+ 1/625 0,4231(5)= 500/625+ 50/625+ 15/625+ 1/625 0,4231(5)= 566/625. |
| p - podstawa docelowego systemu pozycyjnego, p ∈ N, p ∈ {2,3,...,10} |
| s - tekst zawierający ciąg znaków ASCII przedstawiających poprawny zapis liczby. |
Liczba L będąca wartością liczby o podstawie p i zapisanej w postaci ciągu znaków s. L ∈ R+
| w | - odwrotność wagi pozycji ostatniej cyfry, w ∈ N |
| u | - informuje o napotkaniu przecinka, u ∈ {true, false} |
| i | - numer kolejnego znaku w zmiennej s, i ∈ N |
| kod(znak) | - funkcja zwraca kod ASCII znaku |
| długość(tekst) | - zwraca liczbę znaków zawartych w tekście |
| K01: | Czytaj p i s |
| K02: | L ← 0; w ← p; u ← false |
| K03: | Dla i = 1,2,...,długość(s) wykonuj K04...K06. |
| K04: | Jeśli s[i] = ",", to u ← true i idź do K07 |
| K05: | c ← kod(s[i]) - kod("0") |
| K06: | Jeśli u = true, to L ← L + c : w w ← w · p Inaczej L ← L · p + c |
| K07: | Pisz L i zakończ |

Odczytujemy podstawę p oraz zapis liczby w zmiennej łańcuchowej s. Nasz algorytm zakłada, iż kolejne znaki w s są umieszczone na pozycjach numerowanych od 1 (w językach C++, Python oraz JavaScript znaki są numerowane od pozycji 0 - należy zatem zastosować odpowiednią poprawkę).
Algorytm wykorzystuje schemat Hornera do wyznaczenia wartości części całkowitej oraz wzór podstawowy do wyznaczenia części ułamkowej liczby. Zwróć uwagę, iż zastosowany tutaj schemat Hornera różni się nieco od podanego wcześniej. Różnica polega na tym, iż rozpoczynamy od ustawienia wartości wyznaczanej liczby L na 0 (a nie na wartość pierwszej cyfry). Dzięki temu podejściu znacznie upraszcza się algorytm.
Zmienna u pełni rolę znacznika przecinka (u jak ułamek). Początkowo ustawiamy ją na false, co spowoduje, iż algorytm będzie wyznaczał wartość części całkowitej liczby.
Rozpoczynamy pętlę iteracyjną sterowaną przez zmienną i. Zadaniem tej pętli jest przeglądnięcie wszystkich znaków w odczytanym tekście s. Gdy pętla się zakończy w L mamy obliczoną wartość liczby. Wyświetlamy ją i kończymy algorytm.
Wewnątrz pętli najpierw sprawdzamy, czy bieżącym znakiem jest przecinek. Jeśli tak, to ustawiamy na true znacznik przecinka u, co spowoduje, iż algorytm będzie wyznaczał wartość części ułamkowej liczby. Po ustawieniu tego znacznika rozpoczynamy kolejny obieg pętli.
Jeśli bieżącym znakiem nie jest przecinek, to zakładamy, iż jest nim cyfra. Wyznaczamy jej wartość i wynik umieszczamy w zmiennej c.
Następnie w zależności od stanu logicznego znacznika u wyliczamy wartość części całkowitej (u=false) lub ułamkowej (u=true). W części całkowitej stosujemy schemat Hornera. W części ułamkowej dzielimy cyfrę przez odwrotność wagi jej pozycji (zmienna w) i dodajemy do wyliczanej wartości liczby L. Po tej operacji wyliczamy odwrotność wagi następnej pozycji ułamkowej.
Kontynuujemy kolejny obieg pętli aż do przetworzenia wszystkich znaków w s.
Na podstawie algorytmu tworzymy programy wyznaczające wartość dziesiętną liczby stałoprzecinkowej zapisanej w systemie pozycyjnym o podstawie od 2 do 10. Zwróć uwagę, iż algorytm nie sprawdza poprawności danych wprowadzonych przez użytkownika.
C++// Liczby stałoprzecinkowe
// w systemie pozycyjnym
// o podstawie od 2 do 10
//---------------------------
// (C)2005 mgr Jerzy Wałaszek
// I Liceum Ogólnokształcące
// w Tarnowie
//---------------------------
#include <iostream>
#include <iomanip>
#include <string>
using namespace std;
main()
{
string s;
unsigned c,i,p,w;
bool u;
double L;
cout << setprecision(10)
<< fixed;
cout <<
"Wartosc liczby staloprzecinkowej\n"
"w systemie pozycyjnym o podstawie p\n"
"-----------------------------------\n"
"(C)2005 mgr Jerzy Walaszek\n\n"
"Podaj p (2..10) = ";
cin >> p;
cout << "\nPodaj liczbe L = ";
getline(cin,s); // ignorujemy EOL
getline(cin,s); // teraz czytamy liczbę
L = 0; w = p; u = false;
for(i = 0; i < s.length(); i++)
{
if(s[i] == ',')
u = true;
else
{
c = s[i] - int('0');
if(u)
{
L += double(c) / w; w *= p;
}
else L = L * p + c;
}
}
cout << endl << s
<< "(" << p << ") = "
<< L << "(10)\n\n";
system("pause");
return 0;
}
|
Pascal// Liczby stałoprzecinkowe
// w systemie pozycyjnym
// o podstawie od 2 do 10
//---------------------------
// (C)2005 mgr Jerzy Wałaszek
// I Liceum Ogólnokształcące
// w Tarnowie
//---------------------------
program lspoz;
{$APPTYPE CONSOLE}
var
s : string;
c,i,w,p : cardinal;
L : real;
u : boolean;
begin
writeln('Wartosc liczby staloprzecinkowej');
writeln('w systemie pozycyjnym o podstawie p');
writeln('-----------------------------------');
writeln('(C)2005 mgr Jerzy Walaszek');
writeln;
write('Podaj p (2..10) = '); readln(p);
writeln;
write('Podaj liczbe L = '); readln(s);
writeln;
L := 0;
u := false;
w := p;
for i := 1 to length(s) do
begin
if s[i] = ',' then
u := true
else
begin
c := ord(s[i]) - ord('0');
if u then
begin
L := L + c / w;
w := w * p;
end
else L := L * p + c
end
end;
write(s,'(',p,') = ');
writeln(L:0:10,'(10)');
writeln;
writeln('Nacisnij ENTER...');
readln;
end.
|
Basic' Liczby stałoprzecinkowe
' w systemie pozycyjnym
' o podstawie od 2 do 10
'---------------------------
' (C)2005 mgr Jerzy Wałaszek
' I Liceum Ogólnokształcące
' w Tarnowie
'---------------------------
Dim As String s
Dim As Uinteger c, i, w, p
Dim As Double L
Dim As Boolean u
Print "Wartosc liczby staloprzecinkowej"
Print "w systemie pozycyjnym o podstawie p"
Print "-----------------------------------"
Print "(C)2005 mgr Jerzy Walaszek"
Print
Input "Podaj p (2..10) = ", p
Print
Line Input "Podaj liczbe L = ", s
Print
L = 0
w = p
u = False
For i = 1 To Len(s)
If Asc(s, i) = Asc(",") Then
u = True
Else
c = Asc(s, i) - 48
If u = True Then
L += c / w
w *= p
Else
L = L * p + c
End If
End If
Next
Print s;"(";p;") = ";L;"(10)"
Print
Print "Nacisnij klawisz..."
Sleep
End
|
Python
(dodatek)# Liczby stałoprzecinkowe
# w systemie pozycyjnym
# o podstawie od 2 do 10
#---------------------------
# (C)2026 mgr Jerzy Wałaszek
# I Liceum Ogólnokształcące
# w Tarnowie
#---------------------------
print("Wartość liczby stałoprzecinkowej")
print("w systemie pozycyjnym o podstawie p")
print("-----------------------------------")
print("(C)2026 mgr Jerzy Wałaszek")
print()
p = int(input("Podaj p (2..10) = "))
print()
s = input("Podaj liczbe L = ")
print()
L, w, u = 0, p, False
for i in s:
if i == ",":
u = True
else:
c = ord(i) - ord("0")
if u:
L += c / w
w *= p
else:
L = L * p + c
print(s,"(",p,") = ",L,"(10)",sep="")
print()
input("Naciśnij klawisz...")
|
| Wynik: |
| Wartość liczby
stałoprzecinkowej w systemie pozycyjnym o podstawie p ----------------------------------- (C)2026 mgr Jerzy Wałaszek Podaj p (2..10) = 8 Podaj liczbe L = 77,777 77,777(8) = 63.998046875(10) Naciśnij klawisz... |
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>Wartość liczby
stałoprzecinkowej<br/>
w systemie pozycyjnym
o podstawie p</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">
Podstawa (2...10) =
</td>
<td>
<input
value="8"
name="inp_p"
size="15"
style="text-align:
right;">
</td>
</tr>
<tr>
<td align="right">
Liczba =
</td>
<td>
<input
value="77,777"
name="inp_l"
size="15"
style="text-align:
right;">
</td>
</tr>
</table>
</div>
<hr>
<input
onclick="main();"
value="Oblicz wartość"
name="B1"
type="button">
<hr>
<b>Wynik:</b>
<div id="out">.</div>
</form>
</td>
</tr>
</table>
</div>
<script language="javascript">
// obliczanie wartości
// liczby stałoprzecinkowej
// zapisanej w systemie
// pozycyjnym o podstawie
// równej od 2 do 10
//---------------------------
// (C)2005 mgr Jerzy Wałaszek
// I Liceum Ogólnokształcące
// w Tarnowie
//---------------------------
function main()
{
var s,c,i,L,p,t,u,w;
p = parseInt(document
.frm.inp_p.value);
s = document.frm.inp_l
.value;
if(isNaN(p) || (s==""))
t = "<span style='color: " +
"Red'><b>Złe dane</b>" +
"</span>";
else
{
L = 0.0;
w = p;
u = false;
for(i = 0; i < s.length; i++)
{
if(s.charAt(i) == ',')
u = true;
else
{
c = s.charCodeAt(i) - 48;
if(u)
{
L += c / w;
w *= p;
}
else
L = L * p + c;
}
}
t = s + "<sub>(" + p +
")</sub>= " + L +
"<sub>(10)</sub>";
};
document.getElementById("out")
.innerHTML = t;
}
</script>
</body>
</html> |
Oblicz wartości podanych poniżej liczb stałoprzecinkowych. Wyniki podaj w postaci ułamkowej, np: 5 3/25 (pomiędzy częścią całkowitą a ułamkiem należy wstawić dokładnie jedną spację). Ułamek należy sprowadzić do ułamka właściwego, np. zamiast 2 4/8 wpisujemy 2 1/2.
Wyprowadź wzór na największą wartość liczby stałoprzecinkowej L zapisanej w systemie pozycyjnym o podstawie p i posiadającej n cyfr całkowitych oraz m cyfr ułamkowych.
Zobacz dalej...
Wartość liczby pozycyjnej | Schemat Hornera | Przeliczenia na inny zapis pozycyjny | Przeliczanie na zapis stałoprzecinkowy | 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.