Posit les tests de façon adulte. Analyse spectrale

Les discussions sur les avantages et les inconvénients du nouveau format révolutionnaire à virgule flottante Posit se poursuivent. L'argument suivant dans la discussion était l' affirmation selon laquelle la tâche de Posit est en fait de stocker de manière compacte les données et de ne pas être utilisées du tout dans les calculs; en même temps, les calculs eux-mêmes sont effectués dans l'arithmétique Quire avec une plus grande précision, qui est également incluse dans la norme Posit.

Eh bien, stockez donc stocker. Que signifie «stocker» des nombres après des calculs effectués avec une plus grande précision que le format de stockage ne le permet? Cela signifie arrondir et arrondir signifie faire des erreurs. Les erreurs peuvent être estimées de différentes manières - et pour ne pas se répéter, nous utilisons aujourd'hui l'analyse spectrale en utilisant la transformée de Fourier.

Introduction très courte


Si nous prenons un signal sous la forme d'une sinusoïde et effectuons une transformée de Fourier dessus, alors dans le spectre, nous devrions obtenir un seul pic; en fait, le spectre peut contenir à la fois des harmoniques avec une fréquence qui est un multiple de la tonalité fondamentale obtenue à la suite de la distorsion non linéaire et une plage de bruit obtenue à la suite du bruit, des interférences et de la numérisation. Ici, nous mesurerons le niveau de ces bruits.

Commencer


Pour le rendre encore plus intéressant, comme signal de test, nous prenons non pas une sinusoïde, mais plusieurs; il faut s'assurer que les périodes de ces sinusoïdes s'insèrent parfaitement dans la période de la transformée de Fourier discrète. Dans Wolfram Mathematica, cela peut être fait, par exemple, comme ceci:

sz = 8192; data = Table[2 Sum[ Sin[Prime[j] k 2 Pi/sz + j*j]/sz, {j, 100, 200, 2}] // N, {k, 0, sz - 1}]; 

Les nombres premiers sont utilisés ici pour une décimation inégale des fréquences; et j * j décale la phase de la sinusoïde en fonction de la fréquence pour éviter de fortes pointes dans le signal de test, lui fournissant une amplitude plus ou moins uniforme. Le signal reçu visuellement ressemble à ceci:



Ensuite, nous le normalisons à l'unité par la valeur maximale, puis le convertissons en un entier 32 bits Int, Float, Posit et à nouveau en Double. Si les affirmations des auteurs sont correctes, l'erreur introduite par la transformation Double → Posit → Double sera plus proche de Doublé que de Float.

Nous analyserons le niveau de bruit en unités standard pour le traitement du signal - décibels, ce qui nous permet de comparer les valeurs sur une échelle logarithmique. Comme outil, j'ai utilisé mon propre analyseur de spectre, une fois écrit à des fins de recherche.

tableau de comparaison
Seuil d'audition0 dB
Feuilles bruissantes10 dB
Chuchotements20 dB
Horloge qui tourne30 db
Chambre calme40 dB
Rue calme50 db
Conversation60 dB
Rue bruyante70 dB
Niveau dangereux75 dB
Marteau pneumatique90 dB
Train de métro100 dB
Musique forte110 dB
Seuil de douleur120 dB
Sirène130 dB
Lancement de fusée150 dB
Niveau mortel180 dB
Arme à bruit200 db


Donc:

bleu - flotteur
rouge - Posit
violet - Int32
bleu - Double



Posit, bien sûr, s'est avéré être un peu mieux que Float - mais il est encore loin du niveau Double. Et en même temps - pire qu'Int32! C'est logique - parce qu'une partie des bits prend un ordre de grandeur ... Utilisons cet ordre - augmentons l'amplitude de notre signal à 1000:



Soudain (et en fait assez attendu), le bruit de Float et Posit a rattrapé. Allez-y - augmentez l'amplitude à un milliard:



Float montre le même niveau et Posit commence à être à la traîne. Une nouvelle augmentation de l'amplitude (ici 10 15 ) entraîne une nouvelle augmentation de la plage de bruit:



Conclusion


Le miracle ne s'est toujours pas produit. L'analyse spectrale n'a pas confirmé les affirmations des auteurs selon lesquelles l'utilisation du format Posit comme stockage peut fournir une précision proche de Double. Même dans les meilleures conditions, la plage de bruit de Posit n'était que de 20 décibels inférieure à Float, mais en même temps supérieure à Int32 de 10 décibels et supérieure à Double de 60 décibels.

Bien sûr, Posit peut bien trouver une application utile - comme protection contre le dépassement de la plage autorisée, lorsque les émissions dépassant considérablement les valeurs normales n'entraîneront pas d'écrêtage ou de débordement. Mais même dans ce scénario, Posit agit plus comme un compromis entre Int et Float, plutôt que comme un format numérique nettement meilleur.

Source: https://habr.com/ru/post/fr468077/


All Articles