Forum: Compiler & IDEs Float umwandeln


von sven (Gast)


Lesenswert?

Hi,

ich habe eine floatvariable erg, von dieser Variablen möchte ich die 
ersten zwei Stellen vor dem Komma in ein char-Array für die Ausgabe 
schreiben:

float erg;
chart Ausgabe[6];

erg =.....

ftoa(erg,0,Ausgabe);    // geht nicht, da hängt sich der Prozessor auf

itoa(erg,Ausgabe);  // hat mit Compilerwarnung funktioniert, da hab ich 
nur Angst, dass irgendwo ein Überlauf stattfindet


Wie macht man sowas "sauber"?

von Rolf Magnus (Gast)


Lesenswert?

sven schrieb:
> ftoa(erg,0,Ausgabe);    // geht nicht, da hängt sich der Prozessor auf

Wie ist denn das ftoa deklariert, das du da nutzt? Was bedeutet die 0?

> itoa(erg,Ausgabe);  // hat mit Compilerwarnung funktioniert, da hab ich
> nur Angst, dass irgendwo ein Überlauf stattfindet

Was für eine Warnung?
Welche iota benutzt du da? Ich kenne das nur mit drei Parametern.

von Guru (Gast)


Lesenswert?

Ich versuche mich mal vorsichtig Deinen Gedankengängen zu nähern.

Es kommt mir so vor, als wenn Du die ersten zwei Stellen (vor oder dem 
nach dem Komma oder unabhängig vom Exponenten)? ausgeben willst.

Zu diesem Behufe hast Du versucht ein Scrabble-Spiel auf dem Pflaster 
vor der Stadtbibliothek auszulegen (nur die Pappe), ein rohes Ei darauf 
zu zerschlagen und bei Vollmond dessen Licht darauf zu spiegeln.
Das hat nicht geklappt.

(Was soll den bitte Basis 0 sein?)


Dann hast Du einem Kaninchenfell bei Tempo 80 im Tunnel bei Herrenberg 
die dritte Synphonie von irgendeinem obskuren Komponisten vorgespielt. 
Das hat auch nicht funktioniert.

(Was für ein itoa benutzt Du da und woher weisst Du das dann die float 
Zahl immer zwishen 10 und 99 ist?)


Ich gebe ja zu das Deine Versuche in Wahrheit doch näher am 
Subjektbereich waren als ich hier vorspiegele. Aber was um Himmels 
willen reitet Dich einfach irgendwas ohne Sinn und Verstand 
rumzuprobieren von dem Du eigentlich überhaupt nicht vermuten kannst das 
es Dich in irgendeiner Weise Deinem Ziel näher bringt?

Nimms nicht übel. Ich drücke mich nun mal so blumig aus.

von Klaus W. (mfgkw)


Lesenswert?

recht effizient kann man das von Hand bauen.
Wie genau, hängt davon ab, was man über die Zahlen weiß
(immer sicher positiv, wie groß maximal? ...).

Beispiel:
1
#include <stdlib.h>
2
#include <stddef.h>
3
#include <stdio.h>
4
#include <string.h>
5
#include <stdint.h>
6
7
int main( int nargs, char **args )
8
{
9
  float f = 3.141592653;
10
11
12
  // Wenn man sicher ist, daß die Zahl nicht größer als 128 wird;
13
  // sonst entsprechend mehr als 8 Bit:
14
  int8_t ganzzahlig = f;
15
16
  char ausgabestring[3] = "  ";
17
18
  if( ganzzahlig>99 )
19
  {
20
    // Fehler zu behandeln: passt nicht in zwei Stellen
21
    // ...
22
    puts( ">99" );
23
  }
24
  else if( ganzzahlig<-9 )
25
  {
26
    // Fehler zu behandeln: passt nicht in zwei Stellen (wg. -)
27
    // ...
28
    puts( "<-9" );
29
  }
30
  else
31
  {
32
    uint8_t    tmp;
33
    if( ganzzahlig<0 )
34
    {
35
      ausgabestring[0] = '-';
36
    }
37
    else if( (tmp=(ganzzahlig/10)%10) )
38
    {
39
      ausgabestring[0] = tmp+'0';
40
    }
41
    ausgabestring[1] = (abs(ganzzahlig)%10)+'0';
42
  }
43
44
  puts( ausgabestring );
45
  return 0;
46
}

von Frank B. (f-baer)


Lesenswert?

Recht einfach gehts mit sprintf und strncat.

sprintf(hilfsstring,"%f",quellfloat);
strncat(zielstring,hilfsstring,2);

von Weissefaust (Gast)


Lesenswert?

sprintf(ziel, "%2.0f", floatwert);
müsste es auch tun

von Klaus W. (mfgkw)


Lesenswert?

Frank Bär schrieb:
> Recht einfach gehts mit sprintf und strncat.
>
> sprintf(hilfsstring,"%f",quellfloat);
> strncat(zielstring,hilfsstring,2);

Wenn die Zahl aber unter 10 ist, hat man die erste Ziffer
und den Punkt im String.

von Frank B. (f-baer)


Lesenswert?

Klaus Wachtler schrieb:
> Frank Bär schrieb:
>> Recht einfach gehts mit sprintf und strncat.
>>
>> sprintf(hilfsstring,"%f",quellfloat);
>> strncat(zielstring,hilfsstring,2);
>
> Wenn die Zahl aber unter 10 ist, hat man die erste Ziffer
> und den Punkt im String.
1
sprintf(hilfsstring, "%f",quellfloat);
2
if(value<10) strncat(zielstring,hilfsstring,1);
3
else strncat(zielstring,hilfsstring,2);

von Klaus W. (mfgkw)


Lesenswert?

wobei snprntf() jetzt nicht unbedingt das effizienteste Werkzeug auf 
einem MC ist :-)

von Karl H. (kbuchegg)


Lesenswert?

Frank Bär schrieb:
> Klaus Wachtler schrieb:
>> Frank Bär schrieb:
>>> Recht einfach gehts mit sprintf und strncat.
>>>
>>> sprintf(hilfsstring,"%f",quellfloat);
>>> strncat(zielstring,hilfsstring,2);
>>
>> Wenn die Zahl aber unter 10 ist, hat man die erste Ziffer
>> und den Punkt im String.
>
>
1
> sprintf(hilfsstring, "%f",quellfloat);
2
> if(value<10) strncat(zielstring,hilfsstring,1);
3
> else strncat(zielstring,hilfsstring,2);
4
>

SChau dir lieber an, was man mit dem Formatstring so alles treiben kann. 
sprintf kann das schon ganz alleine. Man muss es ihm nur sagen.

von myTwoCent (Gast)


Lesenswert?

sven schrieb:
> ich habe eine floatvariable erg

Das solltest du vermeiden, wenn das irgendwie hinzukriegen ist. Wenn du 
schon weißt, dass dein Ergebnis zwischen 0 und 99 ist, sind Integerzahl 
auf dem uC meist die bessere Wahl. Wozu willst du da die Dynamik 
mitschleppen, die dir der Exponent bietet.

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.