operacje na liczbach całkowitych a dokładność

Do you have a question? Post it now! No Registration Necessary

Translate This Thread From Polish to

Threaded View
Witam,

Trochę już minęło czasu od zajęć z metod numerycznych... więc jak
najlepiej
wykonać taką operację:

Mam liczbę całkowitą która maksymalnie osiąga wartość 2^13, ale muszę
ją
pomnożyć przez niecałkowity współczynnik, który będzie wynosił około
0,3.
Zmienne wykorzystywane w obliczeniach są 16 bitowe (nie mam tyle mocy
obliczeniowej żeby przejść na liczby zmiennoprzecinkowe). Ponieważ 0,3 to to
samo co 3/10, to mogę sobie rozbić moje działanie na mnożenie przez 3 i
dzielenie bez reszty przez 10.

Pytanie - jaka kolejność zapewnia większą dokładność? Najpierw mnożyć
czy
lepiej najpierw dzielić? Co w przypadku gdy mój współczynnik wyniesie np.
0,32 - wykonanie jako pierwszego mnoĹźenia przez 32 (a potem dzielenia przez
100) da mi pośredni wynik większy niż zakres mojej 16-bitowej zmiennej.

--
Pozdrawiam
Jakub Rakus
We've slightly trimmed the long signature. Click to see the full one.
Re: operacje na liczbach całkowi tych a dokładność
Quoted text here. Click to load it
ją
Quoted text here. Click to load it
0,3.
Quoted text here. Click to load it
czy
Quoted text here. Click to load it

Najpierw mnożyć, żebyś błędu zaokrąglenia nie mnożył.

Quoted text here. Click to load it

Mnóş przez 8 a potem dziel przez 25.

--
Grzegorz Niemirowski
http://www.grzegorz.net /
We've slightly trimmed the long signature. Click to see the full one.
Re: operacje na liczbach całkowitych a dokładność
Quoted text here. Click to load it
 
Faktycznie, wykonałem wcześniej kilka obliczeń "na kartce" na losowo
wymyślonych liczbach i tak też mi się wydawało.

Quoted text here. Click to load it

Też nad tym myślałem, tylko jeszcze nie bardzo wiem jak programowo
rozwiązać
zamianę liczby z zakresu 0.20-0.50 na najbliższy jej ułamek zwykły o
liczniku nie większym od 8. Mój współczynnik będzie najpierw ustawiany
podczas procesu automatycznej kalibracji - całość bowiem dotyczy
przeliczenia wartości uzyskanej z przetwornika A/C.

--
Pozdrawiam
Jakub Rakus
We've slightly trimmed the long signature. Click to see the full one.
Re: operacje na liczbac h całkowitych a dok ładność
nadeszla wiadomosc:

Quoted text here. Click to load it


0,32 = 3/10 + 2/100

Nie musisz mnożyć przez więcej niż 9 ;-)

Re: operacje na liczbach całkowi tych a dokładność
UĹźytkownik "Jakub Rakus"  napisał w wiadomości grup
Quoted text here. Click to load it


Chyba nie masz watpliwosci, ze np 4/10 = 0,    0*3= 0 ?

Quoted text here. Click to load it

O to to to :-)

Jesli masz dostep do assemblera/ukladu mnozacego, to nie mnozysz przez
0.32, ale np przez 20972.
Tylko ze robisz mnozenie z wynikiem 32-bit, z ktorego wybierasz dalej
tylko starsze slowo.
Bo 65536*0.3220%971.52

jesli te wspolczynniki sa tego rzedu, to mozesz rozlozyc
0.32=0.0101001...b
a wiec x*0.32 = x>>2 + x>>4 + x>>7 ...

J.








Re: operacje na liczbach całkowitych a dokładność

Quoted text here. Click to load it

Będę marudził, ale nie chce liczb 32-bitowych :P więc to odpada.

Quoted text here. Click to load it

Ale za to to rozwiązanie mi się podoba :) Przeliczenie współczynnika na
liczbę 8 czy nawet 16-bitową i tak będzie wykonane tylko raz na jakiś czas
podczas procedury kalibracji, a trochę przesunięć bitowych nie zeżre mi
duĹźo
cennego czasu i kodu programu.

--
Pozdrawiam
Jakub Rakus
We've slightly trimmed the long signature. Click to see the full one.
Re: operacje na liczbach całkowitych a dokład ność
W dniu 2012-09-20 21:15, Jakub Rakus pisze:
Quoted text here. Click to load it

Masz 8 bitowy procesor? To nadal mnoĹźenie 2 16 bitowych
w 32 bitową to tylko 4 mnożenia. A przesuwanie bitowe
liczb dłuzszych niż rejestr też trochę kosztuje.


Quoted text here. Click to load it
duĹźo
Quoted text here. Click to load it


W złym wypadku masz 12 tych działań.

Trochę teraz pogdybam.
Jeśli jednak masz procek 16 bitowy, możesz pomysł J.F.
nieco pożyłować.
x ma być 12 bitowe (mówiłeś, że maks to 2^13. Zakładam,
że ograniczenie się do 2^13-1 nie jest problemem)
Mamy więc całe 3 bity, możemy mnożyć przez 111_b i będzie ok.

