Vinnaren i pepparkakshustävlingen!
  • 1
  • 2
2017-05-10, 17:18
  #13
Moderator
Neksnors avatar
Citat:
Ursprungligen postat av lasternassumma
Kanske blir det lite off-topic att fundera för mycket över algoritmen, men...
Talet som vi ska beräkna roten ur kan vi skriva som mantissa x bas ^ exponent
Antag t.ex. att basen internt är 2. Då är mantissan mellan 0,5 och 1, utom då argumentet är noll.
Justera mantissan, vid behov, så att exponenten blir jämn (öka ev. med ett). Nu har vi en mantissa som är mellan 0,25 och 1 att beräkna roten ur. Exponenten är bara att dela med två.
Roten ur [0,25-1[ finns i intervallet [0,5-1[
Men ett startvärde mitt i det intevallet konvergerar det nog snabbt.

I Haskell? Varför inte?
Fast när man omvandlar ett tal till en annan talbas så riskerar man att inte kunna uttrycka exakt samma värde. I övrigt verkar det vara en tjusig lösning. Ska fundera lite på saken.
Citera
2017-05-10, 17:41
  #14
Medlem
lasternassummas avatar
Citat:
Ursprungligen postat av Neksnor
Fast när man omvandlar ett tal till en annan talbas så riskerar man att inte kunna uttrycka exakt samma värde. I övrigt verkar det vara en tjusig lösning. Ska fundera lite på saken.

Sant, men bl.a 0 - 0,25 - 0,5 och 1,0 (och övriga heltal upp till ett visst värde) representeras exakt internt.

Jag vet inte om man kan plocka fram 2-exponenten i Haskell utan 2-log och använder man 2-log så är ju inte den exakt.

Det vore troligen lättare att optimera i assembler eller i c/c++ då man kan "bitmanipulera".

Nu var ju ditt mål att göra en test med Haskell, så jag vill inte lura iväg dig för långt, men när man implementerar sådana här funktioner i praktiken så ställs ju stora krav på prestanda och därmed algoritmval.

Citera
2017-05-10, 18:00
  #15
Moderator
Neksnors avatar
Citat:
Ursprungligen postat av lasternassumma
Sant, men bl.a 0 - 0,25 - 0,5 och 1,0 (och övriga heltal upp till ett visst värde) representeras exakt internt.

Jag vet inte om man kan plocka fram 2-exponenten i Haskell utan 2-log och använder man 2-log så är ju inte den exakt.

Det vore troligen lättare att optimera i assembler eller i c/c++ då man kan "bitmanipulera".

Nu var ju ditt mål att göra en test med Haskell, så jag vill inte lura iväg dig för långt, men när man implementerar sådana här funktioner i praktiken så ställs ju stora krav på prestanda och därmed algoritmval.

Det jag hittat är en funktion
logBase :: Floating a => a -> a -> a
som verkar vara definierad som
logBase x y = log x / log y
http://hackage.haskell.org/package/b...at.html#%2A%2A
där log är den vanliga naturliga logaritmen.

Så 2-log finns, men baseras på e-log. Tror jag. Bitmanipulering känns inte särskilt Haskell.
Citera
  • 1
  • 2

Stöd Flashback

Flashback finansieras genom donationer från våra medlemmar och besökare. Det är med hjälp av dig vi kan fortsätta erbjuda en fri samhällsdebatt. Tack för ditt stöd!

Stöd Flashback