开发者

Convert a string to float without using inbuilt function in c

开发者 https://www.devze.com 2023-03-29 05:15 出处:网络
I don\'t know how to convert a string value to double or float. Here is the sample string I am trying to convert: \"3.45667\". I am struggling with the开发者_开发技巧 handling of the dot.

I don't know how to convert a string value to double or float. Here is the sample string I am trying to convert: "3.45667". I am struggling with the开发者_开发技巧 handling of the dot.

I tried this but it is not working:

#include<stdio.h>

int main()
{
    char string_array[] = { "3.45667" };
    float float_array[20], index = 0;

    for(index = 0 ; index < 7 ; index++)
    {
        if(string_array[index] == '.')
        {
            printf("dot");
            // here, how to add dot to the float_array?
        } else
        {
            float_array = (float)(string_array[index] - '0');
        }
    }
    return 0;
}

How to add a decimal point in the above code? I think this could be done with exponent form but I don't know how to use exponent form.


Here is an algorithm..

  1. Find the .
  2. Get a substring to that point and convert to an integer (iterate through the characters, convert to int - should be a simple problem)
  3. Do the same thing with everything after, also keep track of number of digits in the "fractional" component.
  4. Divide the "fractional" component by 10 to the power of the number of digits, and then add that to the integral component.

EDIT: if not using a C function, and given the c++ tag, I'd go with..

std::istringstream foo("3.141");
double v;
foo >> v;

No C function in sight! ;)


The following program just counts how many digits are after the decimal point and scales the result in the end, instead of each digit.

float result = 0.0;
float scale  = 0.0;

char *s = "3.14567":

while (*s) {
     if (*s >= '0' && *s <= '9') {
        result = 10.0 * result + (float)(*s - '0');
        scale *= 10.0;
     }
     else if (*s == '.') scale = 1.0;
     else  { /* ERROR HANDLING */ }
     s++;
}
result = result / (scale == 0.0 ? 1.0 : scale)


Use the position of the decimal point in the string to scale the digits by the appropriate factor of 10 when you go to sum them... so the nth item to the left of the decimal is scaled by 10^(n-1) and the mth item to the right is scaled by (0.1)^m. So...

 for each char in thestr do
    if it's a digit then
       Add the digit to the list
    else then
       dp = position - 1

 sum = 0
 for each digit in list
    sum = sum + digit * pow(10, dp - position)

 return sum


int num = 0;

// parse the numbers before the dot
while(*string != '.')
  num += 10*num + *string++ - '0';

string++;
float frac = 0.0f;
float div = 1.0f;

// parse the numbers after the dot
while(*string != '\0') {
  frac += (*string++ - '0')/div;
  div /= 10.0f;
}

float res = num + frac;

or something like this.. most probably some bugs in it..


This works in a pinch:

#include <ctype.h>

double _atof(char *s)
{
        double a = 0.0;
        int e = 0;
        int c;
        while ((c = *s++) != '\0' && isdigit(c)) {
                a = a*10.0 + (c - '0');
        }
        if (c == '.') {
                while ((c = *s++) != '\0' && isdigit(c)) {
                        a = a*10.0 + (c - '0');
                        e = e-1;
                }
        }
        if (c == 'e' || c == 'E') {
                int sign = 1;
                int i = 0;
                c = *s++;
                if (c == '+')
                        c = *s++;
                else if (c == '-') {
                        c = *s++;
                        sign = -1;
                }
                while (isdigit(c)) {
                        i = i*10 + (c - '0');
                        c = *s++;
                }
                e += i*sign;
        }
        while (e > 0) {
                a *= 10.0;
                e--;
        }
        while (e < 0) {
                a *= 0.1;
                e++;
        }
        return a;
}

You will have a double and then you will need to convert or cast to a float.

0

精彩评论

暂无评论...
验证码 换一张
取 消