title: Is Python's epsilon value correct?
body: <p>According to <a href="http://en.wikipedia.org/wiki/Machine_epsilon#Variant_definitions" rel="nofollow">Wikipedia</a>:</p>
  
  <blockquote>
    <p>Machine epsilon is defined as the smallest number that, when added to one, yields a result different from one</p>
  </blockquote>
  
  <p>In Python, epsilon can be found using <code>sys.float_info.epsilon</code> and returns a value equivalent to 2^-52. However, I can add any number greater than 2^-53 to 1 and still get a result different to one.
  But by the above definition of epsilon, adding any value less than epsilon to one should give one.
  Does this mean that <code>sys.float_info.epsilon</code> is returning an incorrect value, or that Python is using some other definition of epsilon?</p>
  
  <p>The following code illustrates this, with the floating point numbers printed out in hex format.</p>
  
  <pre><code>import sys
  import numpy
  print 'epsilon=%g' % sys.float_info.epsilon
  # output: 2.22045e-16
  epsilon = sys.float_info.epsilon
  print 'epsilon(hex) = %s' % float.hex(epsilon)
  # output:  0x1.0000000000000p-52
  
  one = numpy.float64(1.0)
  
  delta = float.fromhex('0x1.fffffffffffffp-53')
  print 'delta = %s' % float.hex(delta)
  
  print 'epsilon - delta = %s' % (float.hex(epsilon-delta))
  #output: 0x1.0000000000000p-105
  
  print '\n1.0 + epsilon = %s' % (float.hex(one+numpy.float64(epsilon)))
  #output: 0x1.0000000000001p+0
  
  print '\n1.0 + delta = %s' % (float.hex(one+numpy.float64(delta)))
  #output: 0x1.0000000000001p+0
  # since delta is smaller than epsilon, I expected 0x1.0000000000001p+0
  
  delta1 = float.fromhex('0x1.0000000000001p-53')
  print '\n1.0 + %s = %s' % (float.hex(delta1), float.hex(one+delta1))
  #output: 0x1.0000000000001p+0
  # since delta is smaller than epsilon, I expected 0x1.0000000000001p+0
  
  delta2 = float.fromhex('0x1.0000000000000p-53')
  # note: delta2 = epsilon / 2.0
  print '\n1.0 + %s = %s' % (float.hex(delta2), float.hex(one+delta2))
  # 0x1.0000000000000p+0
  </code></pre>
  
  <p>The resulting output is</p>
  
  <pre><code>epsilon=2.22045e-16
  epsilon(hex) = 0x1.0000000000000p-52
  delta = 0x1.fffffffffffffp-53
  epsilon - delta = 0x1.0000000000000p-105
  
  1.0 + epsilon = 0x1.0000000000001p+0
  
  1.0 + delta = 0x1.0000000000001p+0
  
  1.0 + 0x1.0000000000001p-53 = 0x1.0000000000001p+0
  
  1.0 + 0x1.0000000000000p-53 = 0x1.0000000000000p+0
  </code></pre>