Dezimalstellen
-
Hallo,
gibt's eine Funktion, die mir die Dezimalstellen einer Zahl zurückgeben kann oder wie kann man das selbst ausrechnen? Über log?
Danke.
-
Nein. Geht nicht.
(Fließkomma angenommen. Siehe IEEE 754. Einfach gesagt: Nicht jede Zahl lässt sich in einer Fließkommazahl exakt darstellen)
-
hab mal schnell was geschrieben, was trotzdem geht...
was meint ihr dazu?#include <stdio.h> int main(void){ int i=0,j; float e=0.12345; int k; e*=100000; /*10^5*/ k=(int)e; for(j=0;j<5;j++){ if(k%10) i++; k/=10; } printf("anzahl nachkommastellen: %d\n",i); return 0; }
-
Und was macht dein Programm, wenn du ihm z.B. "e=100;" oder "e=0.123456;" übergibst ;)?
-
wie kommt ihr drauf, dass der op fliesskomma meint?
btw: es gibt da so bitverschiebe-tricks mit denen man ein 'log' für integers basteln kann, also ohne irgendwelche library-funktionen oder schleifen benutzen zu müssen...
-
net schrieb:
wie kommt ihr drauf, dass der op fliesskomma meint?
Aber echt...
-
Ich meine sowas:
bei 1256 gibt's 3, bei 12 => 1 etc.
-
Achso, du meinst int-Zahlen. Da könntest du über log() weiterkommen:
int stellen = log(zahl)/log(2);
Oder (als Erweiterung von Obi's Ansatz):
int stellen(int zahl) { int i=0; while(zahl!=0) { ++i; zahl/=10; } return i; }//achtung: ungetestet
Wie net sagte, kannst du auch über Bit-Verschiebungen etwas erreichen, aber das soll er besser selber erläutern.
-
-
oder sowas:
int integer_log10 (unsigned long x) { static unsigned long table[11] = {0, 9, 99, 999, 9999, 99999, 999999, 9999999, 99999999, 999999999, 0xffffffff}; unsigned long x1; x1 = x; x |= (x >> 1); x |= (x >> 2); x |= (x >> 4); x |= (x >> 8); x = ~(x | (x >>16)); x -= ((x >> 1) & 0x55555555); x = (x & 0x33333333) + ((x >> 2) & 0x33333333); x = (x + (x >> 4)) & 0x0f0f0f0f; x += (x >> 8); x = (x + (x >> 16)) & 0x0000003f; x = (19*(31 - x)) >> 6; return x + ((table[x+1] - x1) >> 31) + 1; }