Nachkommastellen in c verwenden

Gast #4118618
Lesenswert?
• ▲
▼
Hallo,

ich möchte unter c die Nachkommastellen einer double abtrennen und 
verwenden. Ich kann aber nicht sagen wie viele Nachkommastellen ich 
habe. Das kann sich immer ändern.

Gibt es dafür eine Funktion, oder wie kann man sowas lösen?

double test = 42.123456789;
uint test1 = (uint)test = 42;
uint test2 = ??? = 123456789;

Dirk
Gast #4118649
Lesenswert?
• ▲
▼
double modf (double x, double* intpart);




Break into fractional and integral parts
 Breaks x into an integral and a fractional part.

The integer part is stored in the object pointed by intpart, and the 
fractional part is returned by the function.

Both parts have the same sign as x.
(Firma: guloshop.de) #4118651
Lesenswert?
• ▲
▼
Walter S. schrieb:
> da musst du dich auf die ANzahl festlegen,

Nicht notwendig.

So gehts:
1
  double test = 42.123456789;
2
  unsigned int test1;
3
  char s[30];
4

5
  test1= atoi(strchr((snprintf(s,sizeof(s),"%f",test),s),'.')+1);
(sofern garantiert ist, dass es überhaupt Nachkommastellen gibt)

Aber wie Walter S. schon schreibt: mit fester Anzahl wärs einfacher.
Gast #4118875
Lesenswert?
• ▲
▼
Dirk schrieb:
> Ich kann aber nicht sagen wie viele Nachkommastellen ich
> habe. Das kann sich immer ändern.

Na eben. Das nennt man Gleitkomma-Format. Also ist dein Begehren 
schlichtweg das Abtrennen des ganzen Teiles, womit der Rest - sprich 
alles was Nachkomma ist - übrigbleibt.

double d;
int64  i;
double result;

  i = d;
  result = d-i;

das war's. Jedenfalls dann, wenn d nicht allzu groß ist. Aber den Test 
(if fabs(d) > ...)

W.S.
Gast #4118891
Lesenswert?
• ▲
▼
modf.

Alles andere ist Unfug. float zu int und umgekehrt ist ein potentieller 
Performancekiller. Der Umweg über sprintf wird den nächsten Bearbeiter 
des Codes an Deiner geistigen Gesundheit zweifeln lassen.
(Firma: guloshop.de) #4118903
Lesenswert?
• ▲
▼
Walter S. schrieb:
> Markus Weber schrieb:
>> test1= atoi(strchr((snprintf(s,sizeof(s),"%f",test),s),'.')+1);
>
> das gibt aber immer eine feste Anzahl von Nachkommastellen, also
> z.B. 1.33 ergibt 330000 oder so

Äh... nein. Hast du es mal ausprobiert? Ich geb zu, meine 
Ein-Zeilen-Lösung ist ziemlich bescheuert, ich würde sie so eher nicht 
verwenden und lieber eine Schleife bauen mit *10 bzw. /10. Aber die 
Lösung funktioniert.

> der TO sollte erst Mal schreiben was er überhaupt erreichen will

Da bin ich voll und ganz bei dir. :-)
#4119057
Lesenswert?
• ▲
▼
Dirk schrieb:

> ich möchte unter c die Nachkommastellen einer double abtrennen und
> verwenden. Ich kann aber nicht sagen wie viele Nachkommastellen ich
> habe. Das kann sich immer ändern.
>
> Gibt es dafür eine Funktion, oder wie kann man sowas lösen?

Das kommt darauf an.

>
> double test = 42.123456789;

Dir ist aber klar, daß 42.123456789 als double gar nicht repräsentierbar 
ist?

Tatsächlich wird der Variablen test hier der Wert 
42.1234567890000022316598915494978427886962890625 zugewiesen. Das wären 
dann 46 Nachkommastellen in der dezimalen Repräsentation.

Lesestoff: https://docs.python.org/2/tutorial/floatingpoint.html
Gast #4119102
Lesenswert?
• ▲
▼
Markus Weber schrieb:
> Walter S. schrieb:
>> da musst du dich auf die ANzahl festlegen,
>
> Nicht notwendig.
>
> So gehts:
>   double test = 42.123456789;
>   unsigned int test1;
>   char s[30];
>
>   test1= atoi(strchr((snprintf(s,sizeof(s),"%f",test),s),'.')+1);
>
> (sofern garantiert ist, dass es überhaupt Nachkommastellen gibt)
>
> Aber wie Walter S. schon schreibt: mit fester Anzahl wärs einfacher.

Was soll der ganze Quatsch? Die Funktion nennt sich Frac(), schneidet 
die Vorkommastellen ab, ohne das man durch irgendwelche weiteren 
Kalkulationen den Fehleranteil erhöht.
#4119132
Lesenswert?
• ▲
▼
wire schrieb:

> Was soll der ganze Quatsch? Die Funktion nennt sich Frac(), schneidet
> die Vorkommastellen ab, ohne das man durch irgendwelche weiteren
> Kalkulationen den Fehleranteil erhöht.

Eher nicht. Wenn überhaupt, heißt die Funktion aus math.h modf, aber 
auch die liefert den Nachkomma-Anteil als double, nicht wie gewünscht 
als uint, womit wohl "unsigned integer" gemeint sein dürfte.

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren