Forum: Mikrocontroller und Digitale Elektronik Formel in C implementieren


von Thomas (Gast)


Lesenswert?

Hallo,
möchte folgende Formel gerne im AVR Studio implementieren. Beim 
Simulieren bleibt das Ergebnis jedoch unabhängig von der Eingangsgröße 
1. Wäre toll wenn mir jemand den Fehler zeigen könnte.

Soll Formel:       z = [1 - |(H/60)mod_2 - 1|]*255

Meine C-Formel:  float z=(1-fabs(((H/60)%2)-1))*255;

mfg Thomas

von Bastler (Gast)


Lesenswert?

Datentypen? H eventuell int?

von Lothar M. (Firma: Titel) (lkmiller) (Moderator) Benutzerseite


Lesenswert?

Zeig mal die Deklaration von H.

von Thomas (Gast)


Lesenswert?

Auch wenn ich direkt für H einen Wert in der Formel einsetze bekomme ich 
als Ergebnis 1 heraus

von Bastler (Gast)


Lesenswert?

H=?

von Thomas (Gast)


Lesenswert?

Ein Wert zwischen 0 und 360.
Die Formel dient zur Umrechnung von HSV zu RGB.

von chris (Gast)


Lesenswert?

Thomas schrieb:
> Ein Wert zwischen 0 und 360.

also ein int

Thomas schrieb:
> (H/60)

Damit wird das hier auch in int gerechnet.
Für H < 60 ist es damit immer 0, für 60<H<120 immer 1.
Ich denke nicht, dass du das beabsichtigt hast ;)

-->
1
float z=(1-fabs((((float)H/60)%2)-1))*255;

von Bernd (Gast)


Lesenswert?

Thomas schrieb:
> 1. Wäre toll wenn mir jemand den Fehler zeigen könnte.

2. wäre toll wenn Du die Beiträge lesen würdest

von Walter (Gast)


Lesenswert?

das float kannst du dir sparen,
nach der Formel kommt halt entweder z=0 oder z=255 raus

von Thomas (Gast)


Lesenswert?

chris schrieb:
> Thomas schrieb:
>> Ein Wert zwischen 0 und 360.
>
> also ein int
>
> Thomas schrieb:
>> (H/60)
>
> Damit wird das hier auch in int gerechnet.
> Für H < 60 ist es damit immer 0, für 60<H<120 immer 1.
> Ich denke nicht, dass du das beabsichtigt hast ;)
>
> -->
> float z=(1-fabs((((float)H/60)%2)-1))*255;

Richtig, ganz so war das nicht geplant :P
Wenn ich deinen Vorschlag compilieren möchte bekomme ich nun folgende 
Fehlermeldung: invalid operands to binary % (have 'float' and 'int')
Jedoch weiß ich nicht wo denn da jetzt ein int vorkommt???

Bernd schrieb:
> Thomas schrieb:
>> 1. Wäre toll wenn mir jemand den Fehler zeigen könnte.
>
> 2. wäre toll wenn Du die Beiträge lesen würdest

Sorry natürlich auch dir vielen Dank für die Antwort. Vermutlich liegt 
hier der Fehler. Stoße bei den Datentypen und vor allem bei der 
Umrechnung und Rechnung mit verschiedenen Datentypen immer wieder auf 
Probleme.

von Stefan Salewski (Gast)


Lesenswert?

Thomas schrieb:
> Vermutlich liegt
> hier der Fehler. Stoße bei den Datentypen und vor allem bei der
> Umrechnung und Rechnung mit verschiedenen Datentypen immer wieder auf
> Probleme.

Eigentlich sollte man beim Programmieren schon etwas nachdenken und auch 
etwas Eigeninitiative entwickeln.

Wenn eine Formel nicht das liefert, was man erwartet, was würde man ohne 
Internet und Foren tun? Na die Formel mal in kleinere Einheiten 
zerlegen!
(Oder, wenn man in diesem Fall den Fehler beim Simulator vermutet, dann 
testet man den Ausdruck eben am PC mit einem C-Compiler.)

>((float)H/60)%2

% ist doch in C die Modulo-Division, die ist wohl für C nur für 
ganzzahlige Werte definiert. Du hast hier aber float mod int. Aber ich 
sehe so spontan eh nicht, dass bei deiner Formel etwas sinnvolles 
herauskommen würde. Vielleicht gibst Du am besten an, wo Du die Formel 
gefunden hast, dann kann Dir jemand sagen, wie man das am Besten in C 
schreibt.

von Stefan Salewski (Gast)


Lesenswert?

Stefan Salewski schrieb:
> Eigentlich sollte man beim Programmieren schon etwas nachdenken

Habe ich auch gerade getan -- meine Vermutung wäre, dass Du eigentlich 
statt % fmod nehmen wolltest?

Also irgendwas wie

float z=(1-fabs((((float)H/60.0) fmod 2.0)-1))*255;

von hp-freund (Gast)


Lesenswert?

Ich rate mal mit ;-)

float z=(1-fabs( fmod( ((float)H/60.0) , 2.0) -1 ) )*255;

von Stefan Salewski (Gast)


Lesenswert?

Ja klar, war ja Quatsch wie ich da fmod hingeschrieben hatte.

von hp-freund (Gast)


Lesenswert?


von hp-freund (Gast)


Angehängte Dateien:

Lesenswert?


Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.