Typ stałopozycyjny – typ danych reprezentujący w określonym języku programowania, liczbę wymierną o ustalonym mianowniku. Dane stałopozycyjne składają się z części całkowitej i ewentualnie z części ułamkowej. Liczby stałopozycyjne posiadają określoną precyzję. Wartości stałopozycyjne reprezentowane są w kodzie źródłowym za pomocą literałów stałopozycyjnych[1].
Deklarując daną określonego typu stałopozycyjnego, należy określić dwie wartości, umożliwiające właściwą interpretację danej i ustalenie położenia znaku dziesiętnego rozdzielającego część całkowitą od ułamkowej. Stosowane mogą być następujące rozwiązania:
- liczba cyfr lub rozmiar całej danej stałopozycyjnej, oraz części ułamkowej,
- liczba cyfr lub rozmiar części całkowitej, oraz części ułamkowej.
W wariancie pierwszym nie podaje się wprost liczby cyfr lub rozmiaru przeznaczonego do pamiętania części całkowitej, lecz wynika ona z różnicy pomiędzy wielkością określoną dla całej danej a wielkością określoną dla części ułamkowej. Takie rozwiązanie stosowane jest między innymi w języku PL/I, w którym deklaracja danej stałopozycyjnej ma postać[2][3]
FIXED <[DEC] | BIN>(c,u)
gdzie:
- c – liczba cyfr całej danej (a więc części całkowitej i ułamkowej),
- u – liczba cyfr przypadających na część ułamkową, w szczególności może to być wartość zero,
- DEC – liczby dziesiętne, przyjmowane domyślnie,
- BIN – liczby binarne.
W różnych systemach komputerowych, mogą być stosowane różne reprezentacje liczb, tzn. może być stosowany różny sposób ich pamiętania. W PL/1 stosowano rozwiązanie oparte na spakowanym kodzie BCD, w którym rozmiar pamięci zajmowanej przez daną typu stałopozycyjnego można obliczyć ze wzoru:
- do wartości c dodać należy 1 na znak liczby +/−,
- ponieważ jeden znak zajmuje pół słowa (dla maszyn o bajtowym słowie), to należy dla c+1 nieparzystego dodać bajt w którym jedno półsłowo pozostaje niewykorzystane.
Taka reprezentacja liczb stałopozycyjnych, bez odniesienia do deklaracji, w żaden sposób nie zapewnia możliwości właściwej interpretacji danej wprost z jej zapisu w pamięci, gdyż nieznane jest położenie znaku rozdzielającego część całkowitą i ułamkową, które wynika tylko z deklaracji. Nie ma tego problemu dla literałów, odpowiedni atrybut wynika wprost z zapisu literału. Dla danych stałopozycyjnych o części ułamkowej równej zero, przyjmuje się interpretację jak dla liczb typu całkowitego, np. w PL/1 nie ma odrębnego typu całkowitego, a dane całkowite reprezentowane są przez dane stałopozycyjne, zadeklarowane następująco:
FIXED <[DEC] | BIN>(c,0)
W języku PL/1 wprowadzono jeszcze jedną konstrukcję, w której u (liczba cyfr ułamkowych), możne przyjmować wartość ujemną w deklaracji. W tym przypadku przyjmuje się, że jest to dana stałopozycyjna z zerową liczbą cyfr ułamkowych (utożsamiana z daną całkowitą), ale z odpowiednią ilością nie reprezentowanych zer (tzn. z zerami nie zapisanymi w obszarze danej zapisanej w pamięci), lecz „dodawanymi” (dołączanymi) na końcu zapisu domyślnie przez implementację języka na podstawie deklaracji. Przykład:
DCL A FIXED DEC(4,-3) INIT(-10000);
W pamięci, w obszarze zmiennej A, będą przechowywane cyfry „010-”, a trzy zera końcowe wartości nadanej w inicjalizacji zmiennej będą wynikać jedynie z atrybutów zmiennej A, przypisanych w deklaracji.
W języku Cobol dane stałopozycyjne opisywane są odpowiednimi formatami w deklaracji frazą PICTURE[4], np.
PICTURE 999V99
umożliwiającą zapis liczb stałopozycyjnych o maksymalnej długości części całkowitej 3 cyfr i maksymalnej długości części ułamkowej 2 cyfr.
Typy stałopozycyjne stosowane były w takich językach jak m.in.[5]
Pewnym rodzajem typu stałopozycyjnego, o z góry narzuconej przez implementację strukturze – precyzji – jest typ Currency
, dostępny w Delphi[6].
Zobacz też
Przypisy
- ↑ Michael Marcotty, Henry Ledgord, W kręgu języków programowania, tłumaczenie: Krystyna Jerzykiewicz, Wydawnictwa Naukowo-Techniczne, Warszawa 1980, Seria: Biblioteka Inżynierii Oprogramowania, ISBN 83-204-1342-7.
- ↑ Jan Bielecki, Rozszerzony PL/I i JCL w systemie OS/RIAD, Państwowe Wydawnictwo Naukowe, Warszawa 1986, Seria: Biblioteka Informatyki, ISBN 83-01-06146-4.
- ↑ Programowanie w języku PL/1 OS JS, M.I. Auguston, Anna Ignatowicz (tłum.), Warszawa: Państwowe Wydawnictwo Naukowe, 1988, ISBN 83-01-07463-9, OCLC 749883472 .
- ↑ Eugeniusz Kurzydrem, Andrzej Macieliński, Urszula Szmidt, Eugeniusz Więcek, COBOL. Język programowania., Państwowe Wydawnictwo Ekonomiczne, Warszawa 1978, wydanie drugie.
- ↑ John E. Nicholls, Struktura języków programowania, Wydawnictwa Naukowo-Techniczne, Warszawa 1980, Seria: Informatyka, ISBN 83-204-0246-8.
- ↑ Delphi na Wikibooks.