2018 Marcin Kukliński. Niesforne bity i bajty

Podobne dokumenty
Wprowadzenie do architektury komputerów systemy liczbowe, operacje arytmetyczne i logiczne

Podstawy Informatyki

Podstawy Informatyki. Metalurgia, I rok. Wykład 3 Liczby w komputerze

Podstawy Informatyki. Inżynieria Ciepła, I rok. Wykład 5 Liczby w komputerze

Programowanie w C++ Wykład 2. Katarzyna Grzelak. 5 marca K.Grzelak (Wykład 1) Programowanie w C++ 1 / 41

Programowanie w C++ Wykład 2. Katarzyna Grzelak. 4 marca K.Grzelak (Wykład 1) Programowanie w C++ 1 / 44

Kodowanie liczb. Reprezentacja liczb całkowitych. Standard IEEE 754. dr inż. Jarosław Forenc

Naturalny kod binarny (NKB)

Pracownia Komputerowa wykład VI

C++ wprowadzanie zmiennych

ARCHITEKTURA SYSTEMÓW KOMPUTEROWYCH

Arytmetyka stało i zmiennoprzecinkowa

Reprezentacja stałoprzecinkowa. Reprezentacja zmiennoprzecinkowa zapis zmiennoprzecinkowy liczby rzeczywistej

Podstawy Programowania ELEMENTY PROGRAMU i TYPY DANYCH

Liczby rzeczywiste są reprezentowane w komputerze przez liczby zmiennopozycyjne. Liczbę k można przedstawid w postaci:

Wstęp do programowania

Reprezentacja symboli w komputerze. Liczby całkowite i zmiennoprzecinkowe. Programowanie Proceduralne 1

Arytmetyka binarna - wykład 6

Metody numeryczne II. Reprezentacja liczb

Kodowanie liczb całkowitych w systemach komputerowych

Pracownia Komputerowa wykład IV

Podstawy Informatyki. Wykład 2. Reprezentacja liczb w komputerze

SYSTEMY LICZBOWE. SYSTEMY POZYCYJNE: dziesiętny (arabski): 0, 1, 2, 3, 4, 5, 6, 7, 8, 9 rzymski: I, II, III, V, C, M

Temat 1: Podstawowe pojęcia: program, kompilacja, kod

ARCHITEKTURA KOMPUTERÓW Liczby zmiennoprzecinkowe

Kod IEEE754. IEEE754 (1985) - norma dotycząca zapisu binarnego liczb zmiennopozycyjnych (pojedynczej precyzji) Liczbę binarną o postaci

Prefiksy binarne. kibibit (Kibit) mebibit (Mibit) gibibit (Gibit) tebibit (Tibit) pebibit (Pibit) exbibit (Eibit) zebibit (Zibit) yobibit (Yibit)

Adam Korzeniewski p Katedra Systemów Multimedialnych

Wstęp do informatyki- wykład 4 Deklaracja zmiennych Typy

Adam Korzeniewski p Katedra Systemów Multimedialnych

Pracownia Komputerowa wyk ad VI

Teoretyczne Podstawy Informatyki

Pracownia Komputerowa wykład V

Algorytmy i struktury danych. wykład 1

Dokładność obliczeń numerycznych

Pracownia Komputerowa wyk ad IV

Zwykle liczby rzeczywiste przedstawia się w notacji naukowej :

Technologie Informacyjne

Wielkości liczbowe. Wykład z Podstaw Informatyki dla I roku BO. Piotr Mika

Instrukcja do ćwiczeń nr 4 typy i rodzaje zmiennych w języku C dla AVR, oraz ich deklarowanie, oraz podstawowe operatory

Architektura komputerów

Wielkości liczbowe. Wykład z Podstaw Informatyki. Piotr Mika

Dr inż. Grażyna KRUPIŃSKA. D-10 pokój 227 WYKŁAD 2 WSTĘP DO INFORMATYKI

Program w C. wer. 12 z drobnymi modyfikacjami! Wojciech Myszka :59:

Typ użyty w deklaracji zmiennej decyduje o rodzaju informacji, a nazwa zmiennej symbolicznie opisuje wartość.

ARCHITEKRURA KOMPUTERÓW Kodowanie liczb ze znakiem

