Точность чисел с плавающей точкой, округление и исключения
Разберитесь в представлении IEEE 754, режимах округления и в том, как блоки FPU и SSE сообщают об исключениях, таких как переполнение, потеря значимости и недопустимые операции.
«Точность чисел с плавающей точкой, округление и исключения» — бесплатный урок Assembly Language & x86 Low-Level Systems Programming на CoddyKit. Это урок 4 из 4. Ты можешь прочитать весь урок бесплатно ниже — а потом практиковать его прямо в браузере с встроенным редактором кода и ИИ-репетитором 24/7. Это часть пути обучения Assembly Language & x86 Low-Level Systems Programming, и твой прогресс синхронизируется между веб-версией и приложением CoddyKit. Курс Assembly Language & x86 Low-Level Systems Programming содержит 4 уроков всего.
Части этого урока еще не переведены и отображаются на английском.
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, 4SSE 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, 4Floating-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 detectedA 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
Часто задаваемые вопросы
Урок «Точность чисел с плавающей точкой, округление и исключения» бесплатный?
Да — полный текст урока «Точность чисел с плавающей точкой, округление и исключения» бесплатно доступен здесь в веб-версии. Чтобы практиковать его интерактивно (встроенный редактор кода и ИИ-репетитор 24/7) и разблокировать остальной курс Assembly Language & x86 Low-Level Systems Programming, подпишись на CoddyKit PRO. Курс Assembly Language & x86 Low-Level Systems Programming содержит 4 уроков всего.
Чему я научусь в уроке «Точность чисел с плавающей точкой, округление и исключения»?
Разберитесь в представлении IEEE 754, режимах округления и в том, как блоки FPU и SSE сообщают об исключениях, таких как переполнение, потеря значимости и недопустимые операции. Ты практикуешь Assembly Language & x86 Low-Level Systems Programming с помощью реального кода, который запускаешь прямо в браузере, и ИИ-репетитор 24/7 отвечает на твои вопросы во время урока.
Нужен ли мне опыт, чтобы начать Assembly Language & x86 Low-Level Systems Programming?
Предыдущий опыт не требуется. Assembly Language & x86 Low-Level Systems Programming на CoddyKit структурирован для всех уровней — от новичков до продвинутых, поэтому ты можешь начать отсюда или с самого начала и учиться в своем темпе. Это урок 4 из 4.
Сколько времени занимает урок «Точность чисел с плавающей точкой, округление и исключения»?
Большинство уроков CoddyKit занимают около 5–10 минут. Каждый из них компактный и интерактивный, поэтому ты постоянно делаешь прогресс и продолжаешь с того же места в веб-версии и приложении.
Можно ли писать и запускать код в этом уроке Assembly Language & x86 Low-Level Systems Programming?
Да. Каждый урок Assembly Language & x86 Low-Level Systems Programming включает встроенный редактор кода, поэтому ты пишешь и запускаешь реальный код прямо в браузере и получаешь моментальную обратную связь от AI — локальная установка не требуется.
Все уроки этого курса
- Основы программирования x87 FPU
- Введение в наборы инструкций SSE/AVX
- Векторизация кода с помощью SIMD
- Точность чисел с плавающей точкой, округление и исключения