Close Menu
    Ciekawe

    Opera Portable – przeglądarka internetowa na pendrive bez instalacji

    2026-03-09

    doPDF – wirtualna drukarka do konwersji dokumentów na PDF

    2026-03-08

    Kaspersky Free – podstawowa ochrona antywirusowa za darmo

    2026-03-07
    Facebook X (Twitter) Instagram
    CPP Polska
    Facebook X (Twitter) Instagram
    • Biznes

      Programy VPN – ranking, porównanie i poradnik wyboru (2026)

      2026-02-26

      Obrót, przychód i dochód firmy – czym się różnią i jak je obliczyć?

      2026-02-16

      Restrukturyzacja i upadłość firmy – na czym polegają i jakie są konsekwencje?

      2026-02-14

      Składki ZUS dla firmy jednoosobowej w 2025 roku – ile wynoszą i jak je obliczyć?

      2026-01-28

      Co powinna zawierać pieczątka firmy jednoosobowej? Wymogi prawne i wzór

      2025-12-28
    • Technologie

      Opera Portable – przeglądarka internetowa na pendrive bez instalacji

      2026-03-09

      doPDF – wirtualna drukarka do konwersji dokumentów na PDF

      2026-03-08

      Kaspersky Free – podstawowa ochrona antywirusowa za darmo

      2026-03-07

      PeaZip – darmowy program do otwierania archiwów ZIP i RAR

      2026-03-05

      Jak oglądać filmy VR na komputerze? Wymagania i instrukcja

      2026-03-04
    • Programowanie

      Maszyna stanów oparta o std::variant

      2025-10-07

      std::deque w C++ – kiedy wybrać dwukierunkową kolejkę zamiast vectora

      2025-10-07

      Tablice w C++ od podstaw – deklaracja, inicjalizacja, iteracja i typowe pułapki

      2025-10-07

      itoa i std::to_chars – konwersja liczb na tekst bez narzutu wydajności

      2025-10-07

      strcpy vs strncpy vs std::string – bezpieczne kopiowanie łańcuchów w C++

      2025-10-07
    • Inne

      eSIM w Mobile Vikings – jak wirtualna karta SIM daje Ci wolność bez plastiku, kuriera i wychodzenia z domu

      2025-12-16

      Jak prowadzić blog programistyczny i dzielić się wiedzą?

      2025-06-28
    • Programy VPN – ranking
    CPP Polska
    Home»C++»Precyzyjne obliczenia: liczby po przecinku w C++
    C++

    Precyzyjne obliczenia: liczby po przecinku w C++

    Oskar KlimkiewiczBy Oskar KlimkiewiczUpdated:2025-06-28Brak komentarzy1 Min Read
    Share Facebook Twitter LinkedIn Email Copy Link
    Follow Us
    RSS
    a computer monitor sitting next to a keyboard
    Share
    Facebook Twitter LinkedIn Email Copy Link

    Precyzyjne obliczenia – liczby po przecinku w C++

    W kontekście obliczeń naukowych, finansowych i inżynieryjnych, precyzja reprezentacji liczb zmiennoprzecinkowych w C++ stanowi kluczowe wyzwanie. Tradycyjne typy float i double, implementowane w oparciu o standard IEEE 754, oferują ograniczoną precyzję (7 cyfr dla float, 15–16 dla double), co prowadzi do błędów zaokrągleń w wrażliwych obliczeniach. Niniejszy artykuł kompleksowo analizuje mechanizmy zarządzania precyzją w C++, obejmując zarówno natywne typy zmiennoprzecinkowe, jak i zaawansowane biblioteki obliczeniowe.

    Standardowe typy zmiennoprzecinkowe w C++

    Implementacje zmiennoprzecinkowe w C++ opierają się głównie na standardzie IEEE 754, gdzie:

    • float wykorzystuje 32-bitową precyzję pojedynczą (~7 cyfr dziesiętnych),
    • double – 64-bitową precyzję podwójną (15–16 cyfr dziesiętnych),
    • long double – format rozszerzony (zwykle 80 lub 128 bitów, ale implementacja zależy od platformy).
    
    int main() {
        std::cout << "Precyzja float: " << std::numeric_limits::digits10 << "\n";
        std::cout << "Precyzja double: " << std::numeric_limits::digits10 << "\n";
    }
    

    Wyjście:
    Precyzja float: 6
    Precyzja double: 15

    Limity te wynikają z binarnej reprezentacji liczb, gdzie wartości dziesiętne (np. 0.1) stają się ułamkami okresowymi w systemie dwójkowym, generującymi błędy zaokrągleń.

    Kontrola precyzji wyjściowej

    Manipulator std::setprecision z biblioteki <iomanip> pozwala sterować liczbą cyfr wyświetlanych dla liczb zmiennoprzecinkowych:

    
    int main() {
        double pi = 3.141592653589793;
        std::cout << std::setprecision(5) << pi << "\n"; // 3.1416
        std::cout << std::fixed << std::setprecision(10) << pi; // 3.1415926536
    }
    
    • domyślna precyzja std::cout wynosi 6 cyfr,
    • std::fixed wymusza formatowanie stałoprzecinkowe, ignorując notację wykładniczą,
    • rzeczywista precyzja obliczeń nie zmienia się – manipulacja dotyczy tylko warstwy prezentacyjnej.

    Metody pomiaru precyzji w kodzie

    Biblioteka <limits> dostarcza narzędzi do analizy właściwości typów numerycznych:

    • digits10 – maksymalna liczba cyfr dziesiętnych gwarantująca unikalną reprezentację (bez utraty precyzji),
    • max_digits10 – minimalna liczba cyfr wymagana do wiernego odtworzenia wartości po serializacji.

    Dla typu double:
    digits10 = 15
    max_digits10 = 17

    Aby zagwarantować poprawną deserializację, należy zapisać co najmniej 17 cyfr znaczących.

    Rozszerzenia precyzji obliczeniowej

    Gdy precyzja double jest niewystarczająca, stosuje się wyspecjalizowane biblioteki:

    • Boost.Multiprecision – Oferuje typy cpp_dec_float z dowolną precyzją dziesiętną (ustalaną w czasie kompilacji);
    • Biblioteka MPFR (Multiple Precision Floating-Point Reliable) – Dostarcza typ mpreal z precyzją bitową kontrolowaną dynamicznie;
    • Decimal Floating-Point (IEEE 754-2008) – Biblioteka Boost.Decimal wprowadza typy decimal32, decimal64, decimal128, które przechowują mantysę w systemie dziesiętnym, eliminując błędy reprezentacji (np. 0.1 + 0.2 = 0.3).

    Przykłady:

    
    // Boost.Multiprecision
    using namespace boost::multiprecision;
    cpp_dec_float_50 pi = 3.14159265358979323846264338327950288419716939937510;
    std::cout << std::setprecision(50) << pi; // 3.14159265358979323846264338327950288419716939937510
    
    // MPFR
    mpfr::mpreal x = "0.1", y = "0.2";
    mpfr::mpreal z = x + y; // 0.3 bez błędu zaokrąglenia
    
    // Boost.Decimal
    using namespace boost::decimal;
    decimal64 a("0.1"), b("0.2");
    decimal64 c = a + b; // 0.3 dokładnie
    

    Arytmetyka stałoprzecinkowa

    Dla systemów bez jednostki FPU lub wymagających determinizmu, biblioteka fpm oferuje arytmetykę stałoprzecinkową:

    
    fpm::fixed_16_16 x = 3.141;
    fpm::fixed_16_16 y = std::cos(x); // Funkcje trygonometryczne z intami
    
    • wszystkie obliczenia oparte na liczbach całkowitych,
    • brak błędów zaokrągleń typowych dla liczb zmiennoprzecinkowych,
    • ograniczony zakres wartości w porównaniu do formatów zmiennoprzecinkowych.

    Zastosowania zaawansowane

    • Obliczanie stałych matematycznych – Boost.Math udostępnia precyzyjne wartości stałych (np. π) dla dowolnych typów;
    • Obliczenia faktorów – Dla dużych liczb, biblioteki takie jak GMP lub Boost.Multiprecision radzą sobie z obliczeniami przekraczającymi zakres long long.
    
    // Stała π
    cpp_dec_float_100 pi = boost::math::constants::pi();
    
    // Silnia dużych liczb
    mp::cpp_int factorial(int n) {
        mp::cpp_int r = 1;
        for(int i = 1; i <= n; ++i) r *= i;
        return r; // poprawny wynik dla n=100
    }
    

    Podsumowanie: Wybór strategii precyzyjnych obliczeń

    Scenariusz Rekomendowane rozwiązanie
    Prezentacja danych std::setprecision + std::fixed
    Serializacja liczb max_digits10 + notacja naukowa
    Obliczenia finansowe Boost.Decimal
    Precyzja > 18 cyfr Boost.Multiprecision lub MPFR
    Systemy bez FPU Biblioteki stałoprzecinkowe (fpm)

    Natywne typy C++ są niewystarczające dla aplikacji wymagających dokładności większej niż 10-15 lub operujących na liczbach dziesiętnych bez błędów binarnych. W takich przypadkach biblioteki takie jak Boost.Multiprecision, MPFR lub Boost.Decimal zapewniają kontrolę precyzji i poprawność matematyczną, kosztem wydajności.

    Polecane:

    • Czym jest std::variant i kiedy go stosować
    • Zaawansowane scenariusze z std::visit i wieloma wariantami
    • Historia wyrażeń lambda w C++ od C++03 do C++20
    • Przegląd języka C++ – co nowego w standardach od C++11 do C++23
    • Krótki tutorial menedżera pakietów Conan
    Share. Facebook Twitter LinkedIn Email Copy Link
    Oskar Klimkiewicz
    • Website

    Inżynier oprogramowania specjalizujący się w C++, absolwent Wydziału Elektroniki i Technik Informacyjnych Politechniki Warszawskiej. Od ponad 8 lat projektuje i rozwija systemy o wysokiej dostępności, głównie dla branży fintech i IoT. PS. Zdjęcie wyretuszowane przez AI :)

    Podobne artykuły

    Maszyna stanów oparta o std::variant

    8 Mins Read

    Tablice w C++ od podstaw – deklaracja, inicjalizacja, iteracja i typowe pułapki

    4 Mins Read

    std::deque w C++ – kiedy wybrać dwukierunkową kolejkę zamiast vectora

    4 Mins Read
    Leave A Reply Cancel Reply

    Oglądaj, słuchaj, ćwicz - zdobywaj nowe umiejętności online
    Nie przegap

    Opera Portable – przeglądarka internetowa na pendrive bez instalacji

    Oskar Klimkiewicz4 Mins Read

    W erze mobilności i pracy zdalnej Opera Portable staje się nieocenionym narzędziem dla użytkowników, którzy…

    doPDF – wirtualna drukarka do konwersji dokumentów na PDF

    2026-03-08

    Kaspersky Free – podstawowa ochrona antywirusowa za darmo

    2026-03-07

    PeaZip – darmowy program do otwierania archiwów ZIP i RAR

    2026-03-05
    Social media
    • Facebook
    • Twitter
    • LinkedIn
    O nas
    O nas

    CPP Polska to serwis internetowy poświęcony technologii, programowaniu, IT, biznesowi i finansom. Znajdziesz tu porady, wskazówki i instrukcje dla wszystkich czytelników IT & Tech & Biz.

    Facebook X (Twitter) LinkedIn RSS
    Najnowsze

    Opera Portable – przeglądarka internetowa na pendrive bez instalacji

    2026-03-09

    doPDF – wirtualna drukarka do konwersji dokumentów na PDF

    2026-03-08

    Kaspersky Free – podstawowa ochrona antywirusowa za darmo

    2026-03-07
    Popularne

    Skrajnie niepotrzebne, skrajne przypadki w C++

    2025-06-28

    Wyszukiwanie testów w Google Test – metody i narzędzia

    2025-06-28

    Czy C jest wolniejszy od C++? Zero-cost abstraction w praktyce

    2025-06-28
    © 2026 CPP Polska. Wszelkie prawa zastrzeżone.
    • Lista publikacji
    • Współpraca
    • Kontakt

    Type above and press Enter to search. Press Esc to cancel.