0Pricing
Assembly Language & x86 Low-Level Systems Programming · Lekcja

Precyzja, zaokrąglanie i wyjątki liczb zmiennoprzecinkowych

Poznaj reprezentację IEEE 754, tryby zaokrąglania oraz sposób, w jaki jednostki FPU i SSE sygnalizują wyjątki, takie jak przepełnienie, niedomiar i nieprawidłowe operacje.

Precyzja, zaokrąglanie i wyjątki liczb zmiennoprzecinkowych to bezpłatna lekcja Assembly Language & x86 Low-Level Systems Programming na CoddyKit. To lekcja 4 z 4. Możesz przeczytać całą lekcję poniżej za darmo — a potem ćwiczyć ją interaktywnie w przeglądarce z wbudowanym edytorem kodu i tutorem AI dostępnym 24/7. To część ścieżki edukacyjnej Assembly Language & x86 Low-Level Systems Programming, a Twój postęp synchronizuje się między webem a aplikacją CoddyKit. Kurs Assembly Language & x86 Low-Level Systems Programming zawiera 4 lekcji w sumie.

Części tej lekcji nie zostały jeszcze przetłumaczone i są wyświetlane po angielsku.

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

Często zadawane pytania

Czy lekcja „Precyzja, zaokrąglanie i wyjątki liczb zmiennoprzecinkowych” jest bezpłatna?

Tak — pełny tekst „Precyzja, zaokrąglanie i wyjątki liczb zmiennoprzecinkowych” jest dostępny za darmo tutaj w sieci. Aby ćwiczyć ją interaktywnie (wbudowany edytor kodu i tutor AI dostępny 24/7) i odblokować resztę kursu Assembly Language & x86 Low-Level Systems Programming, przejdź na CoddyKit PRO. Kurs Assembly Language & x86 Low-Level Systems Programming zawiera 4 lekcji w sumie.

Co nauczysz się w „Precyzja, zaokrąglanie i wyjątki liczb zmiennoprzecinkowych”?

Poznaj reprezentację IEEE 754, tryby zaokrąglania oraz sposób, w jaki jednostki FPU i SSE sygnalizują wyjątki, takie jak przepełnienie, niedomiar i nieprawidłowe operacje. Ćwiczysz Assembly Language & x86 Low-Level Systems Programming z praktycznym kodem, który uruchamiasz bezpośrednio w przeglądarce, a tutor AI dostępny 24/7 odpowiada na Twoje pytania podczas pracy nad lekcją.

Czy potrzebuję doświadczenia, aby zacząć Assembly Language & x86 Low-Level Systems Programming?

Nie wymagamy żadnego doświadczenia. Assembly Language & x86 Low-Level Systems Programming w CoddyKit jest strukturyzowany dla początkujących i zaawansowanych użytkowników, więc możesz zacząć tutaj lub od początku i uczyć się w swoim tempie. To lekcja 4 z 4.

Ile czasu zajmuje lekcja „Precyzja, zaokrąglanie i wyjątki liczb zmiennoprzecinkowych”?

Większość lekcji CoddyKit trwa około 5–10 minut. Każda lekcja to mały, interaktywny krok, dzięki czemu robisz systematyczne postępy i zawsze wracasz dokładnie do tego samego miejsca — na webie i w aplikacji.

Czy mogę pisać i uruchamiać kod w tej lekcji Assembly Language & x86 Low-Level Systems Programming?

Tak. Każda lekcja Assembly Language & x86 Low-Level Systems Programming zawiera wbudowany edytor kodu, więc piszesz i uruchamiasz prawdziwy kod bezpośrednio w przeglądarce i od razu otrzymujesz sprzężenie zwrotne od AI — bez konfiguracji na komputerze.

Wszystkie lekcje w tym kursie

  1. Podstawy programowania jednostki x87 FPU
  2. Wprowadzenie do zestawów instrukcji SSE/AVX
  3. Wektoryzacja kodu za pomocą SIMD
  4. Precyzja, zaokrąglanie i wyjątki liczb zmiennoprzecinkowych
← Powrót do Assembly Language & x86 Low-Level Systems Programming