Program bc jest zdefiniowanym przez standard POSIX kalkulatorem o składni podobnej do tej z języka C. Można w nim (między innymi) w łatwy sposób konwertować wartości pomiędzy różnymi radiksami:
obase=2
ibase=16
F43.12E
111101000011.0001001010
Uwaga, jeśli zmienimy ibase (input base) to wszystkie wpisywane liczby będą interpretowane w tym radiksie. Oto przykład:
ibase=2
obase=10
1001
1001
(10_2 == 2_{10}). Cyfry heksadecymalne muszą być wielkimi literami (małe litery to zmienne).
radix 2 | radix 10 | radix 16 |
10'1111.0(1001) | 47.3 | 2F.4(C) |
1111'0011'1110'0100'.0101'0001 | 62436.62890625 | F3E4.A1 |
10'0110.1011 | 38.6875 | 26.B |
Zadanie sprowadza się do tego: skończona suma wyrażeń postaci 2^{-n} ma skończone rozwinięcie dziesiętne.
Suma takich wyrażeń da się zapisać jako ułamek o podstawie będącej potęgą dwójki: 2^m.
Ułamki postaci l/(10^k) mają skończone rozwinięcie dziesiętne.
Przemnóżmy przeto licznik i mianownik naszej sumy przez 5^m.
Matematycznie:
Część całkowita zawsze wyraża się skończoną liczbą cyfr. Rozważmy część ułamkową.
0.a_1a_2a_3a_4…a_n = \sum_{i=1}^n2^{-i}a_i = \sum_{i=1}^n2^{-i}5^{-i}5^ia_i = \sum_{i=1}^n10^{-i} 5^i a_i = \sum_{i=1}^n \frac{5^i a_i}{10^i}
Suma liczb, które w mianowniku mają potęgę 10 ma oczywiście skończone rozwinięcie dziesiętne. To zadanie wyjaśnia również, dlaczego ujemne potęgi dwójki wyglądają jak potęgi piątki (0.5, 0.25, 0.125…)
Trzy najmniejsze wartości:
000'00000 = 2^{-3} * 1 = 0.125
000'00001 = 2^{-3} * (1+1/32) = 0.12890625
000'00010 = 2^{-3} * (1+1/16) = 0.1328125
Trzy największe wartości:
111'11111 = 2^{4} * 1.96875 = 31.5
111'11110 = 2^{4} * 1.93750 = 31
111'11101 = 2^{4} * 1.90625 = 30.5
31.5/31 = 1.01612903225806451612
0.12890625/0.125 = 1.03125
2^8 = 256
1.2 = 011'00110
5.75 = 101'01110
011'00110 + 101'01110 = 101'10111
liczba | znak | wykladnik | mantysa |
0.5 | 0 | 126 (-1) | (1)0 |
-17 | 1 | 127 (0) | (1)0001 |
-1/32 | 1 | 122 (-5) | (1)0 |
384 | 0 | 134 (7) | (1)1 |
A'/A = 0,2228/0,22288 ~ 0,999641
B'/B = 0,2221/0,22211 ~ 0,999954
(A' - B')/(A-B) = (0,2228 - 0,2221)/(0,22288 - 0,22211) = 0,0007/0,00077 = 0,90909090…
1'0111111'01110000'00000000'00000000_{IBM} = - 16^{63-64} * 0.7_{16} = - 16^{-1} * 7/16 = -7/256
14.3 = E.4CCCC…_{16} = 1110.010011001100110011_{2} = 16^1 * 0.11100100110011001100110_{2} = 0'0000001'11100100'11001100'11001100_{IBM}
0'1111111'11111111'11111111'11111111_{IBM} = 16^{127-64} * FFFFFF_{16} = 16^63 * 16777215 = 121416798527102489600204155203283368622156186611384678475703023142582517330754928640
Mantysa najmniejszej liczby będzie się zaczynała od 001 zamiast 0001.
Najwyższa potęga będzie 8^63 a nie 16^63.
16^{63} * FFFFFF_{16} = 121416805764108066932466369176469931665150427440758720078238275608681517825325531136.
8^{63} *77777777_{8} = 13164036458569648337239753460458804039861886925068638906788872192.