Wstęp do programowania

Przedmiot: Urządzenia techniki komputerowej Nauczyciel: Mirosław Ruciński

Dane, informacja, programy. Kodowanie danych, kompresja stratna i bezstratna

Języki i metodyka programowania. Typy, operatory, wyrażenia. Wejście i wyjście.

Pracownia komputerowa. Dariusz Wardecki, wyk. VI

Reprezentacja symboli w komputerze.

1 Podstawy c++ w pigułce.

DYDAKTYKA ZAGADNIENIA CYFROWE ZAGADNIENIA CYFROWE

Wstęp do informatyki- wykład 4 Deklaracja zmiennych Typy Instrukcja selekcji if-else

dr inż. Jarosław Forenc

Stan wysoki (H) i stan niski (L)

Dr inż. Grażyna KRUPIŃSKA. D-10 pokój 227 WYKŁAD 7 WSTĘP DO INFORMATYKI

Wstęp do Informatyki. Reprezentacja liczb w komputerze Arytmetyka stało- i zmiennoprzecinkowa Przechowywanie danych pliki i foldery

1 P roste e t ypy p d a d n a ych c - c ąg ą g d a d l a szy 2 T y T py p z ł z o ł żo ż ne e d a d n a ych c : T BLICE

Podstawy programowania. Wykład Co jeszcze... Przypomnienia, uzupełnienia. Krzysztof Banaś Podstawy programowania 1

Informatyka 1. Wykład nr 5 ( ) Politechnika Białostocka. - Wydział Elektryczny. dr inŝ. Jarosław Forenc

Programowanie I C / C++ laboratorium 02 Składnia pętli, typy zmiennych, operatory

Systemy liczbowe. 1. Przedstawić w postaci sumy wag poszczególnych cyfr liczbę rzeczywistą R = (10).

Języki i metodyka programowania. Reprezentacja danych w systemach komputerowych

Podstawy Informatyki. Kompilacja. Historia. Metalurgia, I rok. Kompilatory C++ Pierwszy program. Dyrektywy preprocesora. Darmowe:

Program w C. wer. 10 z drobnymi modyfikacjami! Wojciech Myszka :28:

Metody numeryczne Technika obliczeniowa i symulacyjna Sem. 2, EiT, 2014/2015

Kodowanie informacji. Kody liczbowe

Obliczenia Naukowe. O arytmetyce komputerów, Czyli jak nie dać się zaskoczyć. Bartek Wilczyński 29.

Architektura komputerów Reprezentacja liczb. Kodowanie rozkazów.

4 Standardy reprezentacji znaków. 5 Przechowywanie danych w pamięci. 6 Literatura

Pułapki liczb zmiennoprzecinkowych. Adam Sawicki asawicki.info

LICZBY ZMIENNOPRZECINKOWE

( wykł. dr Marek Piasecki )

Podstawy Informatyki. Metalurgia, I rok. Wykład 6 Krótki kurs C++

Cyfrowy zapis informacji. 5 grudnia 2013 Wojciech Kucewicz 2

Systemy zapisu liczb.

Podstawy Informatyki. Inżynieria Ciepła, I rok. Wykład 10 Kurs C++

LABORATORIUM PROCESORY SYGNAŁOWE W AUTOMATYCE PRZEMYSŁOWEJ. Zasady arytmetyki stałoprzecinkowej oraz operacji arytmetycznych w formatach Q

Technologie Informacyjne Wykład 4

Metoda znak-moduł (ZM)

Zapis liczb binarnych ze znakiem

Kod U2 Opracował: Andrzej Nowak

Kod znak-moduł. Wartość liczby wynosi. Reprezentacja liczb w kodzie ZM w 8-bitowym formacie:

Pracownia Komputerowa wyk ad V

Architektura komputerów

Temat 4. Kodowanie liczb

Informatyka 1. Wykład nr 4 ( ) Plan wykładu nr 4. Politechnika Białostocka. - Wydział Elektryczny

Arytmetyka stało- i zmiennoprzecinkowa. 1. Informacje wstępne

1 Podstawy c++ w pigułce.

1.1. Pozycyjne systemy liczbowe

