{"id":10032,"date":"2018-12-25T00:00:13","date_gmt":"2018-12-24T23:00:13","guid":{"rendered":"http:\/\/marciszewski.eu\/?p=10032"},"modified":"2025-09-23T03:10:26","modified_gmt":"2025-09-23T01:10:26","slug":"o-nieistnieniu-liczb-w-informatyce","status":"publish","type":"post","link":"https:\/\/marciszewski.eu\/?p=10032","title":{"rendered":"O nieistnieniu liczb w informatyce"},"content":{"rendered":"\r\n<div class=\"is-layout-flow wp-block-quote-is-layout-flow\" style=\"margin-left:15%; margin-right:0px; font-family: sans-serif; font-style: italic; color:#400000;\">\r\n<p>Trurl i Klapaucjusz byli uczniami wielkiego Kerebrona Emtadraty, kt\u00f3ry w Wy\u017cszej Szkole Neantycznej wyk\u0142ada\u0142 przez czterdzie\u015bci siedem lat Og\u00f3ln\u0105 Teori\u0119 Smok\u00f3w. Jak wiadomo, smok\u00f3w nie ma. Prymitywna ta konstatacja wystarczy mo\u017ce umys\u0142owi prostackiemu, ale nie nauce, poniewa\u017c Wy\u017csza Szko\u0142a Neantyczna tym, co istnieje, wcale si\u0119 nie zajmuje; banalno\u015b\u0107 istnienia zosta\u0142a ju\u017c udowodniona zbyt dawno, by warto jej po\u015bwi\u0119ca\u0107 cho\u0107by jedno jeszcze s\u0142owo. Tak tedy genialny Kerebron, zaatakowawszy problem metodami \u015bcis\u0142ymi, wykry\u0142 trzy rodzaje smok\u00f3w: zerowe, urojone i ujemne. Wszystkie one, jak si\u0119 rzek\u0142o, nie istniej\u0105, ale ka\u017cdy rodzaj w zupe\u0142nie inny spos\u00f3b.<\/p>\r\n<\/div>\r\n\r\n\r\n\r\n<p>To b\u0119dzie oczywi\u015bcie polemika z poprzednim tekstem Paw\u0142a Stacewicza: liczby w informatyce potrafi\u0105 nie istnie\u0107 na wiele sposob\u00f3w, w czym s\u0105 bardzo podobne smokom.<\/p>\r\n\r\n\r\n\r\n<p>Ale zacznijmy od matematyki. Tutaj oczywi\u015bcie liczby istniej\u0105, cho\u0107 nie jest to istnienie samoistne. Matematyk potrafi d\u0142ugo i z uciech\u0105 opowiada\u0107 o ciekawych w\u0142asno\u015bciach liczb rzeczywistych (wszystkich, lub o ka\u017cdej z osobna), ale gdy to robi, to przynajmniej w duchu zak\u0142ada nie tylko istnienie samych liczb, ale r\u00f3wnie\u017c istnienie <strong>cia\u0142a liczb rzeczywistych<\/strong>. Teoria cia\u0142 nadaje sens istnienia poj\u0119ciom takim jak liczby rzeczywiste, wymierne czy zespolone. \u0141\u0105cz\u0105c je z poj\u0119ciem operacji, jakie na tych liczbach mo\u017cna wykona\u0107 bez potrzeby powo\u0142ywania do \u017cycia nowych byt\u00f3w, kt\u00f3rymi b\u0119d\u0105 wyniki owych operacji. Je\u015bli kto\u015b w tym miejscu pomy\u015bla\u0142 o programowaniu obiektowym i jego paradygmatach, to znaczy, \u017ce ma dobre skojarzenia. Tak, pomys\u0142 traktowania dzia\u0142a\u0144 jako \u201eczynno\u015bci wewn\u0119trznych\u201d stosowany jest w matematyce, jak i w j\u0119zykach programowania (poza tym jest chlebem powszednim dla monad Leibniza).<\/p>\r\n\r\n\r\n\r\n<p>W komputerach dane istniej\u0105 pod postaci\u0105 <em>zmiennych<\/em>, czyli wyznaczonych miejsc w pami\u0119ci. \u017beby uzna\u0107 istnienie liczb, musimy mie\u0107 <em>zmienne typu liczbowego<\/em> gotowe do ich przechowywania. Wczesne j\u0119zyki programowania (Algol) maj\u0105 pierwotne typy: <em>integer<\/em> i <em>real<\/em> (ca\u0142kowite i rzeczywiste). Czytelnik powinien tu zauwa\u017cy\u0107, \u017ce o nieistnieniu liczb rzeczywistych od dawna dobrze wiemy \u2013 do tego potrzebny by by\u0142 komputer analogowy. Racja. Nie wiem co przy\u015bwieca\u0142o tw\u00f3rcom j\u0119zyka w takim wyborze s\u0142owa, nadmierny optymizm czy mo\u017ce zuchwa\u0142o\u015b\u0107, ale w nowszych j\u0119zykach zamiast <em>real<\/em> ju\u017c przewa\u017cnie wyst\u0119puje okre\u015blenie <em>float<\/em>. Jest to termin bardziej techniczny ni\u017c matematyczny, opisuje spos\u00f3b <strong>przybli\u017conego<\/strong> zapisu liczby w pami\u0119ci.<\/p>\r\n\r\n\r\n\r\n<p>Skoro nie liczby rzeczywiste, to mo\u017ce istniej\u0105 chocia\u017c liczby wymierne? Te\u017c nie. Przybli\u017cenie w zapisie <em>float<\/em> dotyczy ka\u017cdej liczby, nie tylko tej o niesko\u0144czonym rozwini\u0119ciu dziesi\u0119tnym. Nader cz\u0119sto jest tak, \u017ce <em>x\u00a0+\u00a0y\u00a0=\u00a0x<\/em>, r\u00f3wnie\u017c dla niezerowych warto\u015bci <em>y<\/em>.\u00a0 Z kolei dzia\u0142anie 0.1+0.1+0.1-0.3 nie daje wyniku zerowego, jak mo\u017cna si\u0119 spodziewa\u0107 (liczba 0.1 nie ma sko\u0144czonego rozwini\u0119cia w systemie binarnym). Zmienne float sprawdzaj\u0105 si\u0119 w obliczeniach in\u017cynierskich (przy rozs\u0105dnym u\u017cywaniu), w zagadnieniach rozstrzygalno\u015bci nie maj\u0105 zastosowania.<\/p>\r\n\r\n\r\n\r\n<p>A jak wygl\u0105da sprawa istnienia liczb ca\u0142kowitych (integer)? S\u0142abo. Przed Algolem wiele komputer\u00f3w mog\u0142o ich w og\u00f3le nie u\u017cywa\u0107. O tym fakcie cz\u0119sto si\u0119 zapomina, ale komputery z lat czterdziestych wcale nie operowa\u0142y na liczbach binarnych. Mia\u0142y arytmometry pos\u0142uguj\u0105ce si\u0119 notacj\u0105 BCD (Binary-Coded Decimal) \u2013 obliczenia prowadzone by\u0142y na <strong>symbolach<\/strong> odpowiadaj\u0105cych <strong>cyfrom<\/strong> dziesi\u0119tnym. Dopiero gdy zmieni\u0142 si\u0119 spos\u00f3b liczenia, zacz\u0119to na ci\u0105g bit\u00f3w zapisanych w rejestrze procesora m\u00f3wi\u0107 <em>integer<\/em>. Okre\u015blenie na wyrost. Dzisiaj i z tego te\u017c si\u0119 wycofano. Osiem bit\u00f3w zapisanych w pami\u0119ci i tworz\u0105cych bajt przewa\u017cnie okre\u015bla si\u0119 jako zmienna typu <em>char<\/em> (znak). Zmienna 16-bitowa bywa jeszcze opisywana jako <em>word<\/em> (s\u0142owo), co mia\u0142o sens przy 16-bitowych procesorach, a cz\u0119\u015bciej u\u017cywa si\u0119 s\u0142owa <em>short<\/em>. Zmienne 32- i 64-bitowe to <em>long<\/em> i <em>long long<\/em>. Nazwa \u201eInteger\u201d na nowo pojawia si\u0119 dopiero w j\u0119zykach obiektowych jako nazwa <strong>typu z\u0142o\u017conego<\/strong>, kt\u00f3ry w swoim wn\u0119trzu musi radzi\u0107 sobie z tym, \u017ce opisuje co\u015b, co nie jest liczb\u0105 w matematycznym znaczeniu.<\/p>\r\n\r\n\r\n\r\n<p>Skoro nie w informatyce stosowanej, to mo\u017ce cho\u0107 w teoretycznej jest godne miejsce dla liczb? Niestety, tu r\u00f3wnie\u017c s\u0142abo nadaj\u0105 si\u0119 one na poj\u0119cie pierwotne. A ju\u017c zw\u0142aszcza wtedy, gdy narz\u0119dziem w rozwa\u017caniach ma by\u0107 maszyna Turinga. Za\u0142\u00f3\u017cmy, \u017ce chcemy liczy\u0107 kolejne cyfry rozwini\u0119cia liczby \u03c0 bezpo\u015brednio ze wzoru na szereg Leibniza:<\/p>\r\n\r\n\r\n\r\n<span class=\"wp-katex-eq katex-display\" data-display=\"true\"> \\frac{\\pi}{4} =\\frac{1}{1}-\\frac{1}{3}+\\frac{1}{5} -\\frac{1}{7}\\cdots<\/span>\r\n\r\n\r\n\r\n<p>Najpierw musimy pokona\u0107 problem zapisu u\u0142amk\u00f3w dziesi\u0119tnych (teoretycznie mamy do dyspozycji tylko liczby ca\u0142kowite). To nie jest trudne. Ale natychmiast wyst\u0105pi problem zapisu liczby 1\/3 \u2013 ta ma niesko\u0144czone rozwini\u0119cie. C\u00f3\u017c z tego \u017ce mamy niesko\u0144czon\u0105 ta\u015bm\u0119, skoro musimy przeznaczy\u0107 niesko\u0144czony czas na zapis tak banalnej rzeczy, jak prosty u\u0142amek? Je\u015bli chcemy w og\u00f3le otrzyma\u0107 jaki\u015b wynik w sko\u0144czonym czasie, to musimy pogodzi\u0107 si\u0119 ze sko\u0144czon\u0105 dok\u0142adno\u015bci\u0105 i z g\u00f3ry okre\u015bli\u0107 ile cyfr nas zadowoli.<\/p>\r\n\r\n\r\n\r\n<p>Oczywi\u015bcie istniej\u0105 te\u017c algorytmy, dzi\u0119ki kt\u00f3rym komputery potrafi\u0105 szybko znajdowa\u0107 kolejne cyfry rozwini\u0119cia (znamy ju\u017c ponad 10<sup>13 <\/sup>cyfr). Algorytmy te operuj\u0105 nie na liczbach jako takich, tylko na liczbach w konkretnym systemie pozycyjnym. Inaczej m\u00f3wi\u0105c, algorytmu stworzony do liczenia w systemie szesnastkowym (cz\u0119sto u\u017cywany w informatyce) nie da si\u0119 zaadaptowa\u0107 do liczb w systemie dziesi\u0119tnym. I odwrotnie. W operacjach istotna jest nie tylko sama warto\u015b\u0107 liczbowa, a symbole (cyfry) tworz\u0105ce jej zapis. Dla bli\u017cej zainteresowanych opis <a href=\"https:\/\/en.wikipedia.org\/wiki\/Chudnovsky_algorithm\">algorytmu Czudnowskiego<\/a>, najszybszego w chwili obecnej.<\/p>\r\n<p>Gdy ni\u017cej podpisany uruchomi\u0142 podany na stronie Wiki kod pythona, ze zdziwieniem (i satysfakcj\u0105) stwierdzi\u0142 \u017ce cyferki wyskakuj\u0105 z niego z pr\u0119dko\u015bci\u0105 <strong>kilkadziesi\u0105t razy wi\u0119ksz\u0105<\/strong>, ni\u017c ze znanego w Uniksach od dziesi\u0119cioleci j\u0119zyka bc s\u0142u\u017c\u0105cego do oblicze\u0144 arbitralnej precyzji, a do trygonometrii u\u017cywaj\u0105cego algorytm\u00f3w pokrewnych leibnizia\u0144skiemu. Zwi\u0119z\u0142o\u015b\u0107 algorytmu te\u017c powinna dziwi\u0107 &#8212; to tylko kilkana\u015bcie linijek kodu z bardzo dziwnymi d\u0142ugimi liczbami. \u015apiesz\u0119 wi\u0119c z wyja\u015bnieniem, \u017ce moc tkwi w przywo\u0142anej w pierwszym wierszu bibliotece Decimal. Ta ma przesz\u0142o sze\u015b\u0107 tysi\u0119cy wierszy i jest kunsztown\u0105 realizacj\u0105 arytmetyki, ca\u0142kowicie oderwan\u0105 od maszynowej reprezentacji liczb.<\/p>\r\n<p>Tak oto dotarli\u015bmy do fina\u0142u, w kt\u00f3rym mo\u017cemy stwierdzi\u0107: liczby w podstawach informatyki nie istniej\u0105, lecz bardzo \u0142atwo powo\u0142a\u0107 je do \u017cycia w takiej formie, \u017ce rozwi\u0105zywaniu problem\u00f3w s\u0142u\u017c\u0105 lepiej, ni\u017c liczby &#8222;matematyczne&#8221;<\/p>\r\n<p style=\"text-align: center; size:300%;\">&#10052; &nbsp; &#10052; &nbsp; &#10052;<\/p>\r\n<p>Tekst ten napisany zosta\u0142 w niedziel\u0119 23 grudnia, po wyczerpaniu &#8222;polemicznych mo\u017cliwo\u015bci&#8221; pod tekstem Paw\u0142a Stacewicza. Jednak publikacj\u0119 zlecam dopiero na wigilijn\u0105 p\u00f3\u0142noc, by nie m\u0105ci\u0107 nikomu tradycyjnego spokoju dnia Wigilii. Korzystaj\u0105c z okazji sk\u0142adam wszystkim \u017cyczenia pogody: ducha, cia\u0142a i aury. Oraz zach\u0119cam do polemiki &#8212; szczeg\u00f3lnie tych, kt\u00f3rzy maj\u0105 zdanie ca\u0142kowicie odmienne od mojego.<\/p>\r\n","protected":false},"excerpt":{"rendered":"<p>Trurl i Klapaucjusz byli uczniami wielkiego Kerebrona Emtadraty, kt\u00f3ry w Wy\u017cszej Szkole Neantycznej wyk\u0142ada\u0142 przez czterdzie\u015bci siedem lat Og\u00f3ln\u0105 Teori\u0119 Smok\u00f3w. Jak wiadomo, smok\u00f3w nie ma. Prymitywna ta konstatacja wystarczy mo\u017ce umys\u0142owi prostackiemu, ale nie nauce, poniewa\u017c Wy\u017csza Szko\u0142a Neantyczna &hellip; <a href=\"https:\/\/marciszewski.eu\/?p=10032\">Czytaj dalej <span class=\"meta-nav\">&rarr;<\/span><\/a><\/p>\n","protected":false},"author":10,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[20,50],"tags":[],"class_list":["post-10032","post","type-post","status-publish","format-standard","hentry","category-filozofia-informatyki","category-logika"],"_links":{"self":[{"href":"https:\/\/marciszewski.eu\/index.php?rest_route=\/wp\/v2\/posts\/10032","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/marciszewski.eu\/index.php?rest_route=\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/marciszewski.eu\/index.php?rest_route=\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/marciszewski.eu\/index.php?rest_route=\/wp\/v2\/users\/10"}],"replies":[{"embeddable":true,"href":"https:\/\/marciszewski.eu\/index.php?rest_route=%2Fwp%2Fv2%2Fcomments&post=10032"}],"version-history":[{"count":24,"href":"https:\/\/marciszewski.eu\/index.php?rest_route=\/wp\/v2\/posts\/10032\/revisions"}],"predecessor-version":[{"id":12565,"href":"https:\/\/marciszewski.eu\/index.php?rest_route=\/wp\/v2\/posts\/10032\/revisions\/12565"}],"wp:attachment":[{"href":"https:\/\/marciszewski.eu\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=10032"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/marciszewski.eu\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=10032"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/marciszewski.eu\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=10032"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}