Instrukcja (działanie) z operatorem arytmetycznym na najmniej dwóch liczbach powoduje konwersję wszystkich liczb z typu całkowitego na typ zmiennoprzecinkowy pod warunkiem, że choć jedna z tych liczb będzie zmiennoprzecinkowa.
Przypisanie liczby zmiennoprzecinkowej do zmiennej typu całkowitoliczbowego spowoduje utratę części ułamkowej tej liczby.
- Precyzja typu liczbowego w C określa ilość cyfr znaczących, które może reprezentować liczba,
- Cyfry znaczące to cyfry, które gwarantują dokładność reprezentacji wyniku,
- Dokładność (ang. accuracy) to różnica między wartością obliczoną (lub reprezentowaną) a rzeczywistą wartością. Nawet liczba o wysokiej precyzji może być niedokładna, jeśli jest wynikiem błędu obliczeń.
Precyzja typów zmiennoprzecinkowych w języku C jest wynikiem współdziałania:
1. Standardu C – definiuje minimalne wymagania (np. C89, C99, C11).
2. Architektury komputera – określa sposób przechowywania i przetwarzania liczb zmiennoprzecinkowych, w zależności od możliwości sprzętowych platformy.
3. Kompilatora – determinuje, jak typy są mapowane na reprezentacje sprzętowe (np. standard IEEE 754).
IEEE 754 to międzynarodowy standard opisujący sposób reprezentacji i operacji na liczbach zmiennoprzecinkowych w komputerach.
Przykładowo typ całkowitoliczbowy w C może mieć precyzję 16-bitową lub 32-bitową. Zmiennoprzecinkowy 32-bitową (pojedynczej precyzji) lub 64-bitową (podwójnej precyzji).
Sposób reprezentacji i obliczania liczb wg IEEE 754 znajduje się w linku poniżej (21.11.2024):
http://lidia-js.kis.p.lodz.pl/Systemy_Liczbowe/standard_754_teoria.php
Opcje kompilatora mogą modyfikować precyzję, np.:
W kompilatorze GCC flagi takie jak:
- -mfpmath=sse
- -mfpmath=387
mogą zmieniać sposób obliczeń zmiennoprzecinkowych.
Kompilator, który wspiera standard IEEE 754 na danej platformie, daje przewidywalny i zgodny ze standardem sposób reprezentacji typów liczbowych np. short, int, float, double i gwarantuje zgodność tej reprezentacji podczas kompilacji na innej platformie pod warunkiem, że i ta platforma wpiera standard IEEE 754. Ideą standaryzacji jest zapewnienie zgodności, jednolitości i przenośności tej samej implementacji na różne platformy, systemy, urządzenia.
W systemie MacOS Sequoia (2024), na procesorze Apple M1 Pro, z kompilatorem clang++ w wersji:
Apple clang version 16.0.0 (clang-1600.0.26.4)
Target: arm64-apple-darwin24.1.0
uzyskano następujące precyzje typów liczbowych:
printf("Rozmiar short: %zu bajty\n", sizeof(short));
printf("Rozmiar int: %zu bajty\n", sizeof(int));
printf("Rozmiar long: %zu bajty\n", sizeof(long));
printf("Rozmiar float: %zu bajty\n", sizeof(float));
printf("Rozmiar double: %zu bajty\n", sizeof(double));
printf("Rozmiar char: %zu bajty\n", sizeof(char));
printf("Rozmiar short int: %zu bajty\n", sizeof(short int));
printf("Rozmiar long int: %zu bajty\n", sizeof(long int));
printf("Rozmiar long long int: %zu bajty\n", sizeof(long long int));
printf("Rozmiar unsigned long long int: %zu bajty\n", sizeof(unsigned long long int));
printf("Rozmiar signed long long int: %zu bajty\n", sizeof(signed long long int));