-
101. Data: 2019-06-26 06:21:16
Temat: Re: Porównywanie liczb, double float
Od: "J.F." <j...@p...onet.pl>
Dnia Tue, 25 Jun 2019 21:25:30 +0200, AK napisał(a):
> On 2019-06-18 17:20, Mateusz Viste wrote:
>> Wszystko zaczęło się od twojego stwierdzenia, że do skorzystania z float
>> trzeba skończyć "półroczny zaawansowany wykład z analizy numerycznej".
>> Otóż staram się> wyjaśnić że nie, bo do tego wystarczy być średnio rozgarniętym
>> człowiekiem i poświęcić jeden wieczór na zrozumienie (na podstawie ogólno-
>> dostępnej dokumentacji) czym jest float, jak działa i dlaczego to nie
>> jest żadne uniwersalne narzędzie. No powiedzmy dwa wieczory, jeśli
>> wliczyć w to zabawę z kompilatorem i sprawdzenia jak taki float reaguje w
>> praktyce i w jaki sposób jest przechowywany w pamięci. Ok, niech będą 3
>> wieczory, żeby jeszcze zerknąć do kilku projektów OSS jak oni korzystają
>> (lub nie) z float, i dlaczego.
>
> Powyzsze podejscie _kompletnie_ dyskwalifikuje Cie jako uzytkownika
> liczb float. Ba! Dyskwalifikuje Cie jako programistę.
> (niewazne czy samouka czy nie).
> PS: Zapsz si ejednak na ten kurs numeryki. Moze jeszcze gdzies ucza o
> float...
No ale przeciez nie chcesz wiedziec jak floaty sa zapisane :-P
To po takim kursie bediesz mial metlik - pelno ostrzezen o mozliwych
bledach i zero rozwiazan :-)
J.
-
102. Data: 2019-06-26 06:38:40
Temat: Re: Porównywanie liczb, double float
Od: "J.F." <j...@p...onet.pl>
Dnia Tue, 25 Jun 2019 21:53:54 +0200, AK napisał(a):
> On 2019-06-19 21:51, KLoSS wrote:
>> Nowi jak nowi, ale żeby wojsko... I niestety były ofiary.
>>
>> http://www-users.math.umn.edu/~arnold//disasters/pat
riot.html
>
> O ja pie.. To niemozliwe (urban legend?).
> Przecie to zakrawa na zwykłe nieuctwo :(
urban legend mozliwe ... ale ...
Z jednej strony nieuctwo, z drugiej - pewien problem, jak to zrobic
dobrze.
A wojsko (klient) pewnie nie zostawialo na 4 dni przed testami
wlaczonego :-)
J.
-
103. Data: 2019-07-02 22:56:19
Temat: Re: Porównywanie liczb, double float
Od: AK <n...@n...net>
On 2019-06-26 06:21, J.F. wrote:
>> PS: Zapsz si ejednak na ten kurs numeryki. Moze jeszcze gdzies ucza o
>> float...
>
> No ale przeciez nie chcesz wiedziec jak floaty sa zapisane :-P
>
> To po takim kursie bediesz mial metlik - pelno ostrzezen o mozliwych
> bledach i zero rozwiazan :-)
Hehe, no racja :)
Tyle, ze w "moich czasach" nie uczyli o bebechach formatow fp (bo co
maszyna to byl inny, ba! nawet bajt na CDC mial 9 bitow;), jeno wlasnie
jak ich _dobrze_ uzywac przy takiej wielosci formatow.
PS: Zeb nie bylo, Chwale IEEE754, ale glownie ze wzgledu na ulatwienie
(ze wzgledu na ustandaryzowanie) dla tworcow koprocesorow i kompilatorow.
Dla uzytkownikow/programistow "stare" zasady pozostaja wciaz w mocy.
AK
-
104. Data: 2019-07-03 00:42:53
Temat: Re: Porównywanie liczb, double float
Od: "J.F." <j...@p...onet.pl>
Dnia Tue, 2 Jul 2019 22:56:19 +0200, AK napisał(a):
> On 2019-06-26 06:21, J.F. wrote:
>>> PS: Zapsz si ejednak na ten kurs numeryki. Moze jeszcze gdzies ucza o
>>> float...
>>
>> No ale przeciez nie chcesz wiedziec jak floaty sa zapisane :-P
>>
>> To po takim kursie bediesz mial metlik - pelno ostrzezen o mozliwych
>> bledach i zero rozwiazan :-)
>
> Hehe, no racja :)
> Tyle, ze w "moich czasach" nie uczyli o bebechach formatow fp (bo co
> maszyna to byl inny, ba! nawet bajt na CDC mial 9 bitow;), jeno wlasnie
> jak ich _dobrze_ uzywac przy takiej wielosci formatow.
>
> PS: Zeb nie bylo, Chwale IEEE754, ale glownie ze wzgledu na ulatwienie
> (ze wzgledu na ustandaryzowanie) dla tworcow koprocesorow i kompilatorow.
> Dla uzytkownikow/programistow "stare" zasady pozostaja wciaz w mocy.
IMO - powstal chyba tylko po to, zeby klienci nie narzekali, ze ten
sam program (zrodlowy) wykonany na dwoch roznych komputerach daje
rozny wynik (z powodu zaokraglen/obciec).
Ale ma jedna zalete - z powodu przyjecia podstawy 2, srednia dwoch
liczb jest zawsze pomiedzy nimi.
Przy podstawie 10 lub 16 moze byc juz inaczej
np 5.008+5.009 = 10.017 -> 1.002e1 .. /2 = 5.010
J.
-
105. Data: 2019-07-12 07:27:55
Temat: Re: Porównywanie liczb, double float
Od: DMR <m...@g...com>
> Zamieszcze tu po raz 473 w ciagu 20 lat podstawową formułkę
> (Ba! KANON!)
To ja poprosiłbym o jakiś patent na odporne na zaokrąglenia rozdzielenie części
całkowitej i ułamkowej w zmiennej typu double.
> ponaglenia o pilną zapłatę 0.00PLN
No właśnie.
Przykładowo, muszę zrobić: 12345.6789 zł -> 12345 zł 68 gr
Wiadomo:
double suma, f;
int zlote, grosze;
...
suma += 0.005;
zlote = (int)suma;
f = suma - zlote;
grosze = (int)(f * 100.0);
Problemy mogą pojawić w przypadku wartości praktycznie równych wartościom całkowitym.
Gdyby na skutek jakichś zaokrągleń wartość f okazała się ujemna, to nie ma problemu -
(int) i tak "dociągnie" ją do zera.
Gorzej, gdyby np. suma = 1234.9999999999999997, za to teoretycznie f =
0.9999999999999997 za sprawą zabłąkanego bitu na końcu przeskoczyła na f =
1.0000000000000001.
Wtedy wyjdzie 1234 zł 100 gr...
Chyba, że nie potrzebnie się martwię.
Testowałem to wielokrotnie dla miliardów złośliwie wygenerowanych danych "z
pogranicza" - ani razu się nie wywaliła.
No, ale... :-)
-
106. Data: 2019-07-13 09:21:07
Temat: Re: Porównywanie liczb, double float
Od: AK <n...@n...net>
On 2019-07-12 07:27, DMR wrote:
>> Zamieszcze tu po raz 473 w ciagu 20 lat podstawową formułkę
>> (Ba! KANON!)
>
> To ja poprosiłbym o jakiś patent na odporne na zaokrąglenia rozdzielenie części
całkowitej i ułamkowej w zmiennej typu double.
>
>> ponaglenia o pilną zapłatę 0.00PLN
>
> No właśnie.
> Przykładowo, muszę zrobić: 12345.6789 zł -> 12345 zł 68 gr
>
> Wiadomo:
>
> double suma, f;
> int zlote, grosze;
>
> ...
>
> suma += 0.005;
>
> zlote = (int)suma;
> f = suma - zlote;
> grosze = (int)(f * 100.0);
>
> Problemy mogą pojawić w przypadku wartości praktycznie równych wartościom
całkowitym.
> Gdyby na skutek jakichś zaokrągleń wartość f okazała się ujemna, to nie ma problemu
- (int) i tak "dociągnie" ją do zera.
>
> Gorzej, gdyby np. suma = 1234.9999999999999997, za to teoretycznie f =
0.9999999999999997 za sprawą zabłąkanego bitu na końcu przeskoczyła na f =
1.0000000000000001.
> Wtedy wyjdzie 1234 zł 100 gr...
>
> Chyba, że nie potrzebnie się martwię.
> Testowałem to wielokrotnie dla miliardów złośliwie wygenerowanych danych "z
pogranicza" - ani razu się nie wywaliła.
>
> No, ale... :-)
Proszę bardzo.
To jest drugi KANON (zaokraglanie do int-a):
W Pythonie tak:
grosze, zlote = math.modf(amount)
zlote = int(abs(zlote) + 0.5)
grosze = int(abs(grosze) * 100.0 + 0.5)
W C/C++ cuś w rodzaju:
double zlote_fp;
double grosze_fp = modf(amount, &zlote_fp);
long zlote = long(fabs(zlote_fp) + 0.5);
int grosze = int(fabs(grosze_fp) * 100.0 + 0.5);
PS: Wazne jest to + 0.5. Jeszcze z Algolu pamietam:)
integer := ENTER(float + 0.5)
AK
-
107. Data: 2019-07-14 10:16:33
Temat: Re: Porównywanie liczb, double float
Od: DMR <m...@g...com>
> modf
Funkcje biblioteczne dobre na wszystko! :-)
Tylko, one też muszą być jakoś zaimplementowane.
Tu kolega miał podobny dylemat: https://stackoverflow.com/questions/2637714/
Pytanie - czy na pewno jest to to stabilne numerycznie?
Tzn. czy nawet jakieś wyjątkowo perfidne błędy zaokrągleń przy odejmowaniu nie są w
stanie zniweczyć warunku: 0 < floatPart < 1?
(w moim przypadku: floatPart < 1)
-
108. Data: 2019-07-16 00:05:35
Temat: Re: Porównywanie liczb, double float
Od: AK <n...@n...net>
On 2019-07-14 10:16, DMR wrote:
>> modf
>
>
> Funkcje biblioteczne dobre na wszystko! :-)
> Tylko, one też muszą być jakoś zaimplementowane.
np. Python:
w_groszach = int(abs(amount) * 100.0 + 0.5)
zlote = w_groszach // 100
grosze = w_groszach % 100
AK
-
109. Data: 2019-07-22 09:17:47
Temat: Re: Porównywanie liczb, double float
Od: fir <p...@g...com>
W dniu czwartek, 13 czerwca 2019 15:35:14 UTC+2 użytkownik Pszemol napisał:
> "Szyk Cech" <s...@s...pl> wrote in message
> news:Jk8ME.2$6r.0@fx19.fr7...
> >> Przyczyną błędu była różnica odejmowania wynosząca 15.1234e-15
> >>
> >> Dlaczego konwersja CDbl stringu 31 lub 32.8 dodaje jakieś
> >> śmieci do zmiennej double float na 15 miejscu po przecinku??
> >> A może odejmowanie stałej 1.8 wprowadza ten błąd?
> >>
> >> Czy to jest normalne zachowanie się VB6?
> >>
> >> Czy inne Visuale jak VC++ lub VC# też tak mają?
> >
> > Weź chłopie ić na studia (ja miałem to nawet na wieczorowych
> > 20 lat temu) i się doucz! Zamiast zadawać głupie pytania.
>
> Ale kultury osobistej Cię tam nie nauczyli... szkoda.
>
> > Choć gdybyś dłubał w czymś innym niż VB to byś wiedział
> > o problemie (w każdej książce do Asemblera czy C czy C++
> > to powinno być).
>
> ha ha :-) No brawo.
szyk ma duzo racji, na pewno gada madrzej niz kolega (przynajmniej w pewnym sensie)
sęk w tym ze jest to problem
podstawowy, cos jak programistyczne 2+2
tkwienie w tym i spedzanie na tym za duzo czasu 1) skazuje czlowieka na bycie
noobem duzo czasu pozatym ze ogolnie 2) skazuje czlowieka na bycie noobem
sam swego czasu lubilem tkwic w takich noobich tematach ale pozniej oduczylem sie
tego (przynajmniej w sporym stopniu)
i uwazam to chyba za dosyc wazne oduczyc
sie tego tkwienia w podstawach.. wiaże sie to tez z tym ze jak czlowiek ma troche
praktyki zauwaza ze w praktyce zasiek pewnych problemow jest dosyc wąski
a jesli ktos chce sie tego naprawde porzadnie nauczyc to info w necie jest,
sam kiedys czytelem to
http://www.website.masmforum.com/tutorials/fptute/
co prawda dzis na x86/x64 kodu nie kompiluje sie na te instrukcje tylko na skalarne
sse ale to wyzej tez mozna przeczytac bo sporo rzeczy (np sam format floata/double)
jest analogiczne..
-
110. Data: 2019-07-22 09:37:33
Temat: Re: Porównywanie liczb, double float
Od: fir <p...@g...com>
W dniu poniedziałek, 17 czerwca 2019 09:53:43 UTC+2 użytkownik Mateusz Viste napisał:
> On Mon, 17 Jun 2019 09:39:08 +0200, Piotr Wyderski wrote:
> > Prawdziwi programiści nie używają liczb zmiennoprzecinkowych bezmyślnie.
> > A żeby to móc robić "zmyślnie" mają co najmniej półroczny zaawansowany
> > wykład z analizy numerycznej. Oczywiście zdarzają się i tacy, co byli za
> > mądrzy na studia i użeranie się z profesorami-debilami, dzięki czemu
> > m.in. Pszemol ma fun.
>
> Wszystko się zgadza, z tym że wniosek "był na studiach = wie co robi"
> jest co najmniej nietrafiony. De facto studia - przynajmniej w sektorze
> IT - to nic więcej jak strata czasu. Nie gwarantują one ani wiedzy, ani
> pomyślunku, a zarówno to pierwsze jak i drugie można bez problemu nabyć
> poza murami uczelni.
>
ogolnie jest to uproszczona i czesto falszywa wizja (prawdziwa w niektorych
przypadkach ale w wielu nie)
na przyklad ja gdy szedlem do pierwszej roboty w 2005 to mialem porownanie miedzy
sobą (ktory nauczyl sie glownie c, troche asma i troche pascala/javy)
samodzielnie vs kolesie ktoprzy byli w moim wieku ale byli z rok czy dwa lata po
informatyce na politechnikach
kwestia byla taka ze ci umieli wiecej
(bo ja sudiowalem fizyke co mi zajelo 5 lat) i umieli przede wszystkim inne rzeczy
(byli po wykladach z sieci, baz danych i kilku innych podobnych tematow)
pozatym studia maja tez inne plucy, na przyklad mzoesz jak sadze porownac siebie i to
co wiesz na zywo z tym co wiedza twoi kumple z roku przez to napewno uczysz sie jak
to ogolnie wyglada
moim zdaniem studia informatyczne nie sa strata czasu ale robienie czegos innego tez
nie koniecznie jest strata czasu..jesli ktos chialby isc do tego zawodu by zarabiac
pieniadze to ja chyba studia bym polecal (sam nie poszedlem na informatyke wlasnie po
wywnioskowaniu ze programowania sam sie naucze a fizyki nie i czy byla to dobra
decyzja zalezy od tego co ktos uwaza za bardziej wazne)
(w moim wypadku uwazam ze byla dobra, gorzej z pechem w moim pozniejszym zyciu,
zwlaszcza nabawianie sie przewleklej choroby a wlasciwie dwu)