Den Exponenten einer float Variablen ohne Logarithmus finden!

Hallo,

ich habe das Problem, dass ich den Exponenten (dezimal) einer float finden will, ohne einen Logarithmus zu verwenden.
Zuerst dachte ich an das:

  float x=0.01;
  int a=0;
    for(float b=x;b<1.0;b*=10.0){
        Serial.println(b); 
        a--;
        Serial.println(a);
    }

Das Problem ist die zu schlechte Genauigkeit der float. Im Falle von x=0.01 ergibt sich auf dem seriellen Monitor:

0.01
-1
0.10
-2
1.00
-3

Kennt jemand eine Möglichkeit dieses Problem zu lösen?

Die Float Zahl ist und der exponent ist in Binärformat gespeichert. Auch wenn Du den Exponenten extrahierst und dezimal ausgibst ist er aller Wahrscheinlichkeit wegen der Umrechnung falsch.
Grüße Uwe

Und was ist daran schlecht ?

Wenn dir 2 Nachkommastellen nicht reichen, mach doch z.B.

float x = PI;
Serial.println(x,6);

Ansonsten nimm sowas wie

union {float f; byte b[4];} test; 
test.f = PI;
int pow = (test.b[3] & 0x7f) - 0x3f; //entspricht ca.  log2(f) / 2

Wenn du log nicht willst, möchtest du sicher auch keine float Multiplikation,
sonst könntest du natürlich (mit Rundungsfehlers) aus einem log2 einen log10 machen…

geht nur auf little endians mit der üblichen float-Darstellung
( auch auf einem PC ):

Das angehängte Programm liefert z.B.

314.159271 = 63 14 9d 43 --> 4
 31.415928 = d2 53 fb 41 --> 2
  3.141593 = db 0f 49 40 --> 1
  0.314159 = 7c d9 a0 3e --> -1
  0.031416 = fd ad 00 3d --> -2
  0.003142 = 2e e3 4d 3b --> -4
  0.000314 = be b5 a4 39 --> -6
  0.000031 = 98 c4 03 38 --> -7
  0.000003 = 26 d4 52 36 --> -9
  0.000000 = b8 a9 a8 34 --> -11

Nachtrag: wir ignorieren der Einfachheit halber das kleinste Bit des Exponenten
edit: pow ist natürlich vorzeichenbehaftet

NativeTest2.cpp (393 Bytes)

Das hilft, danke!