Problem mit Modulararithmetik



  • Hallo zusammen ich habe komisches Problem. Eigentlich sollte die Lösung ja ganz einfach sein, und dennoch komme ich seit stunden einfach nicht drauf. Ich habe folgende Funktionsvorschrift:

    f(-2.0f) = 0.0f
    f(-1.5f) = 0.5f
    f(-1.1f) = 0.9f
    f(-1.0f) = -1.0f
    f(-0.5f) = -0.5f
    f(0.0f) = 0.0f
    f(0.5f) = 0.5f
    f(1.0f) = 1.0f
    f(1.1f) = -0.9f
    f(1.5) = -0.5f
    f(2.0f = 0.0f

    Doch ich finde einfach partout keine Formel, welche diese Vorschrift erfüllt? Kann mir da vielleicht jemand einen Tipp geben?

    Mfg Samuel

    P.S.
    Ich hatte dieselbe Frage zuvor irtümmlicherweise noch in einem anderen Forum gestellt:
    http://www.c-plusplus.net/forum/viewtopic-var-t-is-267166-and-postdays-is-0-and-postorder-is-asc-and-start-is-0.html


  • Mod

    Das ist die Sägezahnfunktion - ein bisschen verschoben und ein bisschen gestreckt. Die Sägezahnfunktion ist gegeben durch f(x)=x-Abrunden(x). Das Verschieben und Strecken bekommst du bestimmt selber hin.



  • #include <stdio.h>
    #include <stdlib.h>
    #include <math.h>
    
    #define test(x) printf("%s=%f\n",#x,f(x))
    
    float f(float x){
    	if(x<0) return -f(-x);//wegen komisch bei f(-1)
    	return ((x+1)/2-ceil((x+1)/2))*2+1;
    }
    
    int main() {
    	test(-2.0f);
    	test(-1.5f);
    	test(-1.1f);
    	test(-1.0f);
    	test(-0.5f);
    	test(0.0f);
    	test(0.5f);
    	test(1.0f);
    	test(1.1f);
    	test(1.5f);
    	test(2.0f);
    }
    


  • SeppJ schrieb:

    Die Sägezahnfunktion ist gegeben durch f(x)=x-|x|.

    Das würde für positives x doch einfach zu x-x = 0 werden. Ich würde eher sagen x modulo maximale Auslenkung.


  • Mod

    Tobiking2 schrieb:

    SeppJ schrieb:

    Die Sägezahnfunktion ist gegeben durch f(x)=x-|x|.

    Das würde für positives x doch einfach zu x-x = 0 werden. Ich würde eher sagen x modulo maximale Auslenkung.

    Ist ja auch falsch, habs korrigiert.



  • @volkard
    Deine Formel funktioniert tatsächlich! 🙂 Ich danke dir vielmals, daran hatte ich mir wirklich die Zähne ausgebissen, egal wie ich es drehte und wendete, irgendwo hatte es nicht funktionert. Ich muss mir wohl für die Zukunft angewöhnen, für solche Formeln auch Fallunterscheidungen in Betracht zu ziehen. Ich habe eine starke Tendenz, immer alles ohne Fallunterscheidung lösen zu wollen und schliesslich scheitere ich (wie in diesem Fall) daran 😉



  • Ich kenne das nur so:

    f(-2.0f) = 0.0f 
    f(-1.5f) = 0.5f 
    f(-1.1f) = 0.9f 
    f(-1.0f) = -1.0f oder = 1.0f, ist egal
    f(-0.5f) = -0.5f 
    f(0.0f) = 0.0f 
    f(0.5f) = 0.5f 
    f(1.0f) = -1.0f oder = 1.0f, ist egal
    f(1.1f) = -0.9f 
    f(1.5) = -0.5f 
    f(2.0f = 0.0f
    

    Denn an der Gebietsgrenze berühren sich ja die beiden Splines/Interpolationen/Graphen....
    Die Festlegung auf Papier war zu restriktiv.
    Deswegen nannte ich f(-1) auch "komisch".

    edit: Aber ich hab's nicht mit fmod hingekriegt. fmod paßt irgendwie nicht in meinen Kopf hinein. Ich würde es gerne mal mit fmod und der modifizierten Aufgabenstellung (also ohne if) sehen.


Anmelden zum Antworten