Numerus i ta sama odpowiedź dwa razy

Liczba zmiennoprzecinkowa łatwo da się zignorować, dopóki nie zmieni testu, symulacji, powtórki ani ścieżki decyzyjnej. Numerus traktuje arytmetykę jak...

Numerus i ta sama odpowiedź dwa razy

The bug that only exists on the other machine

The most irritating numeric bug is the one that refuses to appear where you are looking. The test fails on CI, not locally. The simulation drifts after a dependency update. The embedded target produces a slightly different result from the server. The model pipeline looks fine until replay asks for the same calculation twice and receives two answers that are close enough to start an argument.

Close is sometimes fine. Close is not always a contract. If a calculation is part of a replay path, a safety check, a simulation, a pricing decision, a digital twin, an audit trail, or a model compression step, then close can turn into a product risk. The difference may be tiny. Tiny differences are still differences. Software has made entire careers out of being offended by tiny differences.

This is the reason Numerus exists in the Dweve stack. The Numerus page frames it as an open-source numeric foundation for deterministic arithmetic: binary and decimal fixed-point, Dweve AXIOM adaptive variable-point math, integer-oriented operation, Rust, no_std-capable surfaces, verification against high-precision references where meaningful, and deterministic profiles intended to make replay calmer across supported targets. The shared common numeric layer underneath is wider still: binary, ternary, integer, fixed, float, and adaptive AXIOM families under one Element-style contract. The exact implementation details matter to engineers. The product lesson is simpler: arithmetic is not background noise. It is infrastructure.

When a result enters a replay or audit path, the useful question is not whether two answers are close. It is whether the system can make the same answer twice.

That sounds obvious until you follow where numbers travel. A simulation feeds a digital twin. The twin feeds a dashboard. The dashboard informs a human decision. The decision is recorded. A month later somebody asks why. If the numeric layer cannot reproduce the calculation,the rest of the evidence chain becomes wobbly. It may still be defensible, but now the team has to explain an avoidable source of drift. That is a bad hobby.

Floating point is not morally wrong

This is not a sermon about floating point being evil.Floating point is one of the reasons modern computing works. It is fast, compact, well supported, and exactly right for many workloads. The problem starts when teams pretend its behaviour is a universal governance contract.

Floating point lives in a worldof rounding modes, hardware differences, compiler choices, instruction selection, fused operations, vectorization, denormals, library behaviour, and target-specific details. Most of the time this is manageable. Sometimes it is even invisible. Then you need bit-exact replay, or cross-target parity, or deterministic simulation, or a build that should behave the same after being moved from server to edge. Suddenly the details stop being academic. They become a meeting.

Numerus takes a different path for workloads where repeatability matters more than pretending every operation is a tiny weather system. Integer-only arithmetic makes the representation explicit. Fixed-point formats define where the decimal lives. Decimal families handle values where exact places matter. Dweve AXIOM gives a way to adapt exponent shape per value without handing control back to an opaque floating environment. The point is not one numeric form forever. The point is choosing a form with a contract.

To ma znaczenie, ponieważ systemy produktowe nie tylko obliczają. One pamiętają. Odtwarzają. Porównują. Wyjaśniają. Jeśli to samo obliczenie daje różne wyniki na różnych obsługiwanych powierzchniach, różnica staje się częścią produktu, niezależnie od tego, czy ktoś to zaplanował, czy nie.

Jedna biblioteka numeryczna to tak naprawdę kilka obietnic

Fundament numeryczny to nie jedna rzecz. To zestaw obietnic składanych różnym odbiorcom. Inżynier systemów wbudowanych dba o to, aby ograniczone platformy mogły uruchamiać odpowiednie profile zorientowane na liczby całkowite bez ciągnięcia za sobą wygodnego środowiska serwerowego. Inżynier symulacji dba o to, aby odtwarzanie mogło odtworzyć stan. Osoba odpowiedzialna za audyt dba o to, aby ścieżka odpowiedzi mogła zostać wyjaśniona. Właściciel produktu dba o to, aby rzecz nie zachowywała się jak nerwowy kalkulator po przeniesieniu z jednego środowiska do drugiego.

