-
1. Data: 2014-02-26 20:28:59
Temat: jak policzyć
Od: "tusk, donald tusk" <N...@g...pl>
jest taki wzór:
N=(CK*2^32)/125
CK i N mogą być ułamkowe, nawet takie: 0,000001
jak to okiełznać, najlepiej bez dzielenia, tylko mnożenie i przesuwanie, bez
ułamków...
proszę o gotowe zwory...
-
2. Data: 2014-02-26 20:29:18
Temat: Re: jak policzyć
Od: "tusk, donald tusk" <N...@g...pl>
ASM
-
3. Data: 2014-02-26 23:46:00
Temat: Re: jak policzy
Od: bartekltg <b...@g...com>
W dniu 2014-02-26 20:28, tusk, donald tusk pisze:
> jest taki wzór:
>
> N=(CK*2^32)/125
Już myślałem, że szukasz tego,
http://cas.ee.ic.ac.uk/people/gac1/pubs/TheoISCAS12.
pdf
kiedyś była tu o tym dłuższa dyskusjai chyba
lepsze linki. Ale...
> CK i N mogą być ułamkowe, nawet takie: 0,000001
Jeśli są to zmienne zmiennoprzecinkowe, to gdzie problem?
liczysz stałą c = 34359738.368;
wpisujesz w kod i masz jedno mnożenie,
czy jedno fmul, skoro asm.
> jak to okiełznać, najlepiej bez dzielenia, tylko mnożenie i przesuwanie,
> bez ułamków...
Nie ma przesuwania zmiennych zmiennoprzecinkowych.
Jest operator FSCALE, który liczy y*2^floor(x), ale tu będzie
niepotrzebny, bo to stałe. Hmm, niby scalbn w c++ powinno to robić,
ale gcc nie rozwija do fscale, ale robi gdzieśtam call.
> proszę o gotowe zwory...
-ffast-math
N = ck * 34359738.368;
pzdr
bartekltg
-
4. Data: 2014-02-26 23:52:26
Temat: Re: jak policzy
Od: bartekltg <b...@g...com>
W dniu 2014-02-26 23:46, bartekltg pisze:
>
> Nie ma przesuwania zmiennych zmiennoprzecinkowych.
> Jest operator FSCALE, który liczy y*2^floor(x), ale tu będzie
> niepotrzebny, bo to stałe. Hmm, niby scalbn
Przekombinowałem i zapomniałem o ldexp, które było od zawsze.
> w c++ powinno to robić,
> ale gcc nie rozwija do fscale, ale robi gdzieśtam call.
Zamiast polegać na zrzucie do asma
-Wa,-adhls=test.s
powinienen zdeassemblować gotowca i dopiero go oglądać.
Ale to nie jest aż tak palący problem;)
pzdr
bartekltg
-
5. Data: 2014-02-27 07:03:30
Temat: Re: jak policzyć
Od: A.L. <a...@a...com>
On Wed, 26 Feb 2014 20:28:59 +0100, "tusk, donald tusk"
<N...@g...pl> wrote:
>jest taki wzór:
>
>N=(CK*2^32)/125
>
>CK i N mogą być ułamkowe, nawet takie: 0,000001
>
>jak to okiełznać, najlepiej bez dzielenia, tylko mnożenie i przesuwanie, bez
>ułamków...
>
>proszę o gotowe zwory...
A co, do pzredszkoal chodzisz?...
A.L.
-
6. Data: 2014-02-27 08:11:32
Temat: Re: jak policzy
Od: "tusk, donald tusk" <N...@g...pl>
> N = ck * 34359738.368;
dzięki, upraszczając do liczb całkowitych można napisac tak:
N= CK(od 1 do X) * 34...
ale tu pojawia się błąd zaokrąglenia, jeśli pomnożymy przez CK=1000000 to
błąd będzie duży, co można zrobić? czy tylko przemnożyć kolejny raz?
-
7. Data: 2014-02-27 13:26:53
Temat: Re: jak policzy
Od: "tusk, donald tusk" <N...@g...pl>
a istnieje jakiś patent na "ręczne" policzenie wartości sinus, cosinus tg i
ctg?
-
8. Data: 2014-02-27 14:53:43
Temat: Re: jak policzy
Od: Paweł Kierski <n...@p...net>
W dniu 2014-02-27 13:26, tusk, donald tusk pisze:
> a istnieje jakiś patent na "ręczne" policzenie wartości sinus, cosinus
> tg i ctg?
Jeśli nie potrzebujesz super dokładnie, to można tablicować
i interpolować liniowo w razie potrzeby. Ale nie wiem, czy to
interpolowanie nie będzie dłuższe niż operacja na procesorze.
--
Paweł Kierski
n...@p...net
-
9. Data: 2014-02-27 16:37:56
Temat: Re: jak policzy
Od: bartekltg <b...@g...com>
W dniu 2014-02-27 08:11, tusk, donald tusk pisze:
>> N = ck * 34359738.368;
>
> dzięki, upraszczając do liczb całkowitych można napisac tak:
>
> N= CK(od 1 do X) * 34...
Nie, to nie jest uproszczenie!
>
> ale tu pojawia się błąd zaokrąglenia, jeśli pomnożymy przez CK=1000000
> to błąd będzie duży, co można zrobić? czy tylko przemnożyć kolejny raz?
Ale na cholerę chcesz użyć liczb całkowitych?
Wyraźnie napisałeś "CK i N mogą być ułamkowe, nawet takie: 0,000001"
czyli, że te liczby są liczbami typu float (single) albo double.
Wtedy taką liczbę mnożymy przez stałą typu float lub double.
Chyba, że źle napisałeś i chciałeś zapytać o co innego,
ale wtedy musisz się precyzyjnie wysłowić.
pzdr
bartekltg
-
10. Data: 2014-02-27 16:54:34
Temat: Re: jak policzy
Od: bartekltg <b...@g...com>
W dniu 2014-02-27 13:26, tusk, donald tusk pisze:
> a istnieje jakiś patent na "ręczne" policzenie wartości sinus, cosinus
> tg i ctg?
Mnóstwo. Od Taylora i Pade'a, być może wspomaganych
tablicowaniem, przez CORDIC (gdy dodawanie jest wyraźnie
tańsze) po jakieś inne wynalazki
http://math.stackexchange.com/questions/97560/numeri
cally-efficient-approximation-of-coss
Tylko po co, jeśli rządasz maksymalnej dokładności,
nie wyprzedzisz koprocesora:
http://www.agner.org/optimize/instruction_tables.pdf
1-4 na fmul/fadd, licząc łańcuszek zależnych operacji 4.
fsin 44-100.
Z drugiej strony są w necie biblioteki do szybkiego wyliczania
nie tak dokłądnie funkcji trygonometrycznych.
pzdr
bartekltg