Реалните числа в двоична бройна система трябва да се съхраняват по специален начин в компютъра. Компютрите представят числата като цели двоични числа (цели числа, които са степен на две), така че няма пряк начин за представяне на нецелочислени числа като десетични дроби, тъй като няма радикс. Един от начините, по които компютрите заобикалят този проблем, е представянето на числата с плаваща запетая, като "плаваща" се отнася до начина, по който радиксната точка може да се премести по-високо или по-ниско, когато се умножи по експонента (степен).


 

Какво означава "плаваща точка"?

Представянето с плаваща точка е начин за записване на реални числа в форма, подобна на научната нотация, но в двоичен вид. Числото се записва като стойност от вида:

± (значеща част) × 2^(експонента)

Тази структура позволява да се представят много големи и много малки числа в ограничено количество битове, като позицията на двоичната точка може да "плава" — тоест да се променя според стойността на експонентата.

Структура на представянето

Стандартните двоични формати съдържат три полета:

  • Бит за знак — указва положително или отрицателно число.
  • Експонента — цяло поле, кодирано с изместване (bias), което позволява представяне на отрицателни и положителни степени на две.
  • Значеща част (мантиса или значеща) — дава точността (броя значещи бита).

Примерно при IEEE 754 single-precision (32 бита): 1 бит за знак, 8 бита за експонента (bias = 127) и 23 бита за значещата част (фактически 24 бита прецизност благодарение на подразбиращия се водещ 1 при нормализирани числа). При double-precision (64 бита): 1 бит знак, 11 бита експонента (bias = 1023) и 52 бита значеща (53 бита с водещия 1).

Нормализирани и поднормализирани (subnormal) числа

За нормализираните числа при двоичните формати водещият бит на значещата част е винаги 1 и обикновено не се записва (implicit leading 1), което спестява битове и увеличава точността. Когато експонентата е нула в кодиран вид (всички битове на експонентата = 0), стойността може да е нула или поднормализирана (subnormal) — тези числа имат водещ 0 и позволяват "плавно подтичане" (gradual underflow) към нула, но с по-ниска точност.

Специални стойности

  • Експонента всички 1 (максимум) и значеща = 0 → ±∞ (положителна или отрицателна безкрайност).
  • Експонента всички 1 и значеща ≠ 0 → NaN (Not a Number) — резултат от недефинирани операции като 0/0 или корен от отрицателно число.
  • Експонента всички 0 и значеща = 0 → ±0 (има положителен и отрицателен нулев знак).

Пример на преобразуване

Числото 13.25 в десетична система се представя в двоична дроб като 1101.01₂. С движението на точката: 1.10101 × 2³. При положително число знакът е 0, експонента е 3 + bias (например за single: 3 + 127 = 130), а значещата част е дробната част след водещото 1: 10101.... Това дава конкретния битов образец в паметта.

Ограничения и проблеми

  • Ограничена точност: не всички дроби от десетичната система имат точен двоичен еквивалент (например 0.1 не може да се представлява точно), което води до закръгляване.
  • Грешки при закръгляване: при аритметични операции резултатите често трябва да се закръглят до наличната точност; стандартът дефинира режими на закръгляване (най-често "round to nearest, ties to even").
  • Катастрофално изваждане (cancellation): при изваждане на близки по стойност числа значимите цифри могат да се изгубят и относителната грешка да нарасне.
  • Асоциация не важи: (a + b) + c може да не е равно на a + (b + c) поради закръгляване.

Машинен епсилон и обхват

Машинен епсилон (machine epsilon) е най-малката положителна стойност ε такава, че 1 + ε ≠ 1 в даден формат; той характеризира относителната точност. Обхватът на представимите числа зависи от броя битове на експонентата — той определя максималната и минималната (неподнормализирана) величина.

Практически препоръки

  • Не използвайте равенство (==) за сравнение на реални числа; вместо това използвайте толеранс (abs(a-b) < eps).
  • За акумулиране на суми с голям брой елементи използвайте техники като Kahan summation или по-висока точност, за да намалите натрупването на грешки.
  • Ако работите с парични стойности или нужда от точно десетично представяне, обмислете използването на десетични плаващи формати (IEEE 754-2008 decimal) или фиксирана запетая/целочислени единици (например стотинки).
  • Запознайте се с локалните и хардуерните особености на плаващата аритметика в езика/платформата, които използвате (напр. оптимизации компилатор/флагове, различни реализации на math библиотеки).

Обобщение

Представянето на числа с плаваща запетая е компромис между обхват и точност: позволява лесно да се работи с много големи и много малки числа, но въвежда закръгляващи грешки и специални случаи (NaN, ±Inf, ±0). Стандартът IEEE 754 дефинира повечето практически детайли, които гарантират предвидимо поведение при повечето изчисления, но все пак изисква разбиране на неговите ограничения и добри практики при програмиране и научни изчисления.