Dodatek do Wykładu 01: Kodowanie liczb w komputerze

Wstęp do Programowania, laboratorium 02

Kod uzupełnień do dwóch jest najczęściej stosowanym systemem zapisu liczb ujemnych wśród systemów binarnych.

Języki i metodyka programowania. Wprowadzenie do języka C

Programowanie w języku C++

Wstęp do Programowania 2

Pozycyjny system liczbowy

Dane, informacja, programy. Kodowanie danych, kompresja stratna i bezstratna

Transkrypt:

Niesforne bity i bajty

2 Kilka słów O mnie @ senghe@gmail.com https://www.linkedin.com/in/marcin-kukliński

3

2017 InspiraSign - Template All rights reserved

Ekipa cpp-polska 5 Marcin Kukliński Wojciech Razik Michał Rudowicz Bartłomiej Filipek Kompilacja & Mario::Edit CppNews & Modern C++ Modern C++ C++17

Nasze statystyki 6

Nasze statystyki 7

Znajdziecie nas na: 8 @CppPolskaOfficial @CppPolska @CppPolska

Naszym celem jest: 9 Propagowanie wiedzy o nowoczesnym C++

Może do nas dołączysz? 10 Ty

11 Wracając do bitów

12 To jest bit 1

13 To też jest bit 0

14 1 A to jest bajt 1010111

15 Liczby całkowite

Kod uzupełnień do jedności (U1) 16

Kod uzupełnień do jedności (U1) 17 Kod uzupełnień do jedności to sposób zapisu liczb całkowitych oznaczany jako ZU1 lub U1. Liczby dodatnie zapisywane są jak w naturalnym kodzie binarnym, przy czym najbardziej znaczący bit traktowany jako bit znaku musi mieć wartość 0. Do reprezentowania liczb ujemnych wykorzystywana jest bitowa negacja danej liczby, co sprawia, że bit znaku ma wartość 1. Źródło: https://pl.wikipedia.org/wiki/kod_uzupełnień_do_jedności

Kod uzupełnień do jedności (U1) 18 01000011

Kod uzupełnień do jedności (U1) 19-2 7 2 6 2 5 2 4 2 3 2 2 2 1 2 0 01000011

Kod uzupełnień do jedności (U1) 20 2 6 2 1 2 0 01000011

Kod uzupełnień do jedności (U1) 21 64 2 1 01000011

Kod uzupełnień do jedności (U1) 22 64 2 1 01000011 = 67

Kod uzupełnień do jedności (U1) 23 01000011 = 67 10111100

Kod uzupełnień do jedności (U1) 24 01000011 = 67-2 7 2 6 2 5 2 4 2 3 2 2 2 1 2 0 10111100

Kod uzupełnień do jedności (U1) 25 01000011 = 67-2 7 2 5 2 4 2 3 2 2 10111100

Kod uzupełnień do jedności (U1) 26 01000011 = 67-128 32 16 8 4 10111100

Kod uzupełnień do jedności (U1) 27 01000011 = 67-128 32 16 8 4 +1 10111100

Kod uzupełnień do jedności (U1) 28 01000011 = 67-128 32 16 8 4 +1 10111100 = -67

29 Co z zerem?

U1 daje nam dwie wartości zerowe 30 Zero dodatnie: 00000000 Zero ujemne: 11111111

Kod uzupełnień do dwóch (U2) 31

Kod uzupełnień do dwóch (U2) 32 Kod uzupełnień do dwóch (w skrócie U2 lub ZU2) system reprezentacji liczb całkowitych w dwójkowym systemie pozycyjnym. Jest obecnie najpopularniejszym sposobem zapisu liczb całkowitych w systemach cyfrowych. ( ) Zaletą tego kodu jest również istnienie tylko jednego zera. Przedział kodowanych liczb nie jest przez to symetryczny. Źródło: https://pl.wikipedia.org/wiki/kod_uzupełnień_do_dwóch

Kod uzupełnień do dwóch (U2) 33 01000011

Kod uzupełnień do dwóch (U2) 34-2 7 2 6 2 5 2 4 2 3 2 2 2 1 2 0 01000011

Kod uzupełnień do dwóch (U2) 35 2 6 2 1 2 0 01000011

