|
Informatyka UJ forum Rocznik 2005 - czyli najlepsze forum w sieci
|
Zobacz poprzedni temat :: Zobacz następny temat |
Autor |
Wiadomość |
cct
pijak
Dołączył: 21 Mar 2006
Posty: 202
Przeczytał: 0 tematów
|
Wysł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 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
|
Wysł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 poprzedni temat :: Zobacz następny temat |
Autor |
Wiadomość |
Gorfin
pijak
Dołączył: 06 Kwi 2006
Posty: 63
Przeczytał: 0 tematów
|
Wysł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 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
|
Wysłany: Wto 13:16, 24 Paź 2006 Temat postu: |
|
|
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 poprzedni temat :: Zobacz następny temat |
Autor |
Wiadomość |
cct
pijak
Dołączył: 21 Mar 2006
Posty: 202
Przeczytał: 0 tematów
|
Wysł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 poprzedni temat :: Zobacz następny temat |
Autor |
Wiadomość |
Stefan
pijak
Dołączył: 22 Lis 2005
Posty: 173
Przeczytał: 0 tematów
|
Wysł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 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
|
Wysł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 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
|
Wysł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 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
|
Wysł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ć:
U mnie to wyrażenie jest prawdziwe ;) .
|
|
Powrót do góry |
|
|
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
|
Wysł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 poprzedni temat :: Zobacz następny temat |
Autor |
Wiadomość |
Stefan
pijak
Dołączył: 22 Lis 2005
Posty: 173
Przeczytał: 0 tematów
|
Wysł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 |
|
|
|
|
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
|