Assembly Language & x86 Low-Level Systems Programming · Leçon

Précision, arrondi et exceptions des nombres flottants

Comprenez la représentation IEEE 754, les modes d’arrondi et la manière dont les unités FPU et SSE signalent des exceptions telles que le dépassement de capacité, le sous-dépassement et les opérations invalides.

Leçon 4 sur 413 étapes

Précision, arrondi et exceptions des nombres flottants est une leçon Assembly Language & x86 Low-Level Systems Programming gratuite sur CoddyKit. Ceci est la leçon 4 sur 4. Tu peux lire la leçon complète ci-dessous gratuitement — puis la pratiquer en direct dans le navigateur avec un éditeur de code intégré et un tuteur IA 24/7. Elle fait partie du parcours d'apprentissage Assembly Language & x86 Low-Level Systems Programming, et ta progression se synchronise sur le web et l'application CoddyKit. Le cours Assembly Language & x86 Low-Level Systems Programming comprend 4 leçons au total.

Certaines parties de cette leçon n'ont pas encore été traduites et s'affichent en anglais.

IEEE 754 Format

x86 floating-point follows the IEEE 754 standard. A number is stored as sign, exponent, and mantissa:

  • Single (32-bit): 1 + 8 + 23
  • Double (64-bit): 1 + 11 + 52
  • Extended (80-bit): used internally by the x87 FPU

Why Precision Matters

Most decimal fractions cannot be represented exactly in binary. For example 0.1 + 0.2 does not equal exactly 0.3. Accumulated rounding error is a core hazard in numerical code.

The Four Rounding Modes

IEEE 754 defines four rounding modes:

  • Round to nearest, ties to even (default)
  • Round toward negative infinity (floor)
  • Round toward positive infinity (ceil)
  • Round toward zero (truncate)

Controlling Rounding on x87

The x87 control word holds the rounding-control (RC) bits. You read it with fstcw, modify, then load with fldcw.

sub esp, 4
fstcw [esp]          ; store control word
or word [esp], 0x0C00 ; RC = 11 -> round toward zero
fldcw [esp]          ; load it back
add esp, 4

SSE MXCSR Register

SSE has its own control/status register, MXCSR. It holds rounding-control bits plus exception masks and flags. Manage it with ldmxcsr and stmxcsr.

sub rsp, 4
stmxcsr [rsp]        ; save MXCSR
ldmxcsr [rsp]        ; restore MXCSR
add rsp, 4

Floating-Point Exceptions

The standard defines six exceptions:

  • Invalid (e.g. 0/0, sqrt of negative)
  • Denormal operand
  • Divide by zero
  • Overflow
  • Underflow
  • Inexact (rounding occurred)

Masked vs Unmasked

Each exception can be masked. A masked exception produces a default result (like infinity or NaN) and sets a flag. An unmasked exception raises a CPU trap so your handler can intervene.

Special Values: NaN and Infinity

IEEE 754 reserves bit patterns for special values:

  • +Inf / -Inf from overflow or divide-by-zero
  • NaN (Not a Number) from invalid operations

Any comparison with NaN is false — even NaN == NaN.

Detecting NaN

Because NaN is unordered, you detect it with an unordered compare. In SSE, ucomiss sets the parity flag when an operand is NaN.

ucomiss xmm0, xmm0   ; compare value with itself
jp is_nan            ; PF set => NaN detected

A Runnable C Demonstration

This self-contained C program shows that floating-point addition is not exact and detects a NaN.

#include <stdio.h>
#include <math.h>
int main(void) {
    double a = 0.1 + 0.2;
    printf("0.1+0.2 = %.17f\n", a);
    printf("equals 0.3? %d\n", a == 0.3);
    double nan_val = 0.0 / 0.0;
    printf("isnan? %d\n", isnan(nan_val));
    return 0;
}

Practical Advice

To write robust floating-point code:

  • Never compare floats with ==; use an epsilon tolerance
  • Be aware of accumulation order in sums
  • Keep the default round-to-nearest unless you have a reason
  • Check status flags after risky operations

Quick Check

Test your floating-point knowledge.

Recap

You explored floating-point behavior:

  • IEEE 754 defines single, double, and 80-bit extended formats
  • Four rounding modes are configured via the x87 control word or MXCSR
  • Six exceptions can be masked (default result + flag) or unmasked (trap)
  • NaN and infinity are special values; NaN compares false to everything
Gratuit pour commencer

Apprends Assembly avec un tuteur IA — gratuit

Écris et exécute du vrai code dans ton navigateur, obtiens de l'aide instantanée d'un tuteur IA disponible 24h/24, et reprends là où tu t'es arrêté sur le web ou dans l'app.

Cours
12
Leçons
48

Questions Fréquemment Posées

La leçon « Précision, arrondi et exceptions des nombres flottants » est-elle gratuite ?

Oui — le texte complet de « Précision, arrondi et exceptions des nombres flottants » est gratuit à lire ici sur le web. Pour la pratiquer de manière interactive (un éditeur de code intégré et un tuteur IA 24/7) et déverrouiller le reste du cours Assembly Language & x86 Low-Level Systems Programming, passe à CoddyKit PRO. Le cours Assembly Language & x86 Low-Level Systems Programming comprend 4 leçons au total.

Qu'est-ce que j'apprendrai dans « Précision, arrondi et exceptions des nombres flottants » ?

Comprenez la représentation IEEE 754, les modes d’arrondi et la manière dont les unités FPU et SSE signalent des exceptions telles que le dépassement de capacité, le sous-dépassement et les opération… Tu pratiques Assembly Language & x86 Low-Level Systems Programming avec du code pratique que tu exécutes directement dans le navigateur, et un tuteur IA 24/7 répond à tes questions au fur et à mesure que tu avances dans la leçon.

Dois-je avoir de l'expérience pour commencer Assembly Language & x86 Low-Level Systems Programming ?

Aucune expérience préalable n'est requise. Assembly Language & x86 Low-Level Systems Programming sur CoddyKit est structuré pour les débutants jusqu'aux apprenants avancés, donc tu peux commencer ici ou depuis le début et avancer à ton rythme. Ceci est la leçon 4 sur 4.

Combien de temps prend la leçon « Précision, arrondi et exceptions des nombres flottants » ?

La plupart des leçons CoddyKit prennent environ 5–10 minutes. Chacune est courte et interactive, tu progresses régulièrement et tu repiques exactement où tu t'es arrêté sur le web et l'app.

Peux-tu écrire et exécuter du code dans cette leçon Assembly Language & x86 Low-Level Systems Programming ?

Oui. Chaque leçon Assembly Language & x86 Low-Level Systems Programming inclut un éditeur de code intégré, tu écris et exécutes du vrai code directement dans ton navigateur et tu reçois des retours IA instantanés — aucune configuration locale requise.

Toutes les leçons de ce cours

  1. Bases de la programmation avec le FPU x87
  2. Introduction aux jeux d’instructions SSE/AVX
  3. Vectoriser du code avec SIMD
  4. Précision, arrondi et exceptions des nombres flottants
← Retour à Assembly Language & x86 Low-Level Systems Programming