Aksjomat i punkt, który się porusza
Punkt się przesunął, umowa nie
Arytmetyka stałoprzecinkowa jest atrakcyjna, bo jest uczciwa. Wybierasz skalę, mówisz, gdzie mieszka punkt, a maszyna przestaje udawać, że każda liczba to drobna prognoza pogody. Dzięki temu odtwarzanie jest spokojniejsze, cele wbudowane łatwiejsze do przeanalizowania, a audyty mniej zależne od zwrotów w stylu „mniej więcej”. Cudownie. I niekompletnie.
Jedna stała skala może być zbyt tępa. Wybierz skalę obsługującą bardzo małe wartości, a większe wartości zabraknie miejsca. Wybierz skalę obsługującą większe wartości, a małe stracą użyteczne szczegóły. Możesz rozdzielić pracę na kilka typów, ale wtedy kod zyska inny rodzaj bałaganu. Gratulacje, przecinek dziesiętny stał się problemem kadrowym.
AXIOM istnieje dla przypadków, w których punkt musi się przesunąć bez zamieniania warstwy liczbowej z powrotem w zupę zmiennoprzecinkową. W kodzie Dweve jest to adaptacyjna rodzina zmiennoprzecinkowa: każda konkretna wartość niesie znak, indeks listy wykładników i mantysę w upakowanej reprezentacji 32-bitowej. Wykładnik nie jest przypadkowym nastrojem sprzętu. Jest wybierany z jawnej listy. Mantysa to całkowitoliczbowy ładunek. Reprezentowana wartość to znak razy mantysa razy dwa do potęgi minus wybrany wykładnik. To zdanie nie jest urocze, ale to cały trik.
Ważne nie jest to, że punkt się przesuwa. Zmiennoprzecinkowy już przesuwa punkt. Ważne jest to, że AXIOM przesuwa go przez zadeklarowaną listę, którą można przeglądać, testować, specjalizować i utrzymywać deterministyczną. Kod nie prosi platformy o improwizowanie numerycznej osobowości. Daje wartości zwartą umowę i sprawia, że arytmetyka wraca do tej umowy po każdej operacji.
W źródle konkretny kształt to Axiom<M, E>. Szerokość mantysy musi pasować do reprezentacji, z praktycznymi aliasami takimi jak Adp4, Adp8, Adp16, Adp23, AdpNN4 i AdpNN8. Te nazwy nie są ozdobnikami. Mówią, ile ładunku i jaki profil wykładników ma używać wartość. Wartość z listą wykładników w kształcie NN to nie ta sama obietnica co wartość z szerszą listą ogólną. Traktowanie ich jako takich samych, bo obie wyglądają liczbowo, to sposób, w jaki poważne bazy kodu zaczynają gromadzić folklor.
Zmienny punkt to nie klimat
Fraza adaptacyjny zmienny punkt może brzmieć, jakby ktoś przemianował zmiennoprzecinkowy, żeby przeforsować zakup na spotkaniu. To nie to się dzieje. AXIOM nie czyni wykładnika niewidocznym efektem ubocznym. Wykładnik jest wybierany z listy dołączonej do typu lub strategii. W obecnym źródle konkretne listy wykładników obejmują standardową [16, 8, 4, 0], gęstą [12, 8, 4, 0], wag sieci neuronowych [8, 6, 4, 0] oraz drobną listę [16, 14, 12, 10, 8, 6, 4, 0]. To są obecne wartości źródłowe i to rozróżnienie ma znaczenie, bo źródło zmieniało się z czasem; bieżące twierdzenia powinny podążać za bieżącym kodem, a nie za nieaktualnymi listami wykładników.
Lista to decyzja produktowa. Standardowa lista daje kilka szerokich pasm. Gęsta lista zmienia położenie pasm. Lista NN jest ukształtowana pod dane podobne do wag. Drobna lista oferuje więcej bliskich wyborów. Żadne z tego nie usuwa osądu. Przenosi osąd w miejsce, gdzie przegląd kodu może go zobaczyć.
To jest różnica między kontrolowaną reprezentacją adaptacyjną a ogólną wymówką. Typ stałoprzecinkowy mówi, że każda wartość tutaj używa tej skali. AXIOM mówi, że każda wartość tutaj wybiera z tego zadeklarowanego zestawu skal. To szerszy kontrakt, a nie brakujący. Punkt się przesuwa, ale porusza się po szynach. Bardzo holenderskie, naprawdę. Nawet przecinek dziesiętny ma infrastrukturę.
Warto być precyzyjnym co do tego, czym AXIOM nie jest. To nie jest dokładna arytmetyka wymierna. To nie jest licencja na ignorowanie analizy zakresów. To nie jest twierdzenie benchmarkowe. To nie jest gwarancja, że wybrana lista wykładników pasuje do twojego obciążenia, tylko dlatego, że akronim brzmiał energicznie. Nadal musisz rozumieć wartości, zakres dynamiczny, akceptowalny błąd, cel wdrożenia i wymagania dotyczące odtwarzania. AXIOM czyni te wybory bardziej podatnymi na inspekcję. Nie sprawia, że znikają. Jeśli już, to utrudnia ukrywanie leniwego myślenia numerycznego, co zwykle jest momentem, w którym zaczynają się krzyki.
Arytmetyka musi wrócić do domu
Format liczbowy łatwo narysować, a trudniej uczynić użytecznym. Użyteczna część to arytmetyka. Dodawanie i odejmowanie muszą radzić sobie z wartościami, które mogą znajdować się na różnych pasmach wykładników. Mnożenie i dzielenie muszą wykonać szerszą pracę na całkowitoliczbowej mantysie, zanim wynik wróci do docelowego kształtu. Po operacji wartość musi zostać znormalizowana z powrotem do dostępnego wyboru wykładnika. Ten ostatni krok ma znaczenie, ponieważ reprezentacja, która nie może wrócić do domu, to tylko wakacje za granicą z lepszym brandingiem.
Arytmetyka AXIOM ma zatem swój rytm. Wprowadź spakowane wartości. Wyrównaj lub poszerz w razie potrzeby. Wykonaj operację zorientowaną na liczby całkowite. Normalizuj. Zapisz wynik z powrotem w zadeklarowanym kształcie. Jeśli się nie mieści, powinno to być widoczne jako problem reprezentacji, a nie po cichu zrzucone na nastrój maszyny. Kontrakt jest użyteczny, ponieważ ma krawędzie.
To ten sam powód, dla którego Numerus ma znaczenie wokół tego. Szerszy stos nie próbuje kolekcjonować formatów liczbowych jak znaczków. Chce arytmetyki, która przetrwa odtwarzanie, wdrożenia wbudowane, symulację, kompresję modeli, testy i ścieżki audytu. AXIOM to jedna rodzina w tej historii. Rozwiązuje konkretny problem: wartości, których użyteczna skala się zmienia, ale których zachowanie nadal musi być deterministyczne.
To jest nudne zdanie, które później ratuje zespoły: normalizuj z powrotem do kształtu. Brzmi jak szczegół implementacyjny, dopóki odtwarzanie się nie różni, próg się nie odwraca albo skompresowany model nie zachowuje się inaczej na mniejszym celu. Wtedy staje się zdaniem, które wszyscy chcieliby znaleźć w dokumencie architektury.
Dlaczego AXIOM leży pod Numerus
Publiczna historia Numerus jest celowo prostsza niż drzewo źródłowe. Większość czytelników chce wiedzieć, czy warstwa numeryczna może zapewnić deterministyczną arytmetykę, rodziny stałoprzecinkowe, zachowanie dziesiętne, postawę no_std, profile wbudowane zorientowane na liczby całkowite, weryfikację i tę samą odpowiedź dwa razy. Nie potrzebują każdego wewnętrznego typu na pierwszej stronie. To nie jest tajemnica. To jest miłosierdzie.
Pod spodem wspólna warstwa numeryczna jest szersza. Niesie typy całkowite binarne, trójkowe, natywne i subbajtowe, aliasy stałoprzecinkowe, typy zmiennoprzecinkowe do prac zgodnościowych oraz adaptacyjny AXIOM. Wspólne cechy dają tym rodzinom jednolitą powierzchnię. Numerus opakowuje następnie elementy przeznaczone dla użytkownika końcowego: binarny i dziesiętny stały przecinek, AXIOM, liczby całkowite, operacje, powierzchnie DSL i postawę weryfikacyjną. To rozdzielenie jest zdrowe. Fundament może być szeroki bez sprawiania, że strona publiczna wygląda jak menu z restauracji, która straciła pewność siebie.
AXIOM zasługuje na własny artykuł, bo nie jest tylko kolejną pozycją na tej liście. Stały przecinek polega na umieszczeniu przecinka w jednym miejscu. Dziesiętny stały przecinek dotyczy dokładnych miejsc dziesiętnych. Formy binarne i trójkowe dotyczą zwartych ścieżek o małej liczbie bitów. AXIOM polega na uczynieniu przecinka kontrolowaną częścią wartości. To zmienia sposób myślenia o reprezentacji, arytmetyce, testach i wdrożeniu.
Zmienia też sposób formułowania publicznych deklaracji. Wydajność AXIOM należy do bieżących benchmarków na bieżącym kodzie, a nie do odziedziczonych przekazów. Szerszego stosu nie należy opisywać jako zerowej liczby operacji zmiennoprzecinkowych, bo powierzchnie konwersji i wyświetlania mogą przekraczać tę granicę. Bezpieczniejsze i dokładniejsze stwierdzenie brzmi: rdzeń arytmetyki stałej i adaptacyjnej jest zorientowany na liczby całkowite i zaprojektowany pod deterministyczne zachowanie. To zdanie jest mniej efektowne. Dobrze. Efektowne deklaracje numeryczne to sposób, w jaki pulpity nawigacyjne stają się generatorami przeprosin.
Kilka ścieżek obliczeniowych, jedna rodzina
Konkretna spakowana wartość to dopiero początek. Źródło zawiera więcej niż jeden sposób użycia AXIOM, bo obciążenia nie są na tyle grzeczne, by na zawsze pasować do jednego układu. Istnieje spakowana ścieżka konkretna dla list wykładników znanych w czasie kompilacji. Istnieje Flex<S> dla przechowywania wykładników w czasie działania na całkowitych rozmiarach pamięci. Istnieją formy tensorowe i blokowe, w których wspólna struktura wykładników może być przydatna. Istnieje przetwarzanie warstwowe. Istnieje APoT, gdzie wartości można przedstawiać jako sumy znakowanych potęg dwójki, dzięki czemu mnożenie może stać się przesunięciami i dodawaniami. Wokół tego istnieje kod badawczy profilowania i uczenia wykładników.
To rozproszenie nie jest powodem do przesadnych deklaracji. Jest powodem, by ostrożnie podchodzić do obciążenia. Ścieżka odtwarzania skalarnego, ścieżka kwantyzacji wsadowej, ścieżka podobna do tensorowej i ścieżka wag APoT podlegają różnym naciskom. Układ pamięci, ponowne użycie wykładników, zakres, normalizacja i kształt sprzętu mają znaczenie. AXIOM daje słownictwo dla tych wyborów. Nie zwalnia nikogo z ich dokonywania.
W tym miejscu inżynieria staje się interesująca. APoT to nie tylko urocza sztuczka kompresyjna. Dla odpowiednich wartości zamienia mnożenie w problem przesunięć i dodawań. Ścieżki tensorowe i blokowe mogą dzielić strukturę wykładników, gdy obciążenie ma wystarczający kształt. Flex utrzymuje dostępność przechowywania wykładników w czasie działania, gdy listy na poziomie typów są zbyt sztywne. Żadnej z tych opcji nie należy wybierać dlatego, że diagram ładnie wyglądał. Obciążenie wybiera, albo później wybierze raport o błędzie i będzie przy tym znacznie mniej uroczy.
Jak ocenić wybór AXIOM
Pierwsze pytanie w przeglądzie jest nudne, a przez to pożyteczne: dlaczego nie prostszy typ liczbowy? Jeśli wartość to pieniądze lub regulowana kwota dziesiętna, właściwą odpowiedzią może być Decimal. Jeśli zakres jest mały i dobrze ograniczony, spokojniejszy może być typ stałoprzecinkowy w formacie Q. Jeśli liczba istnieje tylko po to, by współpracować z formatem pliku lub zewnętrznym API, typ zmiennoprzecinkowy może być uczciwym adapterem na krawędzi. AXIOM ma sens, gdy obciążenie ma zmienną wielkość, wciąż potrzebuje deterministycznego kontraktu i korzysta z jawnego zestawu wykładników.
Drugie pytanie dotyczy tego, czy lista wykładników opisuje dane, czy tylko schlebia inżynierowi. Lista z czterema szerokimi pasmami to inny kompromis niż drobnoziarnista lista ośmiu wpisów. Lista w kształcie NN nie jest ozdobną etykietą. Mówi, że wartości mają zachowywać się jak dane wagowe. Jeśli rozkład nie pasuje do listy, reprezentacja i tak będzie działać. Oprogramowanie często chętnie robi złą rzecz z imponującą szybkością. To nie czyni z tego projektu.
Trzecie pytanie dotyczy tego, gdzie pojawia się presja normalizacji. Dodawanie między odległymi pasmami wykładników może tracić szczegóły. Mnożenie może dać wynik wymagający innego pasma. Powtarzane operacje mogą gromadzić presję dokładnie w miejscach, których demo nie odwiedziło. Przegląd powinien prosić o testy graniczne wokół zera, zmiany znaku, przejścia wykładników, duże mantysy i powtarzane operacje. Jeśli te przypadki wydają się irytujące, dobrze. Prawdopodobnie to właśnie one mają znaczenie.
Ostatnie pytanie dotyczy tego, jak reprezentacja pozostawia ślady. Który alias typu wybraliśmy? Którą listę wykładników? Którą szerokość mantysy? Którą ścieżkę konwersji? Który oracle lub test właściwości potwierdza to twierdzenie? Jeśli odpowiedź jest rozproszona po komentarzach i optymizmie, system już stracił część korzyści. AXIOM jest najbardziej użyteczny, gdy wybór numeryczny staje się częścią rejestru architektury, a nie sprytnym lokalnym trikiem ukrytym trzy moduły dalej.
Weryfikacja ważniejsza niż efektowne liczby
Formaty numeryczne przyciągają efektowne liczby. Mniejszy. Szybszy. Wydajniejszy. Lepszy. Te słowa są tanie i zwykle pojawiają się przed środowiskiem testowym, co jest dokładnie złą kolejnością. W przypadku AXIOM odpowiedzialna postawa to traktowanie benchmarków jako dowodów na wydanie, a nie mitologii. Jeśli benchmark nie został uruchomiony ponownie na bieżącym kodzie źródłowym, bieżącym kompilatorze, bieżących flagach i bieżącym sprzęcie, nie jest publicznym twierdzeniem. To pocztówka z poprzedniego popołudnia.
Ważniejsza jest ścieżka weryfikacji. Czy kodowanie i dekodowanie pozostaje w ramach zadeklarowanego kontraktu? Czy operacje normalizują się do prawidłowego kształtu? Czy przypadki brzegowe wokół granic wykładników zachowują się zgodnie z intencją? Czy testy właściwości obejmują irytujące wartości, o których ludzie zapominają, bo ludzie mają hobby? Czy istnieje oracle o wysokiej precyzji tam, gdzie porównanie ma sens? Czy powtórne odtworzenie może zbudować tę samą ścieżkę wartości?
To ostatnie pytanie jest powodem, dla którego to należy do naszego stosu. Dweve stale buduje systemy, w których obliczenia pozostawiają ślady: parsery z pokwitowaniami, rejestry z typowanymi zdarzeniami, wyszukiwanie z deterministycznymi ścieżkami, formaty danych, które nie ciągną wozu powtarzanych kluczy, warstwy symulacji i numeryczne, które można odtworzyć. AXIOM pasuje, bo przesunięcie punktu nie powinno oznaczać utraty pokwitowania.
Lekcja
Lekcja AXIOM nie jest taka, że stały przecinek był błędem. Stały przecinek to wciąż jedno z najczystszych narzędzi, jakie mamy. Lekcja jest taka, że jedna stała skala nie zawsze wystarcza, a alternatywa nie musi być nieprzejrzystym zachowaniem zmiennoprzecinkowym. Wartość może nieść kontrolowany wybór wykładnika. Punkt może się przesuwać, podczas gdy kontrakt pozostaje widoczny.
To jest historia warta opowiedzenia publicznie. Dweve AXIOM łączy znak, indeks wykładnika i mantysę. Wybiera z jawnych list wykładników. Wykorzystuje arytmetykę opartą na liczbach całkowitych i normalizuje wyniki z powrotem do zadeklarowanych kształtów. W kodzie ma ścieżki konkretne, elastyczne, tensorowe, blokowe, stratyfikowane, APoT i badawcze. Należy do Numerus, ponieważ deterministyczna arytmetyka nie jest pobocznym zadaniem. To część tego, jak poważne systemy uzyskują dwa razy ten sam wynik.
Punkt się przesuwa. Odpowiedzialność nie. To jest ta przydatna część.