 
 This page contains automated test results for code from O'Reilly's Ruby Cookbook. If this code looks interesting or useful, you might want to buy the whole book.
| Comparing Floating-Point Numbers | ||
|---|---|---|
| Code | Expected | Actual | 
| 1.8 + 0.1 | 1.9 | 1.9 | 
| 1.8 + 0.1 == 1.9 | false | false | 
| 1.8 + 0.1 > 1.9 | true | true | 
| class Float
  def approx(other, relative_epsilon=Float::EPSILON, epsilon=Float::EPSILON)
    difference = other - self
    return true if difference.abs <= epsilon
    relative_error = (difference / (self > other ? self : other)).abs
    return relative_error <= relative_epsilon
  end
end
100.2.approx(100.1 + 0.1) | true | true | 
| 10e10.approx(10e10+1e-5) | true | true | 
| 100.0.approx(100+1e-5) | false | false | 
| printf("%.55f", 1.9) | 1.8999999999999999111821580299874767661094665527343750000 | 1.8999999999999999111821580299874767661094665527343750000 | 
| printf("%.55f", 1.8 + 0.1) | 1.9000000000000001332267629550187848508358001708984375000 | 1.9000000000000001332267629550187848508358001708984375000 | 
| Float::EPSILON | 2.22044604925031e-16 | 2.22044604925031e-16 | 
| (1.8 + 0.1) - 1.9 | 2.22044604925031e-16 | 2.22044604925031e-16 | 
| class Float
  def absolute_approx(other, epsilon=Float::EPSILON)
    puts((other-self).abs)
    return (other-self).abs <= epsilon
  end
end
(1.8 + 0.1).absolute_approx(1.9) | true | true | 
| 10e10.absolute_approx(10e10+1e-5) | false | false | 
| 98.6.approx(98.66) | false | false | 
| 98.6.approx(98.66, 0.001) | true | true |