-
-
Save psych0der/6319244 to your computer and use it in GitHub Desktop.
| #include <stdio.h> | |
| #include <math.h> | |
| #define precision 6 //precision for decimal digits | |
| int main(int argc, char const *argv[]) | |
| { | |
| float f,ff; | |
| scanf("%f",&f); | |
| ff = f; | |
| char str[30]; | |
| int a,b,c,k,l=0,m,i=0,j; | |
| // check for negetive float | |
| if(f<0.0) | |
| { | |
| str[i++]='-'; | |
| f*=-1; | |
| } | |
| a=f; // extracting whole number | |
| f-=a; // extracting decimal part | |
| k = precision; | |
| // number of digits in whole number | |
| while(k>-1) | |
| { | |
| l = pow(10,k); | |
| m = a/l; | |
| if(m>0) | |
| { | |
| break; | |
| } | |
| k--; | |
| } | |
| // number of digits in whole number are k+1 | |
| /* | |
| extracting most significant digit i.e. right most digit , and concatenating to string | |
| obtained as quotient by dividing number by 10^k where k = (number of digit -1) | |
| */ | |
| for(l=k+1;l>0;l--) | |
| { | |
| b = pow(10,l-1); | |
| c = a/b; | |
| str[i++]=c+48; | |
| a%=b; | |
| } | |
| str[i++] = '.'; | |
| /* extracting decimal digits till precision */ | |
| for(l=0;l<precision;l++) | |
| { | |
| f*=10.0; | |
| b = f; | |
| str[i++]=b+48; | |
| f-=b; | |
| } | |
| str[i]='\0'; | |
| printf("\n orignal printf %f\n",ff); | |
| printf("\n float string %s\n",str); | |
| return 0; | |
| } |
@Jags27 Yes exactly. Still, should work for most cases :)
does it work for precision 0??
256.6006
orignal printf 256.600586
float string 258.600585
Can we make it print like snprintf(.,.,"%*.*g", 0,-1, f) ?
orignal printf 1.030000
float string 1.029999
It is not working for precision=1 and 0 I edited it and it is working fine.
static void float_to_string(float f,char *str, u8 precision)
{
float ff;
//char str[30];
int a,b,c,k,l=0,m,i=0,j;
//scanf("%f",&f);
ff = f;
// check for negetive float
if(f<0.0)
{
str[i++]='-';
f*=-1;
}
a=f; // extracting whole number
f-=a; // extracting decimal part
k = 0;
// number of digits in whole number
while(1)
{
l = pow(10,k);
m = a/l;
if(m==0)
{
break;
}
k++;
}
k--;
// number of digits in whole number are k+1
/*
extracting most significant digit i.e. right most digit , and concatenating to string
obtained as quotient by dividing number by 10^k where k = (number of digit -1)
*/
for(l=k+1;l>0;l--)
{
b = pow(10,l-1);
c = a/b;
str[i++]=c+48;
a%=b;
}
if(precision != 0)
str[i++] = '.';
/* extracting decimal digits till precision */
for(l=0;l<precision;l++)
{
f*=10.0;
b = f;
str[i++]=b+48;
f-=b;
}
str[i]='\0';
//printf("\n orignal printf %f\n",ff);
//printf("\n float string %s\n",str);
}
Stumbled upon a corner case which caused my program to crash when trying to convert a float without any assigned decimals.
Does work:
float f = 12345.6;
Does not work:
float f = 12345.0;
This is caused by multiplying with 0 inside this for loop (when I >= 1):
/* extracting decimal digits till precision */
for (l = 0; l < PERCISION; l++)
{
f *= 10.0;
b = f;
str[i++] = b + 48;
f -= b;
}
To fix this, just exit the for loop whenever f == 0 :
/* extracting decimal digits till precision */
for (l = 0; l < PERCISION; l++)
{
f *= 10.0;
b = f;
str[i++] = b + 48;
f -= b;
if (f == 0)
{
break;
}
}
you are extarcting the float value in the int. If the float value to be converted is more that 2^31-1 (max int value assmuing 32 bit int), then the above program will not work. do you agree for the limitation ?