Kod uzupełnień do dwóch (U2) 36 64 2 1 01000011

Kod uzupełnień do dwóch (U2) 37 64 2 1 01000011 = 67

Kod uzupełnień do dwóch (U2) 38 01000011 = 67 10111100

Kod uzupełnień do dwóch (U2) 39 01000011 = 67 10111101

Kod uzupełnień do dwóch (U2) 40 01000011 = 67-2 7 2 6 2 5 2 4 2 3 2 2 2 1 2 0 10111101

Kod uzupełnień do dwóch (U2) 41 01000011 = 67-2 7 2 5 2 4 2 3 2 2 2 0 10111101

Kod uzupełnień do dwóch (U2) 42-128 01000011 = 67 32 16 8 4 1 10111101

Kod uzupełnień do dwóch (U2) 43-128 01000011 = 67 32 16 8 4 10111101 = -67 1

Kod uzupełnień do dwóch (U2) 44 unsigned char 0.. 255

Kod uzupełnień do dwóch (U2) 45 unsigned char 0.. 255 signed char -128.. 127

46 Dlaczego to jest ważne?

Co mówi standard 47 The range of representable values for a signed integer type is 2 N 1 to 2 N 1 1 (inclusive), where N is called the range exponent of the type Źródło: http://eel.is/c++draft/basic.fundamental

48 Integer Overflow

Integer Overflow 49 Wyrzucenie wyjątku INT_MAX + 10 = Exception

Integer Overflow 50 Przycięcie wyniku INT_MAX + 10 = 10

Integer Overflow 51 Saturacja INT_MAX + 10 = INT_MAX

