# Unum

Les « nombres universels » (universal numbers), dits unum, sont une famille de quantifications de la droite projective proposées depuis 2015 par John L. Gustafson. Elles sont conçues comme une alternative au standard IEEE 754, relatif aux nombres flottants.
Gustafson a révisé plusieurs fois son modèle, de telle sorte qu'il existe plusieurs versions : l'unum de type I, l'unum de type II et l'unum de type III, dit posit. Le nom posit provient du verbe anglais to posit qui lorsque utilisé comme un nom peut signifier « assertion » ou bien « conjecture ». Gustafson définit aussi deux formats dits valid et quire qui complémentent le posit en apportant respectivement des fonctionnalités différentes et une aide pour les calculs intermédiaires.
Toutes ces variantes ont en commun les propriétés suivantes :
* le codage en binaire est à longueur fixe, typiquement choisie comme un nombre entier d'octets.
* il existe deux valeurs dites exceptionnelles: 0 et infini ($\infty$). Elles sont encodées différemment des autres valeurs.
* le décodage est injectif : deux éléments distincts de l'ensemble discret correspondent toujours à deux points distincts de la droite projective.
Depuis 2017, les efforts de standardisation du système des nombres universels portent essentiellement sur le posit. Cet effort a abouti en 2022 à la publication d'un document normatif.

## Unum
### Type I

L'unum de type I est assez proche de la norme IEEE 754. La principale différence consiste dans l'utilisation du bit de poids faible pour implémenter une arithmétique d'intervalles.

### Type II

L'unum de type II est radicalement différent de la norme IEEE 754. En plus du bit de signe et du bit d'intervalle mentionné précédemment, l'unum de type II utilise un bit pour signifier l'inversion. La donnée de ces trois opérations permet, à partir d'un ensemble fini de points entre l'unité et l'infini, de quantifier toute la droite projective hormis quatre points : les deux exceptions 0 et $\infty$, puis 1 et -1. Cet ensemble de points est choisi arbitrairement et les calculs arithmétiques les concernant sont effectués non pas de façon logique, mais en faisant appel à une table de correspondance. La taille d'une telle table devient rédhibitoire pour un format d'encodage de plusieurs octets. Cette difficulté a rendu nécessaire le développement de l'unum de type III, dit posit, discuté ci-après.

## Posit

Le posit est plus proche de IEEE 754 que ne l'est l'unum de type II. En substance, la principale différence avec IEEE 754 est que l'exposant est encodé en taille variable. Il en résulte que la précision est plus élevée auprès de l'unité qu'elle ne l'est auprès de zéro ou de l'infini.
Le posit n'implémente pas d'arithmétique d'intervalles. Gustafson a cependant conçu un format companion, le valid, qui lui permet ce genre de calculs. Gustafson semble considérer posit et valid comme deux modes de fonctionnement du format unum.

### Principe général

Le format posit de précision $n$ est un format d'encodage de fractions dyadiques sur $n$ bits. Toute fraction dyadique qui peut être encodée de façon exacte sous un tel format sera ici dite représentable. Le format nécessite un processus d'arrondissage pour encoder les réels qui ne sont pas des fractions dyadiques, ou les fractions dyadiques qui ne sont pas représentables.

#### Fractions dyadiques représentables

Soit $r$ une fraction dyadique représentable que Gustafson écrit sous la forme :
    $r=K2^{M}$
où $K$ et $M$ sont deux entiers relatifs qu'il faut encoder ensemble dans $n$ bits, la précision du format. On se réduit ici au cas $r>0$ et donc $K>0$. L'encodage des nombres négatifs est discuté plus loin.
Comme mentionné plus haut, $M$ doit être encodé en longueur variable : les bits restants, s'il y en a, doivent être utilisés pour encoder $K$. Comme $K$ est nécessairement non nul puisque zéro est un point exceptionnel, son bit de poids fort est nécessairement 1 et on peut le considérer implicite. Considérons donc $m$ tel que K s'écrit sur $m+1$ bits. $K$ peut alors s'écrire $K=2^{m}+F$, où $0\leq F<2^{m}$. On doit donc encoder non pas $K$ mais $F=K-2^{m}$. $F$ contrairement à $K$, peut être nul. $m$ doit coïncider avec le nombre de bits restant après l'encodage de $M$. C'est aussi le nombre de bits nécessaires pour encoder $F$.
On a:
    $r=K2^{M}=(2^{m}+F)2^{M}=(1+{\frac {F}{2^{m}}})2^{M+m}$
Notons $f=1+{\frac {F}{2^{m}}}$ et $N=M+m$. On a alors: $r=f2^{N}$ et, par construction :
    $1\leq f<2$
Il suit:
    ${\begin{aligned}0&\leq &log_{2}(f)&<&1\\N&\leq &log_{2}(f)+N&<&N+1\\N&\leq &log_{2}(f2^{N})&<&N+1\\N&\leq &log_{2}(r)&<&N+1\end{aligned}}$
Et donc, par définition de la partie entière:
    $N=\lfloor log_{2}(r)\rfloor$
Il suffit alors d'encoder $N$. Le nombre de bits restants est $m$, ce qui nous donne $M=N-m$, et donc $K=r/2^{M}$.

#### Arrondissage des nombres réels et des fractions dyadiques non-représentables
### Codage de l'exposant

L'exposant N est encodé avec un codage de Rice adapté pour encoder des entiers relatifs. Le paramètre utilisé est ${\text{es}}$. Il peut être nul et est typiquement choisi petit (inférieur à trois). Si les versions initiales du format posit faisaient de ${\text{es}}$ un paramètre au même titre que $n$, le standard de 2022 semble avoir finalisé la valeur 2.
Le signe du quotient $q$ est encodé en faisant usage des deux conventions possibles pour un codage unaire, selon que le bit répété est 0 ou 1. Plus précisément, $q$ est encodé avec une séquence commençant par un bit $b$ égal à 0 si $q$ est strictement négatif, et 1 sinon :
    $b=\operatorname {sgn}(1+\operatorname {sgn}(q))$
Ce bit est répété $m$ fois, avec :
    $m=|q|+b$
La séquence de bits encodant le quotient q peut alors s'écrire:
    $\underbrace {b,\ldots ,b} _{m},{\overline {b}}$
Le reste de la division euclidienne est quant à lui encodé comme dans le codage Rice proprement dit.
Seuls les $m$ bits sont nécessaires. Le codage de Rice est tronqué lorsque $m=n-1$. Les bits absents sont alors implicitement égaux à zéro.

### Exceptions

Zéro est codé par un champ de bits tous égaux à 0. Il s'agit d'une exception car s'il devait être décodé par l'algorithme décrit plus haut, un tel champ de bits correspondrait à la valeur $2^{(n-2)2^{\text{es}}}$.
L'infini est codé par un champ de bits dont le premier est 1 et tous les autres sont 0. S'il devait être décodé par l'algorithme décrit plus haut, un tel champ de bits correspondrait à la valeur $2^{-(n-1)2^{\text{es}}}$.

### Complément à deux

Afin d'assurer un décodage injectif, les valeurs négatives (marquées comme telles par le bit de signe) doivent être complémentée à deux en première étape de décodage et en dernière étape de codage.