Numerus e a mesma resposta duas vezes
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.
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.
Isso é importante porque os sistemas de produto não se limitam a calcular. Eles recordam. Reproduzem. Comparam. Explicam. Se o mesmo cálculo produz resultados diferentes nas várias superfícies suportadas, essa diferença passa a fazer parte do produto, quer alguém a tenha planeado ou não.
Uma biblioteca numérica é, na verdade, várias promessas
Uma fundação numérica não é uma coisa só. É um conjunto de promessas com públicos diferentes. O engenheiro de sistemas embebidos preocupa-se que os alvos com restrições consigam executar os perfis relevantes orientados a inteiros sem arrastar um runtime de servidor confortável. O engenheiro de simulação preocupa-se que a reprodução consiga recriar um estado. A pessoa da auditoria preocupa-se que o caminho da resposta possa ser explicado. O dono do produto preocupa-se que a coisa não se comporte como uma calculadora nervosa quando passa de um ambiente para outro.
A página pública do Numerus destaca as famílias que a maioria das pessoas pergunta primeiro: ponto fixo em formato Q, Decimal e AXIOM. O código é mais vasto. common/numeric contém formas binárias XNOR e POPCNT, valores ternários, inteiros nativos e sub-byte, aliases de ponto fixo, formatos de vírgula flutuante pequenos e AXIOM adaptativo. A fachada Numerus acrescenta depois as superfícies decimais e aritméticas viradas para o produto em torno dessa fundação. Essa divisão é importante porque evita a elegância falsa de forçar todos os números para dentro de uma única roupagem.
Isto é engenharia muito europeia, no melhor sentido. Menos drama, mais contrato. O cálculo deve declarar o que é. O intervalo deve ser conhecido. O comportamento decimal deve ser explícito. As restrições do alvo devem ser respeitadas. O resultado deve ser reproduzível. Ninguém precisa de uma keynote para isso. Precisam que funcione.
AXIOM merece um artigo próprio porque não é apenas mais um alias na lista. É a família de ponto variável adaptativo da Dweve: sinal, índice de expoente e mantissa empacotados numa representação compacta, com listas de expoentes selecionadas para dados gerais, densos, de granularidade fina ou com forma de redes neuronais. Este post apenas a coloca no mapa do Numerus. A história mais profunda é como a seleção adaptativa de expoentes dá mais espaço a magnitudes variáveis sem tornar a aritmética não determinística outra vez.
Também evita promessas excessivas. O Numerus não torna todos os problemas numéricos fáceis. Não elimina a necessidade de escolher escalas, intervalos, comportamentos de arredondamento, listas de expoentes, larguras de mantissa ou domínios de verificação. A aritmética de ponto fixo e de ponto variável podem ambas ser mal utilizadas com grande entusiasmo. O valor está em tornar esse mau uso mais visível. Um contrato numérico explícito dá-nos algo para rever. Uma suposição oculta de vírgula flutuante dá-nos um pequeno fantasma em produção.
Verificação não é um distintivo
Toda a biblioteca numérica acaba por aprender que palavras como correto e preciso são baratas até serem ligadas a uma estrutura de testes. Correto onde? Preciso em comparação com quê? Sobre que domínio de entrada? Com que comportamento de arredondamento? Em que versão? Sob que testes?
O material do Numerus coloca a verificação em primeiro plano: CORDIC apenas com inteiros para funções transcendentais, comparação com um oráculo MPFR de alta precisão, testes de propriedades e verificações de lançamento. A afirmação exata só faz sentido quando ligada a essa maquinaria. Um distintivo que diz preciso é decoração. Uma estrutura de testes que compara, reduz e falha é engenharia.
Esta distinção é importante porque os erros numéricos escondem-se muitas vezes nos limites. O meio do domínio comporta-se. A demonstração comporta-se. Os valores comuns comportam-se. Depois chega o valor limite com uma prancheta na mão. Entradas negativas, valores próximos de zero, limites de overflow, transições de escala, empates de arredondamento, limites de listas de expoentes e operações repetidas são onde as bibliotecas numéricas ganham confiança ou começam a escrever ficção.
Os testes de propriedades são úteis porque os humanos são maus a imaginar todas as formas como um número pode ser irritante. Um oráculo de alta precisão é útil porque a implementação precisa de uma referência que não seja ela própria. As verificações de lançamento são úteis porque uma afirmação verificada no mês passado não é uma garantia para este mês. O software não se mantém correto por cortesia.
O determinismo pertence à arquitetura, não a uma nota de rodapé
É tentador tratar a aritmética determinística como um detalhe de biblioteca de baixo nível. É aí que muitas equipas a perdem. Quando o produto precisa de reprodução, os pressupostos numéricos já estão espalhados por serviços, cadernos, alvos embebidos, ferramentas de modelos e testes de integração. Então o determinismo torna-se uma adaptação retrospetiva. As adaptações retrospetivas são onde os orçamentos vão desenvolver caráter.
O momento certo para decidir a postura numérica é cedo. Esta carga de trabalho precisa de reprodução estável ao nível do bit? Atravessa máquinas? Atravessa arquiteturas? Apoia uma decisão regulada? Alimenta uma simulação? Torna-se dados de treino, entrada de inferência, saída de compressão de modelos ou estado de um gémeo digital? Se sim, a aritmética é arquitetural.
O Numerus encaixa ao lado do FMI e do Twin exatamente por essa razão. O FMI preocupa-se com núcleos de simulação determinísticos e troca de modelos. O Twin preocupa-se em reproduzir estado operacional ou físico ao longo do tempo. O Ledger regista eventos operacionais. O Trace transporta evidência de computação reproduzível. Essas camadas só ficam mais calmas quando a camada numérica por baixo não deriva como um carrinho de compras com uma roda estragada.
Em sistemas de IA isto torna-se ainda mais concreto. Quantização, pontuação, classificação, simulação, restrições, calibração, compressão e reprodução usam todas números. Se esses números se comportarem de forma diferente entre ambientes, o modelo pode não ser o culpado. É simplesmente o suspeito mais visível. Conveniente, mas nem sempre correto.
As máquinas pequenas não são cidadãos de segunda classe
Muita arquitetura de IA e simulação assume silenciosamente uma máquina confortável. Haverá um servidor. Haverá uma GPU. Haverá memória suficiente. Haverá um serviço na nuvem. Haverá uma fatura que faz alguém inventar a expressão investimentoestratégico.
Os sistemas reais são menos arrumados. Alguns cálculos precisam de correr em alvos embebidos. Alguns vivem na periferia. Alguns estão dentro de dispositivos sem unidade de vírgula flutuante. Alguns precisam de compatibilidade no_std. Alguns precisam de continuar a funcionar quando a rede não é convidada. Se a fundação numérica só se comporta no caso confortável, não é uma fundação. É mobília.
Uma aritmética orientada a inteiros ajuda aqui porque reduz a dependência de comportamentos de vírgula flutuante específicos do alvo quando a carga de trabalho pode usar esses perfis. Superfícies compatíveis com no_std ajudam porque nem todos os ambientes têm os luxos da biblioteca padrão de um processo de servidor. A questão não é nostalgia por máquinas mais pequenas. É o controlo sobre qual contrato numérico viaja para alvos limitados.
Isto não é nostalgia por máquinas mais pequenas. É controlo. Se o cálculo faz parte do produto, o produto não deve exigir o ambiente mais confortável apenas para ser fiável.
O exemplo aborrecido é o importante
Imagine um cálculo de dosagem, um cálculo de tarifa, um passo de simulação, um valor de sensor reproduzido ou um limiar de compressão de modelo. Nenhum destes soa a algo fascinante. Ainda bem. O fascínio é normalmente onde começam as generalizações vagas. Os exemplos aborrecidos são onde o determinismo numérico mostra o seu valor.
Se o resultado for usado uma vez e esquecido, um pequeno desvio pode não ter importância. Se o resultado for registado e reproduzido, tem. Se for comparado entre ambientes, tem. Se alimentar uma decisão posterior, tem. Se um cliente, auditor ou engenheiro puder perguntar por que apareceu este valor, tem definitivamente. Nesse ponto, o cálculo deixa de ser um detalhe de implementação interno. Passa a fazer parte da história que o produto conta.
É por isso que a Numerus não é apenas uma biblioteca de matemática no abstrato. É um componente numa arquitetura de evidências. Dá a outros sistemas uma camada numérica mais calma sobre a qual se apoiarem. A Reed pode analisar código-fonte com recibos. A Ledger pode registar eventos. A BitWeave pode tornar a recuperação determinística. A HEDL pode tornar os dados estruturados menos desperdiçados. A Numerus torna a aritmética menos escorregadia. Cada peça remove um lugar onde o sistema, de outra forma, encolheria os ombros.
A lição
A lição da Numerus é que os números são comportamento de produto. Não apenas um detalhe de implementação. Não apenas matemática. Comportamento. Se a mesma entrada puder produzir uma resposta diferente quando movida para outro ambiente suportado, essa diferença pertence agora ao produto.
A aritmética determinística nem sempre é necessária. Quando é necessária, deve ser concebida desde o início em vez de ser implorada mais tarde. Escolha famílias numéricas explícitas. Verifique contra um oráculo. Teste os cantos. Respeite as restrições de implementação. Tenha a reprodução em mente antes de o primeiro relatório de incidente tornar toda a gente subitamente filosófica.
A Numerus é útil porque transforma a aritmética num contrato em que o resto da pilha pode confiar. Binário, ternário, inteiro, fixo, vírgula flutuante, Decimal e AXIOM não são slogans. São formas de moldar números para que a mesma resposta possa aparecer duas vezes, de propósito. A AXIOM tem a sua própria história mais profunda porque é a parte onde o próprio ponto começa a mover-se enquanto o contrato permanece determinístico. Isso não é chamativo. É melhor do que chamativo. É o tipo de aborrecimento que permite a sistemas sérios dormir descansados.