Co mówi standard 52 For each of the standard signed integer types, there exists a corresponding (but different) standard unsigned integer type: unsigned char, unsigned short int, unsigned int, unsigned long int, and unsigned long long int. Likewise, for each of the extended signed integer types, there exists a corresponding extended unsigned integer type. The standard and extended unsigned integer types are collectively called unsigned integer types. An unsigned integer type has the same range exponent N as the corresponding signed integer type. The range of representable values for the unsigned type is 0 to 2 N 1 (inclusive); arithmetic for the unsigned type is performed modulo 2 N. [ Note: Unsigned arithmetic does not overflow. Overflow for signed arithmetic yields undefined behavior Źródło: http://eel.is/c++draft/basic.fundamental

53 Integer Overflow to UB

Undefined Behavior 54 Nie mamy pewności, co zostanie wykonane przez procesor

Undefined Behavior 55 Nie mamy pewności, co zostanie wykonane przez procesor Kompilator zakłada, że niezdefiniowane zachowanie nigdy nie ma miejsca

Undefined Behavior 56 Nie mamy pewności, co zostanie wykonane przez procesor Kompilator zakłada, że niezdefiniowane zachowanie nigdy nie ma miejsca Cała odpowiedzialność zostaje zrzucona na programistę

57 UB vs Implementation Defined

Jak radzić sobie z Integer Overflow? 58 int add(int a, int b) { } int sum = a + b; if (a > 0 && b > 0) { if (sum < a) { throw E(); } if (sum < b) { } } return sum; throw E();

Jak radzić sobie z Integer Overflow? 59 int add(int a, int b) { int sum = a + b; if (a > 0 && b > 0) { // if (sum < a) { // throw E(); // } // if (sum < b) { // throw E(); // } } } return sum;

Jak radzić sobie z Integer Overflow? 60 unsigned add(unsigned a, unsigned b) { if (INT_MAX-a < b) { throw E(); } return a + b; }

Jak radzić sobie z Integer Overflow? 61 unsigned add(unsigned a, unsigned b) { if (INT_MAX-a < b) { throw E(); } return a + b; }

Jak radzić sobie z Integer Overflow? 62 int add(int a, int b) { } if (b > 0 && a > 0) { if (INT_MAX-a < b) { throw E(); } } else if (b < 0 && a < 0) { if (INT_MIN-a > b) { } throw E(); } return a + b;

Jak radzić sobie z Integer Overflow? 63 int add(int a, int b) { } if (b > 0 && a > 0) { if (INT_MAX-a < b) { throw E(); } } else if (b < 0 && a < 0) { if (INT_MIN-a > b) { } throw E(); } return a + b;

Jak radzić sobie z Integer Overflow? 64 int add(int a, int b) { } if (b > 0 && a > 0) { if (INT_MAX-a < b) { throw E(); } } else if (b < 0 && a < 0) { if (INT_MIN-a > b) { } throw E(); } return a + b;

Jak radzić sobie z Integer Overflow? 65 int add(int a, int b) { } if (b > 0 && a > 0) { if (INT_MAX-a < b) { throw E(); } } else if (b < 0 && a < 0) { if (INT_MIN-a > b) { } throw E(); } return a + b;

66 Ukryty Integer Overflow

Ukryty Integer Overflow 67 int main(int argc, char* argv[]) { uint64_t v = 0x80000000 * 2; std::cout << std::hex << v << std::endl; return 0; }?

Ukryty Integer Overflow 68 int main(int argc, char* argv[]) { uint64_t v = 0x80000000 * 2; std::cout << std::hex << v << std::endl; return 0; }

Ukryty Integer Overflow 69 int main(int argc, char* argv[]) { uint32_t v = 0x80000000 * 2; std::cout << std::hex << v << std::endl; return 0; }

Ukryty Integer Overflow 70 int main(int argc, char* argv[]) { uint64_t v = 0x80000000 * 2; std::cout << std::hex << v << std::endl; return 0; }

Ukryty Integer Overflow 71 int main(int argc, char* argv[]) { uint64_t v = 0x80000000ULL * 2; std::cout << std::hex << v << std::endl; return 0; }

Ukryty Integer Overflow 72 int main(int argc, char* argv[]) { uint64_t v = 0x80000000 * 2ULL; std::cout << std::hex << v << std::endl; return 0; }

Ukryty Integer Overflow 73 int main(int argc, char* argv[]) { uint64_t v = 0x80000000 * 2ULL; std::cout << std::hex << v << std::endl; return 0; }

74 Czym jest promocja typu?

Czym jest promocja typu 75 Promocją typu nazywamy proces polegający na zwiększeniu ilości bajtów przechowujących konkretną wartość bez zmiany tej wartości.

Czym jest promocja typu 76 8 bit => 16 bit

Czym jest promocja typu 77 8 bit => 16 bit unsigned 00101001 => 00000000 00101001 unsigned 10101001 => 00000000 10101001

Czym jest promocja typu 78 8 bit => 16 bit unsigned 00101001 => 00000000 00101001 unsigned 10101001 => 00000000 10101001 signed 00101001 => 00000000 00101001 signed 10101001 => 11111111 10101001

79 Czym jest konwersja typu?

Czym jest konwersja typu? 80 Konwersją typu nazywamy proces polegający na zmianie kodowania przechowywanej wartości, niekoniecznie zmieniając przy tym samą wartość.

Czym jest konwersja typu? 81 int32_t 42 => 00000000 00000000 00000000 00101010

Czym jest konwersja typu? 82 int32_t 42 => 00000000 00000000 00000000 00101010 float 42.0f => 01000010 00101000 00000000 00000000

Ukryty Integer Overflow 83 #include <iostream> int main(int argc, char* argv[]) { std::cout << abs(int_min) << std::endl; return 0; }?

Ukryty Integer Overflow 84 #include <iostream> int main(int argc, char* argv[]) { std::cout << abs(int_min) << std::endl; return 0; }

Zwykła implementacja 85 unsigned abs(int value) { if (value < 0) { return -value; } return value; }

Poprawna implementacja 86 unsigned safe_abs(int value) { if (value == INT_MIN) { throw E{}; } return abs(value); }

87 Big Integer

Big Integer 88 Każda cyfra przechowywana jest jako kolejny element tablicy (niekoniecznie w formie dziesiętnej)

Big Integer 89 Każda cyfra przechowywana jest jako kolejny element tablicy (niekoniecznie w formie dziesiętnej) Operacje na Big Integer-ach przypominają operacje pisemne stosowane w szkole podstawowej

Big Integer 90 Każda cyfra przechowywana jest jako kolejny element tablicy (niekoniecznie w formie dziesiętnej) Operacje na Big Integer-ach przypominają operacje pisemne stosowane w szkole podstawowej Biblioteka standardowa C++ nie posiada implementacji dla Big Integer

Big Integer 91 Każda cyfra przechowywana jest jako kolejny element tablicy (niekoniecznie w formie dziesiętnej) Operacje na Big Integer-ach przypominają operacje pisemne stosowane w szkole podstawowej Biblioteka standardowa C++ nie posiada implementacji dla Big Integer Biblioteka Boost posiada implementację Big Integer: boost/multiprecision/cpp_int

Big Integer 92 Zaleta: Ogarniamy duże liczby

Big Integer 93 Zaleta: Ogarniamy duże liczby Wada: Procesory natywnie nie wspierają Big Integer-ów

Big Integer 94 Zaleta: Ogarniamy duże liczby Wada: Procesory natywnie nie wspierają Big Integer-ów Wada: Im większa liczba, tym wolniej się liczy

95 Ułamki bitowe

Ułamki bitowe 96 14.0625dec =?bin

Ułamki bitowe 97 14.0625dec =?bin 14 / 2 = 7 0 7 / 2 = 3 1 3 / 2 = 1 1 1 / 2 = 0 1

Ułamki bitowe 98 14.0625dec = 1110.?bin

Ułamki bitowe 99 14.0625dec = 1110.?bin 0.0625 * 2 = 0.125 0.125 * 2 = 0.25 0.25 * 2 = 0.5 0.5 * 2 = 1.0 0 * 2 = 0

Ułamki bitowe 100 14.0625dec = 1110.00010bin

Ułamki bitowe 101 14.0625dec = 1110.00010000000bin

Ułamki bitowe 102 Stosując ułamki bitowe, to my decydujemy o ich dokładności

Ułamki bitowe 103 Stosując ułamki bitowe, to my decydujemy o ich dokładności Na ułamkach bitowych można operować podobnie jak na liczbach całkowitych

Ułamki bitowe 104 Stosując ułamki bitowe, to my decydujemy o ich dokładności Na ułamkach bitowych można operować podobnie jak na liczbach całkowitych Biblioteka standardowa C++ nie posiada implementacji dla liczb stałoprzecinkowych

Ułamki bitowe 105 Stosując ułamki bitowe, to my decydujemy o ich dokładności Na ułamkach bitowych można operować podobnie jak na liczbach całkowitych Biblioteka standardowa C++ nie posiada implementacji dla liczb stałoprzecinkowych Przykładowa implementacja: http://johnmcfarlane.github.io/ fixed_point

106 Liczby zmiennoprzecinkowe

Ile razy zostanie wykonana pętla? 107 #include <iostream> int main() { float i=0.0f; do { std::cout << "Loop " << std::endl; i+=0.1f; } while (i!= 1.0f); }

Ile razy zostanie wykonana pętla? 108 #include <iostream> int main() { float i=0.0f; do { std::cout << "Loop " << std::endl; i+=0.1f; } while (i!= 1.0f); } Odpowiedź: to jest pętla nieskończona

109 Ale dlaczego?

Niedokładne liczby zmiennoprzecinkowe 110 #include <iostream> #include <iomanip> int main() { std::cout << std::setprecision(10) << 0.1f << std::endl; } Na wyjściu: 0.1000000015

Co pojawi się na wyjściu? 111 #include <iostream> #include <iomanip> int main() { float amountofproduct = 254.99f; unsigned long int quantity = 100000000; float amountofcheckout = amountofproduct*quantity; } std::cout << std::setprecision(15) << amountofcheckout << std::endl; return 0;

Co pojawi się na wyjściu? 112 #include <iostream> #include <iomanip> int main() { float amountofproduct = 254.99f; unsigned long int quantity = 100000000; float amountofcheckout = amountofproduct*quantity; } std::cout << std::setprecision(15) << amountofcheckout << std::endl; return 0; Odpowiedź: 25499000832

Co mówi standard 113 There are three floating-point types: float, double, and long double. The type double provides at least as much precision as float, and the type long double provides at least as much precision as double. The set of values of the type float is a subset of the set of values of the type double; the set of values of the type double is a subset of the set of values of the type long double. The value representation of floating-point types is implementation-defined. [ Note: This document imposes no requirements on the accuracy of floating-point operations; see also [support.limits]. end note ] Integral and floating-point types are collectively called arithmetic types. Specializations of the standard library template std::numeric_limits shall specify the maximum and minimum values of each arithmetic type for an implementation. Źródło: http://eel.is/c++draft/basic.fundamental

114 Standard IEEE 754

Standard IEEE 754 115 0.1dec = 00111101110011001100110011001101bin

Standard IEEE 754 116 Znak Wykładnik Mantysa 0.1dec = 00111101110011001100110011001101bin

Standard IEEE 754 117 Znak Wykładnik Mantysa 0.1dec = 00111101110011001100110011001101bin float 1 bit 8 bitów 23 bity

Standard IEEE 754 118 Znak Wykładnik Mantysa 0.1dec = 00111101110011001100110011001101bin float double 1 bit 8 bitów 23 bity 1 bit 11 bitów 52 bity

Standard IEEE 754 119 Znak Wykładnik Mantysa 0.1dec = 00111101110011001100110011001101bin float double 1 bit 8 bitów 23 bity 1 bit 11 bitów 52 bity bias = 127 bias = 1023

120 Float to bin

Standard IEEE 754 121-41.27dec =

Standard IEEE 754 122 Znak -41.27dec = 1

Standard IEEE 754 123 Znak -41.27dec = 1 41 / 2 = 20 1 20 / 2 = 10 0 10 / 2 = 10 0 5 / 2 = 2 1 2 / 2 = 1 0 1 / 2 = 0 1

Standard IEEE 754 124 Znak Mantysa -41.27dec = 1 101001.

Standard IEEE 754 125-41.27dec = 1 101001. Znak Mantysa 0.27 * 2 = 0.54 0.54 * 2 = 1.08 0.08 * 2 = 0.16 0.16 * 2 = 0.32 0.32 * 2 = 0.64 0.64 * 2 = 1.28 0.28 * 2 = 0.56 0.56 * 2 = 1.12 0.12 * 2 = 0.24 0.24 * 2 = 0.48 0.48 * 2 = 0.96 0.96 * 2 = 1.92 0.92 * 2 = 1.84 0.84 * 2 = 1.68 0.68 * 2 = 1.36 0.36 * 2 = 0.72 0.72 * 2 = 1.44 0.44 * 2 = 0.88 0.88 * 2 = 1.76 0.76 * 2 = 1.52 0.52 * 2 = 1.04 0.04 * 2 = 0.08

Standard IEEE 754 126 Znak Mantysa -41.27dec = 1 101001.010001010001111010111

Standard IEEE 754 127 Znak Mantysa -41.27dec = 1 101001.010001010001111011 2 5

Standard IEEE 754 128 Znak Mantysa -41.27dec = 1 1.01001010001010001111011 2 5

Standard IEEE 754 129 Znak Mantysa -41.27dec = 1 01001010001010001111011 127+5 = 132dec =

Standard IEEE 754 130 Znak Mantysa -41.27dec = 1 01001010001010001111011 127+5 = 132dec = 132 / 2 = 66 0 66 / 2 = 33 0 33 / 2 = 16 1 = 10000100bin 16 / 2 = 8 0 8 / 2 = 4 0 4 / 2 = 2 0 2 / 2 = 1 0 1 / 2 = 0 1

Standard IEEE 754 131 Znak Wykładnik Mantysa -41.27dec = 11000010001001010001010001111011

Standard IEEE 754 132 Znak Wykładnik Mantysa -41.27dec = 11000010001001010001010001111011

Standard IEEE 754 133 Znak Wykładnik Mantysa -41.27dec = 11000010001001010001010001111011

134 Bin to float

Standard IEEE 754 135 Znak Wykładnik Mantysa?dec = 11000010001001010001010001111011

Standard IEEE 754 136 Znak Wykładnik Mantysa?dec = 11000010001001010001010001111011 L = (-1) Z * M * 2 K-bias

Standard IEEE 754 137 Znak Wykładnik Mantysa?dec = 11000010001001010001010001111011 L = (-1) Z * M * 2 K-bias

Standard IEEE 754 138 Znak Wykładnik Mantysa?dec = 11000010001001010001010001111011 L = (-1) 1 * M * 2 K-bias

Standard IEEE 754 139 Znak Wykładnik Mantysa?dec = 11000010001001010001010001111011 L = (-1) 1 * M * 2 K-127

Standard IEEE 754 140 Znak Wykładnik Mantysa?dec = 11000010001001010001010001111011 L = (-1) 1 * M * 2 132-127

Standard IEEE 754 141 Znak Wykładnik Mantysa?dec = 11000010001001010001010001111011 L = (-1) 1 * 1.2896875143051147 * 2 132-127

Standard IEEE 754 142 Znak Wykładnik Mantysa?dec = 11000010001001010001010001111011 L = -1 * 1.2896875143051147 * 2 5

Standard IEEE 754 143 Znak Wykładnik Mantysa?dec = 11000010001001010001010001111011 L = -1.2896875143051147 * 32

Standard IEEE 754 144 Znak Wykładnik Mantysa?dec = 11000010001001010001010001111011 L = -41.2700004578

Standard IEEE 754 145 Znak Wykładnik Mantysa?dec = 11000010001001010001010001111011 L = -41.2700004578

Standard IEEE 754 146 Znak Wykładnik Mantysa?dec = 11000010001001010001010001111011 L = -41.2700004578

Standard IEEE 754 147 Wartości specjalne NaN => 01111111111111111111111111111111

Standard IEEE 754 148 Wartości specjalne NaN => 01111111111111111111111111111111 -INF => 11111111100000000000000000000000

Standard IEEE 754 149 Wartości specjalne NaN => 01111111111111111111111111111111 -INF => 11111111100000000000000000000000 +INF => 01111111100000000000000000000000

150 Boost multiprecision

Boost multiprecision 151 // Sprawdzamy, czy możemy osiągnąć wartość 0.1 long double a = 0.1; std::cout << std::setprecision(100) << a << std::endl; cpp_dec_float_100 b("0.1"); std::cout << std::setprecision(100) << b << std::endl;

Boost multiprecision 152 long double a = 0.1; std::cout << std::setprecision(100) << a << std::endl; cpp_dec_float_100 b("0.1"); std::cout << std::setprecision(100) << b << std::endl; Na wyjściu: 0.1000000000000000055511151231257827021181583404541015625 0.1

Boost multiprecision 153 cpp_dec_float_100 counter; // Domyślna wartość jest ustawiana na 0 do { std::cout << "Loop " << std::endl; counter += cpp_dec_float_100("0.1"); } while (counter!= 1.0);

Boost multiprecision 154 cpp_dec_float_100 counter; // Domyślna wartość jest ustawiana na 0 do { std::cout << "Loop " << std::endl; counter += cpp_dec_float_100("0.1"); } while (counter!= 1.0); Pętla wykona się dokładnie 10 razy

Boost multiprecision 155 float amountofproduct = 254.99f; unsigned long int quantity = 100000000; float amountofcheckout = amountofproduct*quantity; std::cout << std::setprecision(30) << amountofcheckout << std::endl; cpp_dec_float_50 amountofproduct2 = cpp_dec_float_50("254.99"); cpp_dec_float_50 quantity2 = cpp_dec_float_50("100000000"); cpp_dec_float_50 amountofcheckout2 = cpp_dec_float_50(amountofproduct2*quantity2); std::cout << std::setprecision(30) << amountofcheckout2 << std::endl;

Boost multiprecision 156 float amountofproduct = 254.99f; unsigned long int quantity = 100000000; float amountofcheckout = amountofproduct*quantity; std::cout << std::setprecision(30) << amountofcheckout << std::endl; cpp_dec_float_50 amountofproduct2 = cpp_dec_float_50("254.99"); cpp_dec_float_50 quantity2 = cpp_dec_float_50("100000000"); cpp_dec_float_50 amountofcheckout2 = cpp_dec_float_50(amountofproduct2*quantity2); std::cout << std::setprecision(30) << amountofcheckout2 << std::endl; Na wyjściu: 25499000832 25499000000

Decimal float a standard C++ 157 Są propozycje dodania typów decimal floating-point do standardu: http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2014/n3871.html

158 K NIEC