Publiczna strona Numerus wyróżnia rodziny, o które ludzie pytają najczęściej: format stałoprzecinkowy Q, Decimal i AXIOM. Baza kodu jest szersza. common/numeric zawiera binarne formy XNOR i POPCNT, wartości trójkowe, natywne i podbajtowe liczby całkowite, aliasy stałoprzecinkowe, małe formaty zmiennoprzecinkowe i adaptacyjny AXIOM. Fasada Numerus dodaje następnie zorientowane na produkt powierzchnie dziesiętne i arytmetyczne wokół tego fundamentu. Ten podział ma znaczenie, ponieważ pozwala uniknąć fałszywej elegancji wciskania każdej liczby w jeden kostium.

Różne obciążenia wymagają różnych kształtów liczb. Wspólna obietnica to deterministyczne zachowanie na szerszej powierzchni numerycznej, a nie jedna modna reprezentacja dla wszystkiego.

To bardzo europejski rodzaj inżynierii w najlepszym tego słowa znaczeniu. Mniej dramatu, więcej kontraktu. Obliczenie powinno powiedzieć, czym jest. Zakres powinien być znany. Zachowanie dziesiętne powinno być jawne. Ograniczenia platformy powinny być respektowane. Wynik powinien być powtarzalny. Nikt nie potrzebuje do tego keynote. Potrzebują, żeby to działało.

AXIOM zasługuje na osobny artykuł, ponieważ nie jest tylko kolejnym aliasem na liście. To adaptacyjna rodzina zmiennoprzecinkowa Dweve: znak, indeks wykładnika i mantysa upakowane w zwartą reprezentację, z listami wykładników dobieranymi do danych ogólnych, gęstych, drobnoziarnistych lub o kształcie sieci neuronowej. Ten wpis tylko umieszcza go na mapie Numerus. Głębsza historia dotyczy tego, jak adaptacyjny wybór wykładnika daje zmieniającym się rzandom wielkości więcej miejsca, nie czyniąc arytmetyki ponownie niedeterministyczną.

Zapobiega to również przesadzaniu. Numerus nie ułatwia każdego problemu numerycznego. Nie usuwa potrzeby wyboru skal, zakresów, zachowania zaokrągleń, list wykładników, szerokości mantys ani domen weryfikacji. Arytmetyka stałoprzecinkowa i zmiennoprzecinkowa mogą być nadużywane z wielkim entuzjazmem. Wartość polega na tym, że nadużycie staje się bardziej widoczne. Jawny kontrakt numeryczny daje ci coś do przejrzenia. Ukryte założenie zmiennoprzecinkowe daje ci małego ducha w produkcji.

Weryfikacja to nie odznaka

Każda biblioteka numeryczna w końcu uczy się, że słowa takie jak poprawny i precyzyjny są tanie, dopóki nie zostaną przypięte do uprzęży testowej. Poprawny gdzie? Precyzyjny w porównaniu z czym? Na jakiej domenie wejściowej? Z jakim zachowaniem zaokrągleń? W której wersji? Pod którymi testami?

Materiały Numerus wysuwają weryfikację na pierwszy plan: CORDIC tylko na liczbach całkowitych dla funkcji transcendentalnych, porównanie z wysokoprecyzyjnym wyrocznią MPFR, testy właściwości i kontrole wydań. Dokładne twierdzenie ma sens tylko w powiązaniu z tą maszynerią. Odznaka mówiąca dokładny to dekoracja. Uprząż, która porównuje, zmniejsza i zawodzi, to inżynieria.

Zaufanie do liczb powinno pochodzić ze ścieżki wyroczni i testów właściwości, a nie z wykresu, który wygląda na zadowolony z siebie.

