Obliczenie 1/sqrt(a):
najpierw sqrt i jeszcze dzielenie - obie operacje są długo wykonywane na FPU, i razem to trwa ze 100 taktów.
Za to mnożenie i dodawanie są bardzo szybkie, więc może da się szybciej to wyliczyć.
Wyrażenia typu: q / sqrt(x2 + y2) w wielu problemach bardzo często obliczamy, więc gdyby to przyspieszyć z 5 razy byłoby znacznie lepiej.
Tu jest taki zabawny algorytm:
http://en.wikipedia.org/wiki/Fast_inverse_square_root
Trochę mała precyzja, chyba z 0.2% błędu (z jedną iteracją), czyli z 9 bitów.
Żeby uzyskać pełną dokładność należałoby wykonać kolejne iteracje Newtona - chyba minimum dwie, dla precyzji float, a dla double jeszcze jedną albo i dwie.
Powiedzmy, że mamy dobre 8 bitów, a w każdym kroku Newtona to się praktycznie podwaja:
-> 16 -> 32 -> 64; tylko 3 dodatkowe iteracje dla 64 bitów?
Razem są 4 iteracje typu:
x = x*(1.5 - a2xx); gdzie: a2 = a*0.5;
Są tu 3 mnożenia i jedno odejmowanie, razem 4.
4 x 4 = 16 operacji, co pewnie byłoby szybsze od tej bezpośredniej metody, ale raczej niewiele.
Trzeba zmniejszyć liczbę iteracji, przynajmniej o jedną, a najlepiej o dwie.
Nie można przyspieszyć zbieżność metody Newtona?
Wiemy jak błąd tu maleje, więc wyliczamy go (jedna iteracja) i coś tam korygujemy przed kolejnym krokiem... ale jak?