kategoria: AMOS
[#1] Błąd w dodawaniu liczb dziesiętnych
Proszę, niech mi to ktoś sprawdzi i powie, że moje WinUAE doprowadza mnie do obłędu a nie jest to wina AMOS-a, czy Amigi w ogóle. Próbuję wykonać z pozoru błahą operację dodania dwóch liczb dziesiętnych:



W AMOS-ie wygląda to tak:
A#=3000000.0
B#=14.48
Print A#+B#

Jeśli zredukuję 300000 do 30000, to wynik jest poprawny, ale to dla mnie żadne rozwiązanie. Moje liczby sięgają milionów i zawierają dane po przecinku, które muszą być dokładne do jednej dziesiątej.
Gdyby ktoś mógł odpalić na prawdziwej Amidze, to tutaj ma skompilowaną binarkę na dropboksie. Mam nadzieję, że rozwiązanie jest banalne a ja po prostu zmęczony.

Ostatnia aktualizacja: 23.04.2016 06:20:28 przez Umpal
[#2] Re: Błąd w dodawaniu liczb dziesiętnych

@Umpal, post #1

Cytaty z instrukcji:
Numbers that consist of many digits either side of a decimal point can often give very messy results in Basic programming.


Single precision is accurate to about seven decimal digits, it is very fast and it is ideal for the vast majority of applications.


AMOS Professional double precision can handle numbers with up to 16 significant digits.


Czyli wychodzi na to, że potrzebujesz instrukcji
Set Double Precision


Kodu nie sprawdzałem, bo nie mam prawdziwej Amigi, tylko MiST'a ;).
[#3] Re: Błąd w dodawaniu liczb dziesiętnych

@void, post #2

Heh, nie natrafiłem do tej pory na ten pierwszy cytat, ale resztę czytałem po kilka razy. Nie wspomniałem o tym w moim pierwszym poście, ale oczywiście Set Double Precision próbowałem. Ale albo moja matematyka jest tak słaba, albo nie potrafię zrozumieć wyniku, jaki po jej użyciu wyświetla. Tak czy siak, ustawienie podwójnej precyzji jest wątpliwym rozwiązaniem, bo:

This extent of accuracy will consume twice as much memory as the standard version, and it will also cause a great slowing down of calculations. It should only be used when extra accuracy is absolutely vital.

Za great slowing down bardzo dziękuję. Jakby Amiga za wolna była . Trudno, pomyślę, co mogę zmienić żeby się z tym nie męczyć. Dzięki.
[#4] Re: Błąd w dodawaniu liczb dziesiętnych

@Umpal, post #3

Najprostrzym rozwiazaniem tego problemu byloby pracowac na liczbach calkowitych a przecinek dorobic sobie sztucznie dzielac calosc przez 100.
[#5] Re: Błąd w dodawaniu liczb dziesiętnych

@Umpal, post #1

Procesor nie potrafi liczyć liczb nie całkowitych. Liczba FLOAT jest liczbą całkowitą z przecinkiem w umówionym miejscu, które musi uwzględnić program, wymaga to dodatkowych kroków przed jakąkolwiek operacją na dwóch liczbach.

Najlepiej byłoby jakbyś używał liczb całkowitych, a ostatnie dwie liczby wyciągał poprzez dzielenie przez 10 i wyciąganie reszty, gdy chcesz ją wyświetlić.
[#6] Re: Błąd w dodawaniu liczb dziesiętnych

@sanjyuubi, post #5

Dzięki chłopaki. Początkowo chciałem zrobić tak, jak proponujecie, ale ta metoda rozwala mi totalnie wyniki pewnych formuł. Nie do zaakceptowania w tym przypadku. Wpadłem więc na pomysł, żeby w jednej zmiennej trzymać całkowitą, a w drugiej po przecinku. Osobno wykonuję operację na całych i osobno na częściach (jak brakuje, to zabieram całą z głównego ciągu). Działa OK

Wizualizacja tej metody:


PS Ale muszę szczerze przyznać, że tak głęboko w liczeniu nigdy na Amidze nie siedziałem i wiele rzeczy wydawało mi się oczywistych (na PC zmienne typu Sinlge, Long, Double są normalką i łatwo jest się zapomnieć, że Amiga jest liczydłem sprzed dekad).


Ostatnia aktualizacja: 23.04.2016 16:39:42 przez Umpal
[#7] Re: Błąd w dodawaniu liczb dziesiętnych

@Umpal, post #6

na PC zmienne typu Sinlge, Long, Double są normalką i łatwo jest się zapomnieć, że Amiga jest liczydłem sprzed dekad
Na PC liczby zmiennoprzecinkowe pojedynczej precyzji zachowują się tak samo...
[#8] Re: Błąd w dodawaniu liczb dziesiętnych

@Krashan, post #7

Pewnie masz rację, ale ja tego nigdy nie doświadczyłem, tzn. takiego "błędu", bo nie wiem, czy to błąd, czy ograniczenie konstrukcyjne (za tępy na to jestem). W każdym razie na przykładzie z pierwszego posta na PC bez żadnych kombinacji wynik jest poprawny. Dla mnie, kmiotka-programisty, operacja matematyczna zawsze powinna dać logiczny wynik. Jeśli jest inaczej, to odchodzę od zmysłów i chcę palić czarownice
[#9] Re: Błąd w dodawaniu liczb dziesiętnych

@Umpal, post #8

W każdym razie na przykładzie z pierwszego posta na PC bez żadnych kombinacji wynik jest poprawny.
Nie jest. Uruchomienie takiego oto programu spod Linuksa na x86_64:

int main(void)
{
	float x = 300000.0f;
	float y = 14.48f;

	printf("%f\n", x + y);
	return 0;
}

daje wynik 300014.468750. Lepiej niż AMOS, ale też niedokładnie. To nie jest błąd, ale „ograniczenie konstrukcyjne” liczb zmiennoprzecinkowych.
[#10] Re: Błąd w dodawaniu liczb dziesiętnych

@Umpal, post #1

jak dobrze czujesz się w angielskim to tu masz niezłe wytłumaczenie problematyki floatów.

Proponuję Ci tak jak mówił Phibrizzo: trzymanie wszystkiego w groszach w typie całkowitym i wyświetlanie wszystkiego jako: (grosze/100) "kropka" (grosze modulo 100).

Twoje rozwiązanie z dwoma zmiennymi jest fajne bo masz oddzielny zakres liczbowy na całkowite a oddzielny na dziesiętne, ale dochodzi do tego problem z pożyczaniem z całości lub zabieraniem z dziesiętnych przy obliczeniach. Chyba wygodniej (a może i nawet szybciej, gdy masz wiele obliczeń pod rząd) przy ostatecznym wyświetlaniu zrobić raz dzielenie i modulo.

Dobrą praktyką jest unikanie floatów jak ognia, chyba że naprawdę są Ci potrzebne albo wyniki są Ci potrzebne mniej więcej dobre. Możesz sobie trochę o fixed pointach poczytać
[#11] Re: Błąd w dodawaniu liczb dziesiętnych

@Krashan, post #9

Na leciwym już Visual Basicu 6.0 wynik mam dokładny, bez przekłamań (nie deklaruję typu zmiennych), stąd napisałem, że jest poprawny i do niego robię referencje, gdy dłubię w AMOS-ie. Na innym nie sprawdzałem. Ale nie spieram się z niczym, bo na własnej skórze widzę, jak to niestety działa...
Z innej beczki. Czy wykorzystanie koprocesora do takich obliczeń coś by zmieniło? (za chwilę obejrzę wideo podlinkowane przez teh_KaiNa, więc być może tam jest odpowiedź. Gdyby nie, to chętnie przeczytam tutaj)

[Update]
Właśnie skończyłem oglądać i już wiem, że koprocesor nic tutaj nie zmieni. Po prostu . Gościu świetnie to tłumaczy i nawet ja to pojąłem . Dzięki teh_KaiN jeszcze raz, czuję, że nastąpił przełom w moim życiu

@teh_KaiN, dzięki za wskazówki. Przetrawię to i zobaczę, jak mi będzie szybciej i wygodniej. Co do wyników, to tak, są mi bezwzględnie potrzebne z dokładnością do dwóch po przecinku.


Ostatnia aktualizacja: 23.04.2016 18:05:47 przez Umpal
Na stronie www.PPA.pl, podobnie jak na wielu innych stronach internetowych, wykorzystywane są tzw. cookies (ciasteczka). Służą ona m.in. do tego, aby zalogować się na swoje konto, czy brać udział w ankietach. Ze względu na nowe regulacje prawne jesteśmy zobowiązani do poinformowania Cię o tym w wyraźniejszy niż dotychczas sposób. Dalsze korzystanie z naszej strony bez zmiany ustawień przeglądarki internetowej będzie oznaczać, że zgadzasz się na ich wykorzystywanie.
OK, rozumiem