Forum: Mikrocontroller und Digitale Elektronik C - Vergleich am Zahlenstrahl


von Brillitsch (Gast)


Lesenswert?

Hallo Leute,
ich habe eine mächtige Blockade im Kopf! Vieleicht könnt ihr die mir
lösen.

Mein Problem:
Eine C-Funktion liefert Werte von -1e-8 bis +1e-8.

Ich möchte aber nur Werte im Bereich von -1e-6 bis +1e-6 auswerten.

....unwichtig.......-1e-6.......0........+1e-6......unwichtig....
                    .......... wichtig........

Werte die kleiner(unwichtig) sind sollen auf Null gesetzt werden.

Ich habe folgendes geschrieben:

float ad_wert;

if(( ad_wert < -1e-6) && ( ad_wert < 1e-6))
   ad_wert = 0;
.
.
Obiges Beispiel habe ich empierisch abgeändert,(logische Denken ist mir
schon abhanden gekommen), aber nicht funktioniert.

Gibt es Hilfe für mich? Ich schreibe mit Codevision für mega128.

Gruß   Brillitsch

von Michael (Gast)


Lesenswert?

if(( ad_wert < -1e-6) || ( ad_wert > 1e-6))
   ad_wert = 0;

Dein logisches Denken ist dir aber früh abhanden gekommen !!!

von Anton W. (antonwert)


Lesenswert?

naja wenn du Werte kleiner als einen oder größer als ein anderer auf 0
setzt, dann liegen sie ja plötzlich in der Mitte deines Bereiches.

Ich meine du willst sie eher auf deinen Bereich begrenzen (für mich
logischer) dann würdest du mit folgendem auskommen:

const double min = xxxx;
const double max = xxxx;

if ( wert > max ) wert = max;
if ( wert < min ) wert = min;


da mir Codevision nicht genau bekannt ist, müssest du das Beispiel halt
entsprechend abändern.

von Stefan Kleinwort (Gast)


Lesenswert?

Ich weiss ja nicht, was Du damit vorhast, aber ich kann mir vorstellen,
dass es so nette Seiteneffekte gibt, wenn der Wert um die Grenzen
schwankt.

In den meisten Fällen ist es sicher sinnvoller, den Wert nach oben und
unten zu begrenzen, statt bei Über- oder Unterschritung einen ganz
anderen Wert (NULL) einzusetzen:

  if (ad_wert < -1e-6){
    ad_wert = -1e-6;
  }
  if (ad_wert > 1e-6){
    ad_wert = 1e-6;
  }

Viele Grüße, Stefan

von Brillitsch (Gast)


Lesenswert?

Hallo Michael, hallo Anton,

mit mir ist es wirklich schlimm. Ich glaub ich hab meine
Problemstellung vermurkst.

Ich schrieb und das ist falsch:
....unwichtig.......-1e-6.......0........+1e-6......unwichtig....
                    .......... wichtig........

Es soll heissen:
....wichtig.........-1e-6.........0............+1e-6......wichtig....
                    ..unwichtig, auf Null setzen..

Brillitsch

von sous (Gast)


Lesenswert?

Über Deinen Ausdruck in der if-Anweisung hat der andere Michael sich
schon ausgelassen.
Ich möchte Dein Augenmerk auf etwas anderes lenken:
Du schriebst:

>>>  Eine C-Funktion liefert Werte von -1e-8 bis +1e-8.

>>>  Ich möchte aber nur Werte im Bereich von -1e-6 bis +1e-6
auswerten.

Ich hoffe, Dir ist klar, dass gilt

-1e-6 < -1e-8 < 0 < 1e-8 < 1e-6

Das heißt, wenn Deine Funktion Werte zwischen -1e-8 und +1e-8 liefert,
dass dann ALLE diese Werte AUTOMATISCH zwischen -1e-6 und 1e-6 liegen.

Gruß, Michael

von Michael (Gast)


Lesenswert?

Dann folgt halt:

float ad_wert;

if(( ad_wert > -1e-6) && ( ad_wert < 1e-6))
   ad_wert = 0;

Das was sous gesagt hat, solltest du aber wirklich nochmal überdenken.

von Brillitsch (Gast)


Lesenswert?

Hallo sous,

ja, du hast recht. Mich interessieren nur Werte ausserhalb von
-1e-6 bis +1e-6.

@Stefan Kleinwort

Die Werte werden erst durch 0,0064 geteilt und dann auf ein Display
ausgegeben. Liegt der Wert innerhalb der Grenzen von -1e-6 bis +1e-6
so soll das Display 0,00000 zeigen.


Gruß Brillitsch

von Brillitsch (Gast)


Lesenswert?

Hallo Michael,

perfekt deine Lösung, vielen Dank.

Dank an allen. Schönen Gruß

Brillitsch

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.