Wrap av input till sinus approximation

PIC, AVR, Arduino, Raspberry Pi, Basic Stamp, PLC mm.
Användarvisningsbild
Korken
Inlägg: 2230
Blev medlem: 3 februari 2006, 19:19:36
Ort: Luleå, Porsön

Wrap av input till sinus approximation

Inlägg 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.
swp
Inlägg: 63
Blev medlem: 31 december 2010, 00:54:56

Re: Wrap av input till sinus approximation

Inlägg av swp »

Skulle det här fungera?

Kod: Markera allt

float res = modulo(a+pi, 2*pi) - pi;
Användarvisningsbild
Walle
Moderator
Inlägg: 7701
Blev medlem: 14 december 2004, 10:32:18
Ort: Stockholm

Re: Wrap av input till sinus approximation

Inlägg av Walle »

Korken, code-taggarna funkar bättre om du avslutar dom med [/code] istället för [/quote] ;)
Användarvisningsbild
Korken
Inlägg: 2230
Blev medlem: 3 februari 2006, 19:19:36
Ort: Luleå, Porsön

Re: Wrap av input till sinus approximation

Inlägg 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. :)
Användarvisningsbild
Icecap
Inlägg: 26650
Blev medlem: 10 januari 2005, 14:52:15
Ort: Starup (Haderslev), Danmark

Re: Wrap av input till sinus approximation

Inlägg av Icecap »

abs() gör väl negativa tal till positiva? Men om det fungerar till floats vetefan...
Användarvisningsbild
Greve Hamilton
EF Sponsor
Inlägg: 544
Blev medlem: 4 september 2004, 15:03:35
Ort: GBG

Re: Wrap av input till sinus approximation

Inlägg 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.
Du har inte behörighet att öppna de filer som bifogats till detta inlägg.
swp
Inlägg: 63
Blev medlem: 31 december 2010, 00:54:56

Re: Wrap av input till sinus approximation

Inlägg 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);
}
Användarvisningsbild
Korken
Inlägg: 2230
Blev medlem: 3 februari 2006, 19:19:36
Ort: Luleå, Porsön

Re: Wrap av input till sinus approximation

Inlägg 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.
Användarvisningsbild
Greve Hamilton
EF Sponsor
Inlägg: 544
Blev medlem: 4 september 2004, 15:03:35
Ort: GBG

Re: Wrap av input till sinus approximation

Inlägg 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.
Skriv svar