(x*a_1)>>3 + (x*a_2)>>6 + (x*a_3)>>9 + (x*a_4)>>12 + (x*a_5)>>15

gdzie a_i to kolejne trĂłjki bitĂłw Twojego mnoĹźnika.

Jeśli mnożnik jest w okolicach 0.3, dokładniej jest <0.5
to od razu
(x*a_1)>>4 + (x*a_2)>>7 + (x*a_3)>>10 + (x*a_4)>>13 + (x*a_5)>>16

Czyli samo
(x*a_1)>>4 + (x*a_2)>>7 + (x*a_3)>>10 + (x*a_4)>>13
bo (x*a_5) jest 16 bitowe, więc przesunięcie go zjada.



pzdr
bartekltg






Re: operacje na liczbach całkowitych a dokład ność
W dniu 2012-09-19 19:25, Jakub Rakus pisze:
Quoted text here. Click to load it
najlepiej
Quoted text here. Click to load it
ją
Quoted text here. Click to load it
0,3.
Quoted text here. Click to load it
to
Quoted text here. Click to load it
czy
Quoted text here. Click to load it

Nie napisałeś w jakim języku chcesz pisać. Jeśli w c to użyj double.
Jeśli w asm to musisz na potrzeby tego mnożenia napisać własną
procedurkę mnożenia dwóch 16 bitowych z wynikiem na np 24 czy 32 bitach.
Kolejność działań to oczywiście najpierw mnożenie potem dzielenie.

--
pozdrawiam
MD

Re: operacje na liczbach całkowitych a dokład ność
Am 19.09.2012 22:32, schrieb Mario:
Quoted text here. Click to load it
ją
Quoted text here. Click to load it
0,3.
Quoted text here. Click to load it
mnożyć czy
Quoted text here. Click to load it

PrzecieĹź pisze wyraĹşnie, Ĺźe nie ma mocy obliczeniowej na floaty, a ty mu
z double wyskakujesz.

Osobiście robię takie rzeczy tak, by jak najmniej stracić i szybko
liczyć. Czyli ułamek wyrazić jako ułamek dwójkowy, czyli na przykład
twoje 0.32 jako 41/128. Następnie mnożę dwie liczby 16to bitowe z
wynikiem 32 bity i przesuwam o n = log2(128) czyli 7 w prawo. Na
większości procesorów działa bez problemu. W przypadku bardziej
"krzywych" współczynników rozkładam na pasujące czynniki, które są
później sumowane. Jak procek ma jednostkę mnożącą, to nie trzeba
przesuwać i można od razu mnożyć, ale mianownik dwójkowy jest zawsze
wygodniejszy.

Waldek

--
My jsme BorgovĂŠ. Sklopte ĹĄtĂ­ty a vzdejte se. Odpor je marnĂ˝.

Re: operacje na liczbach całkowitych a dokład ność
W dniu 2012-09-20 09:49, Waldemar Krzok pisze:
Quoted text here. Click to load it
muszę ją
Quoted text here. Click to load it
mnożyć
Quoted text here. Click to load it

Sorki miało być long.


Quoted text here. Click to load it

Zdaje się, że pytający właśnie nie wie jak zrobić żeby mieć wynik 32
bitowy.



--
pozdrawiam
MD

Re: operacje na liczbach całkowitych a dokład ność
Quoted text here. Click to load it
najlepiej
Quoted text here. Click to load it
ją
Quoted text here. Click to load it
0,3.
Quoted text here. Click to load it
to
Quoted text here. Click to load it

Jak nie zmiennoprzecinkowe, to może stałoprzecinkowe?
O ile dobrze zrozumiałem z innych postów, to kalibracja może być złożona
obliczeniowo, natomiast aplikowanie współczynnika ma być szybkie, proste
i dokładne.
Ja bym to zrobił tak: dany współczynnik (zakładając, że jest mniejszy od
1) zapisał jako liczbę stałoprzecinkową np. 0.16 (tzn 0 bitów liczby
całkowitej i 16 bitów po przecinku) lub jak nie jest potrzebna aż taka
dokładność, to 0.8. Potem w zasadzie tylko mnożysz daną przez ten
współczynnik (mnożenie 16bitx16bit lub 16bitx8bit), wywalasz wszystko
'po przecinku' do kosza (czyli bierzesz za wynik 2 najstarsze bajty) i
tyle. Jeżeli masz w procku hardwarowe mnożenie, to będzie bardzo szybko.
Natomiast przy kalibracji możesz się trochę pogimnastykować, żeby
wyliczyć ten współczynnik (też na stałoprzecinkowych, pamiętając o
zakresach liczb).

Quoted text here. Click to load it

Podstawowym błędem w rozumowaniu jest przyjęcie, że współczynnik
bedziesz trzymał w postaci dziesiętnej.



Pozdrawiam

Marek
--
"If you want something done...do yourself!"
Jean-Baptiste Emmanuel Zorg

Site Timeline