Search code examples
ckernighan-and-ritchie

K&R book exercise 4-2


I'm studying K&R book. I'm currently at chapter 4. I was reading the atof() function on page 71. Function atof(s) converts string to its double precision floating point equivalent.

The code of atof() is as following:
//atof: convert string s to double

double atof2(char s[])
{
   double val, power;
   int i, sign;

   for (i = 0; isspace(s[i]); ++i) //skip white space
       ;
   sign = (s[i] == '-') ? -1: 1;
   if (s[i] == '-' || s[i] == '-')
       ++i;

   for (val = 0.0; isdigit(s[i]); i++)
       val = 10.0 * val + (s[i] - '0');

   if (s[i] == '.')
       ++i;
   for (power = 1.0; isdigit(s[i]); i++) {
       val = 10.0 * val + (s[i] - '0');
       power *= 10.0;
   }

   return sign * val / power;

}

My question is about variable: power. Why do we need it for?

I do understand the use of variable: "val" but i'm not sure about variable: "power". Why do we divide val by power?


Solution

  • Variable power is for division of number by power , to get result as float point .

    Let your string be -12.83 , then first for loop will check for space and increment i as no space so ,i=0 .

    sign will be -1 as s[i]=s[0]='-' .

    In next two loops string's values are converted to integers and stored in val ( excluding . - figure out yourself) .

    Now after both loop val will be 1283 . But last loop will iterate for 2 times and power will be changed to 100.00 (10*1.0 in first iteration and 10*10.0 in second iteration) .

    Now to get value as float point val is divided by power and multiplied by sign .

    So , what it will return is -1*1283/100 , thus -12.83 is your float point number .