mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik C - Vergleich am Zahlenstrahl


Autor: Brillitsch (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Michael (Gast)
Datum:

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

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

Autor: Anton Wert (antonwert)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Stefan Kleinwort (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Brillitsch (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: sous (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Michael (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Brillitsch (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Brillitsch (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo Michael,

perfekt deine Lösung, vielen Dank.

Dank an allen. Schönen Gruß

Brillitsch

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.