Forum Informatyka UJ forum Strona Główna Informatyka UJ forum
Rocznik 2005 - czyli najlepsze forum w sieci
 
 FAQFAQ   SzukajSzukaj   UżytkownicyUżytkownicy   GrupyGrupy   GalerieGalerie   RejestracjaRejestracja 
 ProfilProfil   Zaloguj się, by sprawdzić wiadomościZaloguj się, by sprawdzić wiadomości   ZalogujZaloguj 

Operacje na doublach

 
Napisz nowy temat   Odpowiedz do tematu    Forum Informatyka UJ forum Strona Główna -> Archiwum / 1 rok / 2 i 3 semestr - Algorytmy i Struktury Danych
Zobacz poprzedni temat :: Zobacz następny temat  
Autor Wiadomość
cct
pijak



Dołączył: 21 Mar 2006
Posty: 202
Przeczytał: 0 tematów


PostWysłany: Wto 13:04, 24 Paź 2006    Temat postu: Operacje na doublach

Witam,

Parę osób (w tym ja...) miało z tym problem, więc daję info, że c++ (g++?) się wali na operacjach na doublach kiedy używamy nawiasowania... :/

Przykładowo,
Kod:
(1/6) * cos != cos/6

albo
Kod:
j * y / k != j * ( y / k )

etc.

W efekcie wygląda całość jakby się zerowało w tablicach.

Wie ktoś, czemu tak jest?
Powrót do góry
Zobacz profil autora
Zobacz poprzedni temat :: Zobacz następny temat  
Autor Wiadomość
mateo
pijak



Dołączył: 08 Mar 2006
Posty: 296
Przeczytał: 0 tematów

Skąd: Krk - Biały Prądnik

PostWysłany: Wto 13:09, 24 Paź 2006    Temat postu:

(int/int) = int
w szczegolnosci dzialanie:
1/6 gdzie 1 i 6 to stale typu int daje w wyniku tez cos typu int

no wiec gdy sie podzieli 1 przez 6 to wyjdzie 0.


ale wystarczy to zmienic na:
1.0/6 1/6.0 albo 1.0/6.0 i juz bedzie ok bo gdy jedna ze zmiennych przy w dzialaniu jest doublem to wynik tez bedzie doublem.

co do drugiej instrukcji to zalezy to od typu zmiennych. ale jesli 'y' i 'k' sa integerami to niewatpliwie te 2 zapisy dadza 2 rozne wyniki
Powrót do góry
Zobacz profil autora
Zobacz poprzedni temat :: Zobacz następny temat  
Autor Wiadomość
Gorfin
pijak



Dołączył: 06 Kwi 2006
Posty: 63
Przeczytał: 0 tematów


PostWysłany: Wto 13:12, 24 Paź 2006    Temat postu:

IMHO chodzi o to, ze operator "/" dziala inaczej z liczbami zmiennoprzecinkowymi, a inaczej z calkowitymi. I tak w pierwszym przykladzie jest de facto:

(1/6) * cos != cos/6
||
0
Powrót do góry
Zobacz profil autora
Zobacz poprzedni temat :: Zobacz następny temat  
Autor Wiadomość
Spectro
Mistrz grilla



Dołączył: 09 Mar 2006
Posty: 2306
Przeczytał: 0 tematów

Skąd: Kurdwanów

PostWysłany: Wto 13:16, 24 Paź 2006    Temat postu:

Cytat:
(int/int) = int

Wynik dzielenia z resztą po prostu. Kompilator nie wie, że to ma być liczba rzeczywista, więc dzieje się to, co opisał mateo.

Cytat:
1.0/6 1/6.0 albo 1.0/6.0

W E użyłem 1./6. jako stałej ;) . Zapis z kropką bez zera też jest dopuszczalny.
Powrót do góry
Zobacz profil autora
Zobacz poprzedni temat :: Zobacz następny temat  
Autor Wiadomość
cct
pijak



Dołączył: 21 Mar 2006
Posty: 202
Przeczytał: 0 tematów


PostWysłany: Wto 16:50, 24 Paź 2006    Temat postu:

Ha, to wiele wyjaśnia. Nawet wszystko ;)

Będzie trzeba wreszcie poczytać głębiej o C++, oj trzeba będzie...

Dzięki wszystkim za informacje - strata kolejnych paru godzin z życiorysu uzasadniona ;/
Powrót do góry
Zobacz profil autora
Zobacz poprzedni temat :: Zobacz następny temat  
Autor Wiadomość
Stefan
pijak



