C – typy liczbowe

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));


Opublikowano

w

przez

Tagi: