Wpis z mikrobloga

Cześć! Mam za zadanie znaleźć takie liczby A,B,C typu double dla których nie zachodzi prawo łączności (A+B)+C = A+(B+C). Wiem że dla liczb zmiennoprzecinkowych nie zawsze ono zachodzi (ograniczenia arytmetyki zmiennoprzecinkowej), jednak w programie podając nawet szalone liczby typu 25.0e+30, 0.03e-40, -1e-30 wszystko liczy idealnie :/

Piszę w C++ i jakoś za cholerę nie mogę znaleźć takich liczb żeby zaszło jakieś zaokrąglenie, etc.

Co na to poradzić?

#programowanie #problem #cpp #metodynumeryczne
  • 30
  • Odpowiedz
  • Otrzymuj powiadomienia
    o nowych komentarzach

@sylwke3100: Tak, znalazło trzy: 8.718910e-004 9.701811e+000 7.193844e+000

To są dosyć małe liczby. Ja używam jednej dużej i dwóch małych i znalazłem już 3 takie przykłady bez generowania. W sumie to jest istota tego ćwiczenia że przy dodawaniu bardzo małej liczby do bardzo dużej otrzymamy zamiast ich sumy wartość dużej.
  • Odpowiedz
clang 4.3


@sylwke3100: To jesteś kilka lat naprzód ;)

Nie wiem dokładnie dlaczego tak się dzieje, z załoƶenia liczb zmiennoprzecinkowych uƶywam wyłącznie do logów/interakcji z uƶytkownikiem, właśnie aby uniknąć takich
  • Odpowiedz