Dołączył: 22 Lis 2005
Posty: 173
Przeczytał: 0 tematów


PostWysłany: Wto 21:51, 24 Paź 2006    Temat postu:

Dodam tylko, że nie warto zakładać rzeczy typu:
Kod:
(1.0/6.0) * cos == cos/6.0
Powrót do góry
Zobacz profil autora
Zobacz poprzedni temat :: Zobacz następny temat  
Autor Wiadomość
mateo
pijak



Dołączył: 08 Mar 2006
Posty: 296
Przeczytał: 0 tematów

Skąd: Krk - Biały Prądnik

PostWysłany: Wto 21:57, 24 Paź 2006    Temat postu:

Stefan napisał:
Dodam tylko, że nie warto zakładać rzeczy typu:
Kod:
(1.0/6.0) * cos == cos/6.0


yyy. a moglbys to barziej rozwinac.... ? bo szczerze mowiac chyba nie zalapalem o co moze chodzic...
Powrót do góry
Zobacz profil autora
Zobacz poprzedni temat :: Zobacz następny temat  
Autor Wiadomość
Rogal
Zjeb z kaszanką



Dołączył: 13 Mar 2006
Posty: 1745
Przeczytał: 0 tematów

Skąd: koło podbiegunowe

PostWysłany: Wto 22:15, 24 Paź 2006    Temat postu:

Chyba o to, że generalnie porównywanie doubli przez == jest samobójstwem :D
Powrót do góry
Zobacz profil autora
Zobacz poprzedni temat :: Zobacz następny temat  
Autor Wiadomość
Spectro
Mistrz grilla



Dołączył: 09 Mar 2006
Posty: 2306
Przeczytał: 0 tematów

Skąd: Kurdwanów

PostWysłany: Śro 8:08, 25 Paź 2006    Temat postu:

Chodzi o dokładność wyliczeń dla doubla :P . Któraś liczba po przecinku może się nie zgodzić. Polecam sprawdzić:
Kod:
sqrt(9) != 3

U mnie to wyrażenie jest prawdziwe ;) .
Powrót do góry
Zobacz profil autora
Zobacz poprzedni temat :: Zobacz następny temat  
Autor Wiadomość
Fen
zielony żul



Dołączył: 22 Lut 2006
Posty: 946
Przeczytał: 0 tematów

Skąd: Bochnia

PostWysłany: Śro 9:06, 25 Paź 2006    Temat postu:

z tego co kiedyś pamiętam, do porównywania doubli używało się specjalnych funkcji na przykład:
Kod:

#define EPS 10e-6

bool CompareFloat(float a, float b) {
    return abs(a-b) < EPS;
}


lub coś analogicznego...
Powrót do góry
Zobacz profil autora
Zobacz poprzedni temat :: Zobacz następny temat  
Autor Wiadomość
Stefan
pijak



Dołączył: 22 Lis 2005
Posty: 173
Przeczytał: 0 tematów


PostWysłany: Śro 12:40, 25 Paź 2006    Temat postu:

Bardzo małą ilość liczb da się dokładnie reprezentować w notacji zmiennoprzecinkowej, dlatego praktycznie przy każdej operacji trzeba brać pod uwagę błędu niedomiaru/nadmiaru. Z tego powodu kolejność wykonywania operacji na liczbach zmiennoprzecinkowych ma znaczenie.

Dlatego gdyby chcieć policzyć na komputerze całkę w najbanalniejszy sposób, to użycie operatora != najprawdopodobniej doprowadziłoby do nieskończonej pętli:
Kod:

   double calka = 0;
   for(double d = 0; d <= 0.5; d += 0.001)
      calka += g(d)*0.001;
Powrót do góry
Zobacz profil autora
Wyświetl posty z ostatnich:   
Napisz nowy temat   Odpowiedz do tematu    Forum Informatyka UJ forum Strona Główna -> Archiwum / 1 rok / 2 i 3 semestr - Algorytmy i Struktury Danych Wszystkie czasy w strefie EET (Europa)
Strona 1 z 1

 
Skocz do:  
Nie możesz pisać nowych tematów
Nie możesz odpowiadać w tematach
Nie możesz zmieniać swoich postów
Nie możesz usuwać swoich postów
Nie możesz głosować w ankietach

fora.pl - załóż własne forum dyskusyjne za darmo
Powered by phpBB © 2001, 2005 phpBB Group
Regulamin