To rozróżnienie ma znaczenie, ponieważ błędy numeryczne często czają się na krawędziach. Środek dziedziny zachowuje się poprawnie. Demo działa. Zwykłe wartości działają. A potem pojawia się wartość graniczna z teczką pod pachą. Wartości ujemne, wartości bliskie zeru, granice przepełnienia, zmiany skali, remisy w zaokrąglaniu, granice listy wykładników i powtarzane operacje to miejsca, w których biblioteki numeryczne albo zdobywają zaufanie, albo zaczynają pisać fikcję.

Testowanie właściwości jest przydatne, ponieważ ludzie nie potrafią sobie wyobrazić wszystkich sposobów, na jakie liczba potrafi być uciążliwa. Wyrocznia wysokiej precyzji jest przydatna, ponieważ implementacja potrzebuje punktu odniesienia, który nie jest nią samą. Kontrole wydania są przydatne, ponieważ zweryfikowane twierdzenie z zeszłego miesiąca nie jest gwarancją na ten miesiąc. Oprogramowanie nie pozostaje poprawne z grzeczności.

Determinizm należy do architektury, nie do przypisu

Kuszone jest traktowanie deterministycznej arytmetyki jako szczegółu niskopoziomowej biblioteki. To właśnie tam wiele zespołów ją traci. Zanim produkt potrzebuje odtwarzalności, założenia numeryczne są już rozproszone po usługach, notatnikach, platformach wbudowanych, narzędziach modelowych i testach integracyjnych. Wtedy determinizm staje się modernizacją wsteczną. Modernizacje wsteczne to miejsca, w których budżety rozwijają charakter.

Właściwy moment na podjęcie decyzji o postawie numerycznej jest wczesny. Czy to obciążenie wymaga odtwarzalności bitowej? Czy działa na wielu maszynach? Czy działa na różnych architekturach? Czy wspiera decyzję regulowaną? Czy zasila symulację? Czy staje się danymi treningowymi, danymi wejściowymi wnioskowania, wynikiem kompresji modelu lub stanem cyfrowego bliźniaka? Jeśli tak, arytmetyka jest architektoniczna.

Numerus pasuje do FMI i Twin właśnie z tego powodu. FMI dba o deterministyczne jądra symulacji i wymianę modeli. Twin dba o odtwarzanie stanu operacyjnego lub fizycznego w czasie. Ledger rejestruje zdarzenia operacyjne. Trace przenosi odtwarzalne dowody obliczeń. Te warstwy stają się spokojniejsze tylko wtedy, gdy warstwa numeryczna pod nimi nie dryfuje jak wózek sklepowy z jednym zepsutym kołem.

W systemach AI staje się to jeszcze bardziej konkretne. Kwantyzacja, punktacja, ranking, symulacja, ograniczenia, kalibracja, kompresja i odtwarzanie używają liczb. Jeśli te liczby zachowują się inaczej w różnych środowiskach, model może nie być stroną winną. Jest po prostu najbardziej widocznym podejrzanym. Wygodnie, ale nie zawsze poprawnie.

Małe maszyny nie są obywatelami drugiej kategorii

Duża część architektury AI i symulacji po cichu zakłada wygodną maszynę. Będzie serwer. Będzie GPU. Będzie wystarczająco dużo pamięci. Będzie usługa w chmurze. Będzie rachunek, który sprawi, że ktoś wymyśli frazę inwestycja strategiczna.

Prawdziwe systemy są mniej uporządkowane. Niektóre obliczenia muszą działać na platformach wbudowanych. Niektóre żyją na krawędzi. Niektóre siedzą w urządzeniach bez jednostki zmiennoprzecinkowej. Niektóre wymagają zgodności z no_std. Niektóre muszą działać, gdy sieć nie jest zaproszona. Jeśli fundament numeryczny zachowuje się tylko w wygodnym przypadku, nie jest fundamentem. Jest meblem.

Ten sam kontrakt numeryczny musi przetrwać ograniczenia wdrożeniowe, nie tylko laptop programisty, na którym wszystko jest hojne i ciepłe.

