
//
// To jest przykładowy kod z podrozdziału 24.2 „Rozmiar, precyzja i przekroczenie zakresu” książki
// "Programowanie. Teoria i praktyka z wykorzystaniem C++" Bjarne'a Stroustrupa.
//

#include <iostream>
#include <iomanip>

using namespace std;

//------------------------------------------------------------------------------

int main()
{
    {
        float x = 1.0/333;
        float sum = 0;
        for (int i=0; i<333; ++i) sum+=x;
        cout << setprecision(15) << sum << "\n";
    }

    {
        short y = 40000;
        int i = 1000000;
        cout << y << "   " << i*i << "\n";
    }

    {
        cout << "sizes: " << sizeof(int) << ' ' << sizeof(float) << '\n';
        int x = 2100000009;    // duża liczba całkowita
        float f = x;
        cout << x << ' ' << f << endl;
        cout << setprecision(15) << x << ' ' << f << '\n';
    }
    {
        float f = 2.8;
        int x = f;
        cout << x << ' ' << f << endl;
    }
}

//------------------------------------------------------------------------------

void f(int i, double fpd)
{
    char c = i;      // Tak, typ char reprezentuje naprawdę małe liczby całkowite.
    short s = i;     // Uwaga: liczba całkowita może być za duża dla typu short.
    i = i+1;         // Co by było, gdyby i była największą liczbą typu int?
    long lg = i*i;   // Uwaga: liczba typu long nie może być większa od typu int.
    float fps = fpd; // Uwaga: duża liczba typu double może nie zmieścić się w typie float.
    i = fpd;         // Obcięcie: np., 5.7 –> 5.
    fps = i;         // Może zostać utracona precyzja (w przypadku bardzo dużych wartości typu int).
}

//------------------------------------------------------------------------------

void g()
{
    char ch = 0;
    for (int i = 0; i<500; ++i) 
        cout << int(ch++) << '\t';
}

//------------------------------------------------------------------------------
