www.mikrocontroller.net

Forum: Compiler & IDEs Striung to Fixed Point - Nios


Autor: phreak (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo, wie kann ich aus einem String möglichst einfach einen Fixed Point 
machen? Die letzten 3 Stellen der Zahl sollen die Dezimalstellen 
darstellen.

z.b habe ich
char a[10]= "123,456";
double d;

will jetzt, dass in dem d 123456 steht
oder wenn der string "-11,1" ist, dass dann d-11100 ist

mir fallen da nur umständliche lösungen ein
komma suchen, ende suchen
zahlen vor dem komma *1000
zahlen nach dem komme wenn betrag kleiner 100 mal 10
wenn kleiner 10 mal 100

ergebnis = vordemkomma+nachdemkomma wenn >0
oder - wenn kleiner 0

geht das auch einfacher???

Danke schon mal

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
phreak schrieb:
> Hallo, wie kann ich aus einem String möglichst einfach einen Fixed Point
> machen? Die letzten 3 Stellen der Zahl sollen die Dezimalstellen
> darstellen.
>
> z.b habe ich
> char a[10]= "123,456";
> double d;

Fixed Point und 'double' beissen sich aber.
Genau deswegen macht man ja Fixed Point, damit man eben keine 
Gleitkommaarithmetik braucht.


> mir fallen da nur umständliche lösungen ein
> komma suchen,

komma suchen klingt erst mal gut

> ende suchen
> zahlen vor dem komma *1000
> zahlen nach dem komme wenn betrag kleiner 100 mal 10
> wenn kleiner 10 mal 100

Aber warum so umständlich weiter?
Komma aus dem String rauswerfen.
Von der ursrprünglichen Kommaposition ausgehend noch die nächsten 3 
Character mit dazu nehmen, fals sie existeieren. Wenn sie nicht 
existieren, dann ein '0' Character anhängen.

Und ab mit diesem String durch atoi oder atol oder welche Funktion du 
auch immer nimmst um die Zahl in einen Integer (int oder long) 
umzuwandeln.

Alternativ kann man auch die Umwandlung selber machen, und dann einfach 
ab Auftreten eines Kommas noch maximal 3 Stellen durch die Umwandlung 
schleusen.

eine normale String to Long Umwandlung sieht so aus
long toLong( const char* s )
{
  long result = 0;
  uint8_t sign = 0;

  if( *s == '-' ) {
    sign = -1;
    s++;
  }

  while( *s >= '0' && *s <= '9' )
    result = 10 * result + ( *s++ - '0' );

  if( sign )
    result = -result;

  return result;
}

Da jetzt noch eine Erkennung des Kommas nach der while Schleife mit rein 
und noch 3 Character aus dem String mitnehmen (sofern sie exisitieren) 
und fertig ist die Laube.

Autor: phreak (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
super danke,

dachte mir schon dass ich kompliziert denke, werde es jetzt so machen

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.