Здесь "изящное" и "быстроработающее" - слегка противоречивые требования. Быстрее всего будет определить число знаков делением пополам за 3-4 сравнения:
double mantissa(int c){
int a=abs(c);
int b=1;
if(a>=100000){
if(a>=10000000){
if(a>=1000000000) b=1000000000;
else if(a>=100000000) b=100000000;
else a=10000000;
}else if(a>=1000000) b=1000000;
else b=100000;
}else{
if(a>=100){
if(a>=10000) b=10000;
else if(a>=1000) b=1000;
else a=100;
}else if(a>=10) b=10;
}
return (double)c/b;
}
но такой код трудно назвать красивым.
Лучше всего был бы цикл, но не с делением, а с целочисленным умножением на 10. Но там надо следить за переполнением.
Можно, конечно, и через float. Но там после вычисления порядка надо будет возвести 10 в нужную степень, а функция pow может оказаться для этого слишком долгой.
double mantissa(int a){
if(a==0) return 0;
float f=a;
int b=((*(int*)&f&0x7fffffff)-0x40cd3ed7)/0x019a7daf;
double d=a*pow(0.1,b);
if(fabs(d)>=10) d/=10;
return d;
}