Problem z łącznością w c++

0

Witam

Mam problem z napisaniem poniższego zadania

Czyli mieć 3 zmienne, pokazać to przy pomocy

(a +b) + c = a + ( b +c)

(a * b) * c = a * ( b* c)

i znaleŹć takei liczby że to się nie spełnia

Napisać program pokazujący brak łączności operacji +, * liczb zmiennoprzecinkowych na przykładzie liczb pojedynczej precyzji (flout)
mam coś takiego i nie wiem jakie liczby dać aby zaprzeczyć łączności.. zarówno w dodawaniu jak i mnożeniu

float a = 1258599.0f;
    float b = 13999.0f;
    float c = 125399.0f;

    cout << "Dodawanie , (a + b ) + c = ";
    cout << (a + b) + c << endl;

    cout << "Dodawanie ,a + (b + c) = ";
    cout << a + (b + c) << endl;

0

No… z dodawaniem będziesz miał problem, bo standard wymaga, żeby było łączne. A nie, głupoty gadam, zignoruj to…

Ale że 32-bitowych floatów jest tylko 2^32, to nie zajmie Ci aż tak długo sprawdzenie wszystkich w pętli. Równolegle możesz szukać w sieci jakiegoś gotowego przykładu.

3
Althorion napisał(a):

No… z dodawaniem będziesz miał problem, bo standard wymaga, żeby było łączne.

Ale że 32-bitowych floatów jest tylko 2^32, to nie zajmie Ci aż tak długo sprawdzenie wszystkich w pętli. Równolegle możesz szukać w sieci jakiegoś gotowego przykładu.

Proponuje użyć też licz ujemnych i szukać utraty precyzji. Np:

(dużo + (-dużo)) + mało = mało;
dużo + ((-dużo) + mało) = 0; //utrata precyzji
0

Dla dodawania dobrałbym

  • a = b = 1 + epsilon c = 2.0

Dla mnożenie jest trudniej. Trzeba pokombinować tak, by zaokrąglenia dały nieco inny wynik.

1

Ok mam fajne demo:
https://godbolt.org/z/Gf81xM

pokombinuj z innymi przykładami.

0

Najprościej będzie przy wychodzeniu z zakresu kiedy masz zdenormalizowane floaty, więc operacje na wartościach blisko MAX i MIN

1 użytkowników online, w tym zalogowanych: 0, gości: 1