Sida 1 av 1

Wrap av input till sinus approximation

Postat: 23 juni 2013, 23:07:13
av Korken
Godagens!

Jag har en sinus approximation som fungerar mellan -pi och pi.

Kod: Markera allt

float fast_sin(x)
{
    const float B = 4/pi;
    const float C = -4/(pi*pi);
    const float P = 0.225;
    
    y = B * x + C * x * abs(x);  
    y = P * (y * abs(y) - y) + y;
}
Problemet jag har är att jag behöver ett sätt att garantera att inputen är inom de intervallet. Man kan fixa det med en loop, men det är ganska överdrivet.
Jag funderar på att använda modulo på något vis för att fixa detta, men det blir inte riktigt korrekt:

Kod: Markera allt

float a = 5.7f;
float pi = 3.1415f;
float res = modulo(a, pi); // = 2.56 = a - pi <- fel, vill ha a - 2pi

float modulo(float x, float m)
{
    int tmp = (int)(x / m);
    return x - ((float)tmp) * m;
}
Efter som den använder pi så granterar den inte att man kommer inom 2 pi utan pi, vilket blir fel ganska ofta.
Har någon är en bra tanke om hur man fixar detta? Jag behöver att det går fort så helst utan att använda if satser.

Re: Wrap av input till sinus approximation

Postat: 23 juni 2013, 23:51:18
av swp
Skulle det här fungera?

Kod: Markera allt

float res = modulo(a+pi, 2*pi) - pi;

Re: Wrap av input till sinus approximation

Postat: 24 juni 2013, 09:02:23
av Walle
Korken, code-taggarna funkar bättre om du avslutar dom med [/code] istället för [/quote] ;)

Re: Wrap av input till sinus approximation

Postat: 24 juni 2013, 15:02:45
av Korken
swp:
Den lösningen fungerar bra så länge som man inte har negativa tal. :humm:
Går det att få den fungera med negativa tal också på något smart sätt tro?

Walle:
Haha, konstigt! Det funerade i förhandsvisning fortfarande. :)

Re: Wrap av input till sinus approximation

Postat: 24 juni 2013, 16:28:40
av Icecap
abs() gör väl negativa tal till positiva? Men om det fungerar till floats vetefan...

Re: Wrap av input till sinus approximation

Postat: 24 juni 2013, 18:05:42
av Greve Hamilton
Vet inte om jag har missförstått problemet, men är det inte bara att anropa

Kod: Markera allt

float res = modulo(a, 2*pi);
istället? Jag testade att implementera det i Matlab och då ser det bra ut. Röda cirklar är fastsin och blå linje är "riktig" sinus.

Re: Wrap av input till sinus approximation

Postat: 24 juni 2013, 18:25:23
av swp
Funkar det om du i din modulo funktion avrundar till heltal med floor istället för en trunkering med en typecast

Kod: Markera allt

float modulo(float x, float m)
{
    return x - m * floor(x / m);
}

Re: Wrap av input till sinus approximation

Postat: 24 juni 2013, 22:40:25
av Korken
Greve Hamilton:
Det fungerar i Matlab för att mod(x, 2*pi) använder sig av floor som swp sa. :)

swp:
Smart där! Ska testa och se vad som händer.

Re: Wrap av input till sinus approximation

Postat: 25 juni 2013, 07:28:55
av Greve Hamilton
Nja jo visst, men jag använde din modulofunktion med single samt int-typer, inte den inbyggda. Fungerade ju fint. Kan iofs hända att Matlabs "typecast-trunkering" faktiskt genomförs med floor, det vet jag inte.