Liczby zmiennopozycyjne - porównywanie

0

Witam!
Mam problem z porównaniem liczb zmiennoprzecinkowych...
Potrzebuję posortować tablicę typu double i wyskakuje mi błąd wykonania:
oto fragment kodu:

double *dlugosc; //deklaracja
double temp;

fragment sortowania:

  if (dlugosc[j]>dlugosc[j+1])         <====== tutaj się wysypuje
  {
    temp=dlugosc[j];
    dlugosc[j]=dlugosc[j+1];
    dlugosc[j+1]=temp;
  }

Z góry dzięki...

0

No pewi,że się wysypują bo w kompie liczby zmiennoprzecinkowe NIGDY nie są dokładne. Więc trzeba określić jakąś dokładność różnicy między nimi. Spróbuj tak:

if ( (dlugosc[j]-dlugosc[j+1])<0) => //dlugosc[j] <dlugosc[j+1]
else //=>dlugosc[j]>dlugosc[j+1]

0
Sven napisał(a)

Witam!
Mam problem z porównaniem liczb zmiennoprzecinkowych...
Potrzebuję posortować tablicę typu double i wyskakuje mi błąd wykonania:
(...)
if (dlugosc[j]>dlugosc[j+1]) <====== tutaj się wysypuje
{

Może kawałek więcej kodu, razem z licznikiem pętli, bo pewnie walnąłeś się z zakresem...

0

... liczby zmiennoprzecinkowe NIGDY nie są dokładne...

Błąd. Jeśli są wymierne, i dokładność+zakres typu pokrywa wymagania, to są dokładne. (na pewno 1/2. 1/4, 1/8, 0.625 ...)

if ( (dlugosc[j]-dlugosc[j+1])<0) => //dlugosc[j] <dlugosc[j+1]
else //=>dlugosc[j]>dlugosc[j+1]

Odejmowanie i dodawanie wiecej powoduje błędów niz porównanie. Zwłaszcza, że nie ma tu przyrównania, a jedynie właśnie porównanie.

Autor nie napisał, ale prawdopodobnie błąd leży gdzie indziej . Czy to program się wysypuje ? Jeśli tak, to nie wychodz poza zakres przydzielonej pamieci. Przydzielasz n komórek ale indeksujesz od 0 do n-1.

0
doqro8ej napisał(a)

... liczby zmiennoprzecinkowe NIGDY nie są dokładne...

Błąd. Jeśli są wymierne, i dokładność+zakres typu pokrywa wymagania, to są dokładne. (na pewno 1/2. 1/4, 1/8, 0.625 ...)

if ( (dlugosc[j]-dlugosc[j+1])<0) => //dlugosc[j] <dlugosc[j+1]
else //=>dlugosc[j]>dlugosc[j+1]

Odejmowanie i dodawanie wiecej powoduje błędów niz porównanie. Zwłaszcza, że nie ma tu przyrównania, a jedynie właśnie porównanie.

Autor nie napisał, ale prawdopodobnie błąd leży gdzie indziej . Czy to program się wysypuje ? Jeśli tak, to nie wychodz poza zakres przydzielonej pamieci. Przydzielasz n komórek ale indeksujesz od 0 do n-1.

A jak są niewymierne kolego ???

0
Kiwi napisał(a)

(...)A jak są niewymierne kolego ???
Odróżniasz: czasami od nigdy?!

0

[Totalny OT, no ale... redux]
No to jak w końcu panowie? Chętnie się dowiem, jak to jest z liczbami wymiernymi i niewymiernymi w zapisie zmiennoprzecinkowym. :D
Czasami, nigdy, a może jeszcze inaczej? :>

Heh, mówiąc o liczbach zp.:
(używając stwierdzenia Qyona "czasami")
"liczby zmiennoprzecinkowe NIGDY nie są dokładne"
Kiwi - czasami masz rację, reprezentacja liczby może nie być dokładna (skończona).

"Jeśli są wymierne, i dokładność+zakres typu pokrywa wymagania, to są dokładne."
doqro8ej vel flabra - czasami masz rację. Mamy sobie float, chce sobie mieć ułamek, zakres mi pokrywa wymagania, dokładność (hmmm, a cóż to takiego? :) ) załóżmy double-80 bitowy, no i chcę sobie przedstawić 1/10. Aaaaa! Nie daje się przedstawić na skończonej liczbie bitów w zapisie binarnym!!! Ratunku!
Oczywiście o to właśnie ci chodziło, tylko zauważ że TO JEST liczba wymierna! I dokładność ani zakres nie mają żadnego znaczenia.

"Accept it & life with it" - liczby zmiennoprzecinkowe na komputerze takie są i tyle. Jeżeli już się pisze dlaczego to może warto czasem przeczytać coś na ten temat albo przynajmniej używać dobrego słownictwa i prawidłowych pojęć?

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