title: Double equals 0 problem in C
body: <p>I was implementing an algorithm to calculate natural logs in C.</p>
  
  <pre><code>double taylor_ln(int z) {
      double sum = 0.0;
      double tmp = 1.0;
  
      int i = 1;
      while(tmp != 0.0) {
          tmp = (1.0 / i) * (pow(((z - 1.0) / (z + 1.0)), i));
          printf("(1.0 / %d) * (pow(((%d - 1.0) / (%d + 1.0)), %d)) = %f\n", i, z, z, i, tmp);
          sum += tmp;
          i += 2;
      }
  
      return sum * 2;
  }
  </code></pre>
  
  <p>As shown by the print statement, tmp does equal 0.0 eventually, however, the loop continues. What could be causing this?</p>
  
  <p>I am on Fedora 14 amd64 and compiling with:</p>
  
  <pre><code>clang -lm -o taylor_ln taylor_ln.c
  </code></pre>
  
  <hr>
  
  <p>Example:</p>
  
  <pre><code>$ ./taylor_ln 2
  (1.0 / 1) * (pow(((2 - 1.0) / (2 + 1.0)), 1)) = 0.333333
  (1.0 / 3) * (pow(((2 - 1.0) / (2 + 1.0)), 3)) = 0.012346
  (1.0 / 5) * (pow(((2 - 1.0) / (2 + 1.0)), 5)) = 0.000823
  (1.0 / 7) * (pow(((2 - 1.0) / (2 + 1.0)), 7)) = 0.000065
  (1.0 / 9) * (pow(((2 - 1.0) / (2 + 1.0)), 9)) = 0.000006
  (1.0 / 11) * (pow(((2 - 1.0) / (2 + 1.0)), 11)) = 0.000001
  (1.0 / 13) * (pow(((2 - 1.0) / (2 + 1.0)), 13)) = 0.000000
  (1.0 / 15) * (pow(((2 - 1.0) / (2 + 1.0)), 15)) = 0.000000
  (1.0 / 17) * (pow(((2 - 1.0) / (2 + 1.0)), 17)) = 0.000000
  (1.0 / 19) * (pow(((2 - 1.0) / (2 + 1.0)), 19)) = 0.000000
  (1.0 / 21) * (pow(((2 - 1.0) / (2 + 1.0)), 21)) = 0.000000
  and so on...
  </code></pre>