L'assioma e il punto che si muove
Il punto si è spostato, il contratto no
L'aritmetica a virgola fissa è attraente perché è onesta. Scegli una scala, dici dove vive il punto, e la macchina smette di fingere che ogni numero sia una minuscola previsione del tempo. Questo rende la riproduzione più calma, i target embedded più facili da ragionare, e gli audit meno dipendenti da frasi come "abbastanza vicino". Bello. Ma anche incompleto.
Una scala fissa può essere troppo grossolana. Scegli una scala che gestisce valori molto piccoli e i valori più grandi finiscono lo spazio. Scegli una scala che gestisce valori più grandi e i valori piccoli perdono dettagli utili. Puoi dividere il carico di lavoro in diversi tipi, ma ora il codebase ha un altro tipo di pasticcio. Congratulazioni, il punto decimale è diventato un problema di organico.
AXIOM esiste per i casi in cui il punto deve spostarsi senza trasformare il livello numerico di nuovo in una zuppa a virgola mobile. Nel codebase Dweve è una famiglia a punto variabile adattivo: ogni valore concreto porta un segno, un indice di lista degli esponenti e una mantissa in una rappresentazione compatta a 32 bit. L'esponente non è un umore hardware ambientale. È selezionato da una lista esplicita. La mantissa è un payload intero. Il valore rappresentato è segno per mantissa per due elevato alla meno esponente selezionato. Quella frase non è carina, ma è tutto il trucco.
La parte importante non è che il punto si muova. La virgola mobile muove già il punto. La parte importante è che AXIOM lo muove attraverso una lista dichiarata che può essere revisionata, testata, specializzata e mantenuta deterministica. Il codice non chiede alla piattaforma di improvvisare una personalità numerica. Dà al valore un contratto compatto e fa sì che l'aritmetica torni a quel contratto dopo ogni operazione.
Nel sorgente, la forma concreta è Axiom<M, E>. La larghezza della mantissa deve adattarsi alla rappresentazione, con alias pratici come Adp4, Adp8, Adp16, Adp23, AdpNN4 e AdpNN8. Quei nomi non sono decorazioni. Ti dicono quanto payload e quale profilo di esponente il valore dovrebbe usare. Un valore con una lista di esponenti a forma di NN non è la stessa promessa di un valore con una lista generale più ampia. Trattarli come uguali perché entrambi sembrano numerici è così che i codebase seri iniziano a collezionare folklore.
Il punto variabile non è vibrazioni
L'espressione "punto variabile adattivo" può sembrare che qualcuno abbia rinominato la virgola mobile per far passare l'acquisto in una riunione. Non è quello che sta succedendo. AXIOM non rende l'esponente un effetto collaterale invisibile. L'esponente è selezionato da una lista collegata al tipo o alla strategia. Nel sorgente attuale, le liste di esponenti concrete includono la standard [16, 8, 4, 0], la densa [12, 8, 4, 0], i pesi per reti neurali [8, 6, 4, 0] e una lista fine [16, 14, 12, 10, 8, 6, 4, 0]. Questi sono i valori attuali del sorgente, e questa distinzione conta perché il sorgente è cambiato nel tempo; le affermazioni attuali dovrebbero seguire il codice attuale, non liste di esponenti obsolete.
La lista è la decisione di prodotto. Una lista standard offre poche bande ampie. Una lista densa cambia dove si trovano le bande. La lista NN è modellata per dati simili a pesi. La lista fine offre più scelte vicine. Niente di tutto ciò rimuove il giudizio. Sposta il giudizio in un posto dove la revisione del codice può vederlo.
Questa è la differenza tra una rappresentazione adattiva controllata e una scusa generica. Un tipo a virgola fissa dice che ogni valore qui usa questa scala. AXIOM dice che ogni valore qui sceglie da questo insieme dichiarato di scale. È un contratto più ampio, non uno mancante. Il punto si sposta, ma si sposta su binari. Molto olandese, davvero. Anche il punto decimale ha le sue infrastrutture.
Vale la pena essere precisi su ciò che AXIOM non è. Non è aritmetica razionale esatta. Non è una licenza per ignorare l'analisi dell'intervallo dinamico. Non è una promessa di benchmark. Non è una garanzia che l'elenco di esponenti scelto si adatti al tuo carico di lavoro solo perché l'acronimo sembrava energico. Devi comunque comprendere i valori, l'intervallo dinamico, l'errore accettabile, la piattaforma di distribuzione e i requisiti di riproduzione. AXIOM rende queste scelte più ispezionabili. Non le fa sparire. Semmai, rende più difficile nascondere un pensiero numerico pigro, che di solito è il punto in cui iniziano le urla.
L'aritmetica deve tornare a casa
Un formato numerico è facile da disegnare e più difficile da rendere utile. La parte utile è l'aritmetica. Addizione e sottrazione devono gestire valori che possono trovarsi su bande di esponente diverse. Moltiplicazione e divisione devono svolgere un lavoro più ampio sulla mantissa intera prima di riportare il risultato alla forma di destinazione. Dopo l'operazione, il valore deve normalizzarsi di nuovo in una scelta di esponente disponibile. Quest'ultimo passaggio conta perché una rappresentazione che non può tornare a casa è solo una vacanza all'estero con un branding migliore.
L'aritmetica di AXIOM ha quindi un ritmo. Porta dentro i valori impacchettati. Allinea o allarga come necessario. Esegui l'operazione orientata agli interi. Normalizza. Riporta il risultato nella forma dichiarata. Se non ci sta, questo dovrebbe essere visibile come un problema di rappresentazione, non delegato silenziosamente all'umore della macchina. Il contratto è utile perché ha dei bordi.
Questo è lo stesso motivo per cui Numerus è importante intorno ad esso. Lo stack più ampio non cerca di collezionare formati numerici come francobolli. Vuole un'aritmetica che possa sopravvivere a riproduzioni, distribuzioni embedded, simulazioni, compressione di modelli, test e audit trail. AXIOM è una famiglia all'interno di quella storia. Gestisce un problema particolare: valori la cui scala utile cambia, ma il cui comportamento deve comunque essere deterministico.
Questa è la frase noiosa che salva i team più tardi: normalizza di nuovo nella forma. Sembra un dettaglio implementativo finché una riproduzione non differisce, una soglia non si ribalta o un modello compresso non si comporta diversamente su un target più piccolo. Allora diventa la frase che tutti avrebbero voluto vedere nel documento di architettura.
Perché AXIOM sta sotto Numerus
La storia pubblica di Numerus è deliberatamente più semplice dell'albero sorgente. La maggior parte dei lettori vuole sapere se il livello numerico può offrire aritmetica deterministica, famiglie a virgola fissa, comportamento decimale, postura no_std, profili embedded orientati agli interi, verifica e la stessa risposta due volte. Non hanno bisogno di ogni tipo interno nella prima pagina. Non è segretezza. È misericordia.
Sotto, lo strato numerico comune è più ampio. Trasporta tipi interi binari, ternari, nativi e sub-byte, alias a virgola fissa, tipi legati al floating point per lavori di compatibilità e AXIOM adattivo. I trait condivisi danno a queste famiglie una superficie comune. Numerus poi avvolge le parti che dovrebbero essere rivolte al prodotto: virgola fissa binaria e decimale, AXIOM, interi, operazioni, superfici DSL e postura di verifica. Questa separazione è sana. Una fondazione può essere ampia senza far sembrare la pagina pubblica un menu di un ristorante che ha perso fiducia.
AXIOM merita un articolo a parte perché non è solo un'altra voce in quella lista. La virgola fissa riguarda il mettere il punto in un unico posto. La virgola fissa decimale riguarda le posizioni decimali esatte in base dieci. Le forme binarie e ternarie riguardano percorsi compatti a pochi bit. AXIOM riguarda il rendere il punto una parte controllata del valore. Questo cambia il modo di pensare a rappresentazione, aritmetica, test e distribuzione.
Cambia anche il modo in cui dovrebbero essere formulate le affermazioni pubbliche. Le prestazioni di AXIOM appartengono ai benchmark attuali su codice attuale, non a folklore ereditato. Lo stack più ampio non dovrebbe essere descritto come zero operazioni in virgola mobile, perché le superfici di conversione e visualizzazione potrebbero oltrepassare quel confine. L'affermazione più sicura e accurata è che l'aritmetica fissa e adattiva di base è orientata agli interi e progettata per un comportamento deterministico. Questa frase è meno appariscente. Bene. Le affermazioni numeriche appariscenti sono il modo in cui le dashboard diventano generatori di scuse.
Più percorsi di calcolo, una sola famiglia
Il valore impacchettato concreto è solo l'inizio. Il sorgente contiene più di un modo per usare AXIOM perché i carichi di lavoro non sono abbastanza educati da adattarsi a un solo layout per sempre. C'è il percorso concreto impacchettato per liste di esponenti a tempo di compilazione. C'è Flex<S> per l'archiviazione degli esponenti a runtime su dimensioni di archiviazione intere. Ci sono forme tensoriali e a blocchi in cui una struttura di esponenti condivisa può essere utile. C'è l'elaborazione stratificata. C'è APoT, dove i valori possono essere rappresentati come somme di potenze di due con segno, così la moltiplicazione può diventare spostamenti e addizioni. C'è codice di ricerca su profiling ed esponenti appresi attorno a tutto questo.
Questa diffusione non è un motivo per fare affermazioni azzardate. È un motivo per essere attenti al carico di lavoro. Un percorso di replay scalare, un percorso di quantizzazione in batch, un percorso simile a un tensore e un percorso di pesi APoT hanno pressioni diverse. Il layout della memoria, il riutilizzo degli esponenti, l'intervallo, la normalizzazione e la forma dell'hardware contano tutti. AXIOM fornisce un vocabolario per queste scelte. Non assolve nessuno dal farle.
È qui che l'ingegneria diventa interessante. APoT non è solo un simpatico trucco di compressione. Per valori adatti trasforma la moltiplicazione in un problema di shift-and-add. I percorsi tensoriali e a blocchi possono condividere la struttura degli esponenti quando un carico di lavoro ha abbastanza forma. Flex mantiene disponibile l'archiviazione degli esponenti a runtime quando le liste a livello di tipo sono troppo rigide. Nessuno di questi dovrebbe essere scelto perché il diagramma sembrava carino. È il carico di lavoro a scegliere, oppure il report di bug sceglierà più tardi e sarà molto meno affascinante al riguardo.
Come valutare una scelta AXIOM
La prima domanda di revisione è noiosa e proprio per questo utile: perché non un tipo numerico più semplice? Se il valore è denaro o un importo decimale regolamentato, Decimal può essere la risposta giusta. Se l'intervallo è piccolo e ben delimitato, un tipo a virgola fissa in formato Q può essere più stabile. Se il numero esiste solo per interoperare con un formato di file o un'API esterna, un tipo legato al float potrebbe essere l'adattatore di confine onesto. AXIOM dimostra il suo valore quando il carico di lavoro ha una magnitudine variabile, richiede comunque un contratto deterministico e trae beneficio da un insieme di esponenti esplicito.
La seconda domanda è se l'elenco degli esponenti descrive i dati o semplicemente lusinga l'ingegnere. Un elenco con quattro bande ampie è un compromesso diverso da un elenco dettagliato di otto voci. L'elenco a forma di NN non è un'etichetta decorativa. Dice che ci si aspetta che i valori si comportino come dati di peso. Se la distribuzione non corrisponde all'elenco, la rappresentazione funzionerà comunque. Il software è spesso disposto a fare la cosa sbagliata a una velocità impressionante. Questo non lo rende un progetto.
La terza domanda è dove appare la pressione di normalizzazione. L'addizione tra bande di esponenti distanti può scartare dettagli. La moltiplicazione può creare un risultato che richiede una banda diversa. Le operazioni ripetute possono accumulare pressione esattamente nei punti che la demo non ha visitato. La revisione dovrebbe richiedere test di confine attorno allo zero, ai cambi di segno, alle transizioni di esponente, alle mantisse grandi e alle operazioni ripetute. Se questi casi sembrano fastidiosi, bene. Sono probabilmente i casi che contano.
La domanda finale è come la rappresentazione lascia traccia. Quale alias di tipo abbiamo scelto? Quale elenco di esponenti? Quale larghezza di mantissa? Quale percorso di conversione? Quale oracolo o test di proprietà supporta l'affermazione? Se la risposta è sparsa tra commenti e ottimismo, il sistema ha già perso parte del beneficio. AXIOM è più utile quando la scelta numerica diventa parte della documentazione architetturale, non un trucco locale intelligente nascosto tre moduli più in profondità.
La verifica batte i numeri da eroi
I formati numerici attirano numeri da eroi. Più piccoli. Più veloci. Più efficienti. Migliori. Le parole costano poco e di solito arrivano prima del banco di prova, che è esattamente l'ordine sbagliato. Per AXIOM, la postura responsabile è trattare i benchmark come prove per ogni release, non come mitologia. Se il benchmark non è stato rieseguito sul sorgente corrente, con il compilatore corrente, i flag correnti e l'hardware corrente, non è un'affermazione pubblica. È una cartolina da un pomeriggio precedente.
Ciò che conta di più è il percorso di verifica. La codifica e la decodifica rimangono entro il contratto dichiarato? Le operazioni si normalizzano in una forma legale? I casi limite attorno ai confini degli esponenti si comportano in modo intenzionale? I test di proprietà coprono i valori fastidiosi che gli esseri umani dimenticano perché gli esseri umani hanno hobby? Esiste un oracolo ad alta precisione dove il confronto è significativo? La riproduzione può ricostruire lo stesso percorso di valori?
Quell'ultima domanda è il motivo per cui questo appartiene al nostro stack. Dweve continua a costruire verso sistemi in cui il calcolo lascia traccia: parser con ricevute, registri con eventi tipizzati, recupero con percorsi deterministici, formati di dati che non trascinano un carro di chiavi ripetute, livelli di simulazione e numerici che possono essere riprodotti. AXIOM si adatta perché spostare il punto non dovrebbe significare perdere la ricevuta.
La lezione
La lezione di AXIOM non è che la virgola fissa fosse sbagliata. La virgola fissa è ancora uno degli strumenti più puliti che abbiamo. La lezione è che una scala fissa non è sempre sufficiente, e l'alternativa non deve essere un comportamento in virgola mobile opaco. Un valore può portare una scelta di esponente controllata. Il punto può muoversi mentre il contratto rimane visibile.
Questa è la storia pubblica che vale la pena raccontare. Dweve AXIOM racchiude segno, indice dell'esponente e mantissa. Seleziona da elenchi espliciti di esponenti. Usa un'aritmetica orientata agli interi e normalizza i risultati nelle forme dichiarate. Ha percorsi concreti, flessibili, tensoriali, a blocchi, stratificati, APoT e di ricerca nel codebase. Appartiene a Numerus perché l'aritmetica deterministica non è una deviazione secondaria. È parte di come i sistemi seri ottengono due volte la stessa risposta.
Il punto si sposta. La responsabilità no. Questo è l'aspetto utile.