About float/double type number in range.

Terry Reedy tjreedy at udel.edu
Wed Aug 26 13:38:48 EDT 2020


On 8/26/2020 6:40 AM, dn via Python-list wrote:
> def fp_range( start:float, stop:float, step:float=1.0 )->float:
>      """Generate a range of floating-point numbers."""
>      if stop <= start:
>          raise OverflowError( "RangeError: start must be less than stop" )
>      x = start
>      while x < stop:
>          yield x
>          x += step

This only works exactly as expected for fraction steps of k/2**n give 
exactly.  Your only tests used .5 and .25.

print(list(fp_range(0.0, 2.01, .1)))
produces
[0.0, 0.1, 0.2, 0.30000000000000004, 0.4, 0.5, 0.6, 0.7, 
0.7999999999999999, 0.8999999999999999, 0.9999999999999999, 
1.0999999999999999, 1.2, 1.3, 1.4000000000000001, 1.5000000000000002, 
1.6000000000000003, 1.7000000000000004, 1.8000000000000005, 
1.9000000000000006, 2.0000000000000004]

For exact fractional steps, one should use fractions or multiply and 
divide by the denominator, as shown by Joel, after stepping by the 
numerator.


-- 
Terry Jan Reedy




More information about the Python-list mailing list