Gdy nie ma FPU. Liczby stałoprzecinkowe w praktyce konstruktora: formaty, pułapki, funkcje elementarne i pomiar
Gdy nie ma FPU. Liczby stałoprzecinkowe w praktyce konstruktora: formaty, pułapki, funkcje elementarne i pomiar
12 listopada 2026
Jednostka zmiennoprzecinkowa (FPU, ang. Floating-Point Unit) jest dziś w mikrokontrolerach średniej klasy czymś zwyczajnym: Cortex-M4F, M7 czy M33 (w wersji z FPU) liczą na liczbach typu float prawie tak szybko jak na całkowitych. Mogłoby się wydawać, że arytmetyka stałoprzecinkowa – sztuka liczenia ułamków za pomocą liczb całkowitych – przeszła do historii razem z 8-bitowymi procesorami. Tak nie jest. Najtańsze mikrokontrolery nadal nie mają FPU, a niektóre nie mają nawet sprzętowego mnożenia. Wiele procesorów sygnałowych audio liczy wyłącznie w formatach stałoprzecinkowych. Nawet najnowsze akceleratory sprzętowe w mikrokontrolerach STM32 przyjmują dane tylko w takiej postaci. W artykule pokazujemy, kiedy liczby stałoprzecinkowe wciąż się opłacają, jak się nimi posługiwać bez przykrych niespodzianek, jakimi metodami liczyć sinus czy pierwiastek bez FPU oraz jak sprawdzić, czy wybrana metoda jest rzeczywiście szybsza.
Czy to jeszcze potrzebne?
Bez FPU każde działanie na liczbie typu float wykonuje procedura biblioteczna, która rozkłada liczbę na znak, wykładnik i mantysę, liczy na liczbach całkowitych i składa wynik z powrotem. Jedno mnożenie zajmuje wtedy dziesiątki cykli zegara, a funkcje trygonometryczne – setki lub tysiące. Autor artykułu o szybkim sinusie dla mikrokontrolerów STM32, opublikowanego w serwisie Habr, zmierzył, że na Cortex-M4 (którego FPU liczy tylko w pojedynczej precyzji) biblioteczna funkcja sin podwójnej precyzji zajmuje ok. 2500 cykli na jedno wywołanie. W regulatorze, który ma wykonać obliczenia kilka tysięcy razy na sekundę, to za dużo.
Jakimi zasobami arytmetycznymi dysponują popularne rodziny mikrokontrolerów, zestawia tabela 1. Arytmetyka stałoprzecinkowa pozostaje naturalnym wyborem w czterech sytuacjach. Pierwsza to najtańsze układy: Cortex-M0 i M0+, 8-bitowe AVR czy chiński CH32V003 z rdzeniem RISC-V w odmianie RV32EC, pozbawionej rozszerzenia M, czyli sprzętowego mnożenia. Druga to procesory sygnałowe audio – na przykład popularny ADAU1701...