Arytmetyka oparta na liczbach całkowitych pomaga tutaj, ponieważ zmniejsza zależność od zachowań zmiennoprzecinkowych specyficznych dla danej platformy, tam gdzie obciążenie może korzystać z takich profili. Powierzchnie obsługujące no_std pomagają, ponieważ nie każde środowisko ma luksus standardowej biblioteki procesu serwerowego. Nie chodzi o nostalgię za mniejszymi maszynami. Chodzi o kontrolę nad tym, który kontrakt liczbowy trafia do środowisk o ograniczonych zasobach.

To nie jest nostalgia za mniejszymi maszynami. To kontrola. Jeśli obliczenia są częścią produktu, produkt nie powinien wymagać najbardziej komfortowego środowiska, aby być godnym zaufania.

Nudny przykład jest tym ważnym

Wyobraź sobie obliczenie dawkowania, obliczenie taryfy, krok symulacji, odtworzoną wartość z czujnika lub próg kompresji modelu. Żadne z tych nie brzmi efektownie. Dobrze. Efektowność to zwykle miejsce, w którym zaczyna się machanie rękami. Nudne przykłady to te, w których determinizm liczbowy pokazuje swoją wartość.

Jeśli wynik jest użyty raz i zapomniany, niewielkie odchylenie może nie mieć znaczenia. Jeśli wynik jest rejestrowany i odtwarzany, ma znaczenie. Jeśli jest porównywany między środowiskami, ma znaczenie. Jeśli zasila późniejszą decyzję, ma znaczenie. Jeśli klient, audytor lub inżynier może zapytać, dlaczego pojawiła się ta wartość, to zdecydowanie ma znaczenie. W tym momencie obliczenia nie są już wewnętrznym szczegółem implementacji. Są częścią historii, którą opowiada produkt.

Dlatego Numerus to nie tylko biblioteka matematyczna w abstrakcyjnym sensie. To komponent architektury dowodowej. Daje innym systemom spokojniejszą warstwę liczbową, na której mogą stanąć. Reed może analizować źródło z potwierdzeniami. Ledger może rejestrować zdarzenia. BitWeave może uczynić wyszukiwanie deterministycznym. HEDL może sprawić, że dane strukturalne będą mniej marnotrawne. Numerus sprawia, że arytmetyka jest mniej śliska. Każdy element usuwa jedno miejsce, w którym system musiałby w innym przypadku wzruszyć ramionami.

Lekcja

Lekcja Numerusa jest taka, że liczby są zachowaniem produktu. Nie tylko szczegółem implementacji. Nie tylko matematyką. Zachowaniem. Jeśli te same dane wejściowe mogą dać inny wynik po przeniesieniu do innego obsługiwanego środowiska, ta różnica należy teraz do produktu.

Deterministyczna arytmetyka nie zawsze jest wymagana. Kiedy jest wymagana, powinna być zaprojektowana od początku, a nie wymuszona później. Wybierz jawne rodziny liczbowe. Weryfikuj względem wyroczni. Testuj przypadki skrajne. Szanuj ograniczenia wdrożeniowe. Miej na uwadze odtwarzanie, zanim pierwszy raport o incydencie sprawi, że wszyscy nagle zaczną filozofować.

Numerus jest użyteczny, ponieważ zamienia arytmetykę w kontrakt, na którym może polegać reszta stosu. Binarny, trójkowy, całkowitoliczbowy, stałoprzecinkowy, zmiennoprzecinkowy, Decimal i AXIOM to nie slogany. To sposoby na kształtowanie liczb, aby ta sama odpowiedź mogła pojawić się dwukrotnie, celowo. AXIOM ma swoją głębszą historię, ponieważ to część, w której sam punkt zaczyna się przesuwać, podczas gdy kontrakt pozostaje deterministyczny. To nie jest efektowne. To lepsze niż efektowne. To ten rodzaj nudy, który pozwala poważnym systemom spać spokojnie.