Wie trenne ich bei Fließkommazahlen Wert und Exp.?

Hallo liebe Experten!

Mit dem C++ Builder 4 möchte ich ein Programm schreiben, daß mir Spulen- und Kondensatorwerte berechnet. Diese Werte liegen typischerweise in Größenordnungen von 10^-6 bis 10^-12.

Die Variablen habe ich als „double“ deklariert. Natürlich möchte ich nicht, daß das Programm mir einen Wurm an Zahl herausgibt wie z.B. „0.000000138“, sondern ich möchte erhalten : z.B. „138 10^-9“.

Was ich gemacht habe, ist: Ich wollte die Mantisse von dem Exponenten trennen und getrennt angeben. Dazu habe ich den Befehl „frexp“ benutzt. Dieser Befehl führt allerdings eine Operation durch, die ich gar nicht verstehe.

Meine Frage an Euch ist nun, wie ihr das machen würdet, den Zahlenwert von dem Exponenten zu trennen, um Zahlen des Formats z.B. 82 10^-6 herauszubekommen.

Es wäre toll, wenn ihr mir helfen könntet. Dann könnte ich endlich dieses Projekt abschließen!

Grüße

Bernhard

Hallo!

Die Formatierungsanweisung %e von printf könntest du verwenden. Ist zwar bischen unschön, da die potenzen angaben in E+123 anstatt 10^123 angegeben werden aber vielleicht reichts ja.

double fp=…;
printf( „%f %.2f %e %E\n“, fp, fp, fp, fp );

gibt die ausgabe:
251.736600 251.74 2.517366e+002 2.517366E+002

Gegeben sei eine Zahl x, etwa x=0.0035 oder so, sie soll geschrieben werden als x=a*10^b.

Man kann mit der Exponentialfunktion exp(x) und der Umkehrfunktion log(x) (Natuerlicher Logarithmus, Basis e) arbeiten. Logarithmus von x zur Basis 10 = log(x)/log(10).

Dann brauchst Du noch die Funktion floor(x), die die naechstkleinere integer-zahl ausgibt: floor(-3.3)=-4 oder floor(2.3)=2.
Den Exponenten ermittelt man so: b=floor(log(x)/log(10))
also z.B. fuer x=0.0035 -> b=floor(-2.4559)=-3

Will man nur durch 3 teilbare Potenzen, dann rechnet man weiter
b=3*floor(b/3)

a kann man dann so rechnen: a=x ^ (-b), oder wenn der Rechner kein „hoch“ anbietet, dann a=exp(-b*log(x)).

Gruss Moriarty

p.s. #include

Nur eine klitzekleine Frage
Hallo,

ich habe Deine Antwort gelesen und sie ist absolut richtig. Mich würde jedoch der mathematische Weg interessieren, wie Du zu den Unbekannten a und be kommst.

Man kann mit der Exponentialfunktion exp(x) und der Umkehrfunktion log(x) (Natuerlicher Logarithmus, Basis e) arbeiten. Logarithmus von x zur Basis 10 = log(x)/ log(10).

Das ist richtig. Du sagst hier aus, dass log(x) = log(x) ist, da log(10) = 1 ist.

Dann brauchst Du noch die Funktion floor(x), die die naechstkleinere integer-zahl ausgibt: floor(-3.3)=-4 oder floor(2.3)=2.
Den Exponenten ermittelt man so: b=floor(log(x)/log(10))
also z.B. fuer x=0.0035 -> b=floor(-2.4559)=-3

Diesen Schritt verstehe ich nicht ganz. Zuerst bestimmst Du b´=log(x), wobei b´ eine reelle Zahl ist.

Wie kommst Du darauf, dass b´ das Gleiche ist wie wie log(x)?

Wir haben es hier doch mit einer Gleichung zutun, die zwei Unbekannte besitzt, a und b.

Die beiden Unbekannten bestimmen sich wie folgt:

a = x*10^(-b)

b = log(x/a) = log(x) - log(a)

Da Du ja eine Gleichung mit zwei Unbekannten hast, darfst Du Dir einen Paramter frei wählen. Da a immer kleiner 10 ist, somit der log(a)

Kleine Antwort :smile:

Hallo,

ich habe Deine Antwort gelesen und sie ist absolut richtig.
Mich würde jedoch der mathematische Weg interessieren, wie Du
zu den Unbekannten a und be kommst.

Ich muss zugeben, ich habe keine Gleichung geloest. Ich habe mir das nur so ausgedacht. Der abgerundete Logarithmus zur Basis 10 gibt mir doch die Anzahl der Dezimalstellen an. log(100)=2, log(1000)=3, log(2000)= etwas groesser als 3, aber sicher kleiner als 4, usw., und genauso fuer Werte kleiner als 1, log(0.1)=-1, usw.
Ich will einfach eine Zahl x als a*10^b schreiben, und das b habe ich gerade ausgerechnet. Somit ist a=x/10^b.

Man kann mit der Exponentialfunktion exp(x) und der
Umkehrfunktion log(x) (Natuerlicher Logarithmus, Basis e)
arbeiten. Logarithmus von x zur Basis 10 = log(x)/
log(10).

Hierbei nahm ich an, das log(x) in C der natuerliche Logarithmus ist. Vielleicht irre ich mich auch, und er wird ln(x) geschrieben, und log(x) ist bereits der Logarithmus zur Basis 10. Dann kann man das gleich direkt verwenden. Oft ist das aber nicht implementiert, sondern nur der natuerliche, aber der reicht eben auch schon.

Das ist richtig. Du sagst hier aus, dass log(x) = log(x) ist,
da log(10) = 1 ist.

Gruss
Moriarty