Maison > développement back-end > C++ > le corps du texte

Pourquoi les nombres anormaux sont-ils un compromis entre précision et longueur de représentation ?

Susan Sarandon
Libérer: 2024-11-08 12:34:01
original
191 Les gens l'ont consulté

Why are Subnormal Numbers a Tradeoff Between Precision and Representation Length?

Bases de l'IEEE 754

La norme à virgule flottante IEEE 754 organise les nombres dans le format suivant :

  • 1 bit : Signe
  • 8 bits : Exposant
  • 23 bits : Fraction

Nombres anormaux

Les ingénieurs ont mis en œuvre des nombres subnormaux chiffres pour répondre à une préoccupation. Tous les nombres sauf 0,0 ont un 1 en tête en représentation binaire. Pour éviter de perdre de la précision sur ce bit principal, ils ont créé la « convention des bits principaux ».

Cependant, cela rendrait le plus petit nombre non nul plus grand que la norme précédente. Les ingénieurs ont introduit des nombres anormaux comme exception où :

  • L'exposant est 0
  • Le bit de début est réglé sur 0
  • L'exposant est fixé à -126

Cela permet la représentation de nombres plus petits que la plus petite valeur non anormale.

Compromis des nombres subnormaux

Les nombres anormaux représentent un compromis entre précision et longueur de représentation. Les nombres plus petits ont une précision réduite, mais le nombre de valeurs représentées est doublé.

Visualisation

Géométriquement, les valeurs inférieures à la normale étendent la plage de l'exposant 0, doublant ainsi l'espace disponible pour les nombres. et réduire l'espacement dans cette plage.

Implémentation de Subnormals

C float représente les nombres IEEE 754 32 bits sur la plupart des ordinateurs de bureau. Un exemple de programme C démontre les propriétés des nombres subnormaux :

#include <assert.h>
#include <inttypes.h>
#include <math.h>
#include <stdlib.h>
#include <stdio.h>

typedef struct {...} Float32; // Represents the 32-bit floating point

float float_from_bytes(..., uint32_t fraction); // Reconstructs float from individual parts
bool float32_equal(float f, uint32_t sign, uint32_t exponent, uint32_t fraction); // Compares float to individual parts

int main() {
    assert(float32_equal(0.5f, 0, 126, 0));
    assert(isnormal(0.5f));
    ... // More assertions

    return EXIT_SUCCESS;
}
Copier après la connexion

Les subnormaux dans les implémentations

Les subnormaux peuvent être implémentés moins efficacement sur certaines plates-formes. ARMv8 fournit un mode « Flush-to-Zero » dans lequel les valeurs inférieures à la normale sont arrondies à zéro pour optimiser les performances.

Dénormal vs. Subnormal

Subnormal et dénormal sont des synonymes, faisant référence au même type de nombres.

Autres cas particuliers

  • Infini : représente des nombres trop grands pour être représentés par des nombres normaux.
  • NaN (Not a Number) : représente les calculs qui n'ont pas produit de résultat valide, souvent en raison d'entrées non valides.

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

source:php.cn
Déclaration de ce site Web
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn
Derniers articles par auteur
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal