Forum: Compiler & IDEs Striung to Fixed Point - Nios


von phreak (Gast)


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

von Karl H. (kbuchegg)


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
1
long toLong( const char* s )
2
{
3
  long result = 0;
4
  uint8_t sign = 0;
5
6
  if( *s == '-' ) {
7
    sign = -1;
8
    s++;
9
  }
10
11
  while( *s >= '0' && *s <= '9' )
12
    result = 10 * result + ( *s++ - '0' );
13
14
  if( sign )
15
    result = -result;
16
17
  return result;
18
}

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.

von phreak (Gast)


Lesenswert?

super danke,

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

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.