And we're all too lazy to see it for what it is: infinity (∞)
Decimal('0.3') != Decimal(0.3)
from __future__ import division
import collections
import itertools
from decimal import Decimal
import pandas as pd
from sympy import init_printing, limit, oo
from sympy.abc import x
init_printing(use_unicode=True)
#seq = range(-1,-0.1,0.1) + range(0.1,1,0.1)
# import numpy as np
# np.arange(-1, 1, 0.1)
def irange_(start, stop, step=1):
cur = start
step = step
while cur <= stop:
yield cur
cur += step
def irange(start, stop, step=1):
cur = start
step = step
i = 1
while cur <= stop:
yield cur
cur = start + i*step
i += 1
def drange_(start, stop, step=1):
cur = Decimal(start)
step = Decimal(step)
while cur <= stop:
yield cur
cur += step
def drange(start, stop, step=1):
cur = Decimal(str(start)) # note the cast to str first
step = Decimal(str(step)) # note the cast to str first
while cur <= stop:
yield cur
cur += step
def frange(start, stop, step=1):
cur = float(start)
step = step
while cur <= stop:
yield cur
cur += step
import unittest
class Test_drange(unittest.TestCase):
def test_drange(self):
output = list(drange(-1,1, 0.5))
self.assertEqual(output, [-1, -0.5, 0, 0.5, 1])
def _TODO_FIXME_test_drange_2(self):
# TODO FIXME XXX
output = list(drange(-1,1, 0.3))
expected = [-1, -0.7, -0.4, -0.1, 0.2, 0.5, 0.8,]
self.assertAlmostEqual(output, expected)
self.assertEqual(output, [Decimal(x) for x in expected])
self.assertEqual(output, expected)
# unittest.main() # TODO: nbval?
def f(x):
try:
return 1 / x
except ZeroDivisionError:
#return 'ZeroDivisionError'
return float('inf')
except TypeError:
if x is None:
return None
raise
def my_point_was():
seq = drange(-1, 1, 0.1)
# seq = frange(-1, 1, 0.1)
#seq = irange_(-1, 1, 0.1)
for x in seq:
if x != 0:
y = f(x)
print((x, y))
else:
print((x, 'infinity (ZeroDivisionError)'))
my_point_was()
(Decimal('-1'), Decimal('-1')) (Decimal('-0.9'), Decimal('-1.111111111111111111111111111')) (Decimal('-0.8'), Decimal('-1.25')) (Decimal('-0.7'), Decimal('-1.428571428571428571428571429')) (Decimal('-0.6'), Decimal('-1.666666666666666666666666667')) (Decimal('-0.5'), Decimal('-2')) (Decimal('-0.4'), Decimal('-2.5')) (Decimal('-0.3'), Decimal('-3.333333333333333333333333333')) (Decimal('-0.2'), Decimal('-5')) (Decimal('-0.1'), Decimal('-1E+1')) (Decimal('0.0'), 'infinity (ZeroDivisionError)') (Decimal('0.1'), Decimal('1E+1')) (Decimal('0.2'), Decimal('5')) (Decimal('0.3'), Decimal('3.333333333333333333333333333')) (Decimal('0.4'), Decimal('2.5')) (Decimal('0.5'), Decimal('2')) (Decimal('0.6'), Decimal('1.666666666666666666666666667')) (Decimal('0.7'), Decimal('1.428571428571428571428571429')) (Decimal('0.8'), Decimal('1.25')) (Decimal('0.9'), Decimal('1.111111111111111111111111111')) (Decimal('1.0'), Decimal('1'))
def sympy_says():
"""what is the limit of f(x)=1/x as x approaches 0? oo"""
expr = (1/x)
limit_positive = limit(expr, x, 0, '+')
limit_negative = limit(expr, x, 0, '-')
print(expr)
print(limit_positive)
print(limit_negative)
print(10*oo / 2*oo) # if oo is just a symbol, this is 5*oo
print((10*oo / 2*oo) / oo) # if oo is just a symbol, this is 5
sympy_says()
1/x oo -oo oo nan
def thing(start, stop, step=1):
args = (start, stop, step)
funcs = [irange, irange_, frange, drange, drange_]
data = collections.OrderedDict(
((func.__name__, func(*args)) for func in funcs))
# print(data)
df = pd.DataFrame.from_records(
itertools.zip_longest(*data.values()),
columns=data.keys())
pd.set_option('expand_frame_repr', False)
print(df)
pd.set_option('expand_frame_repr', True)
print(df.T)
for func in funcs:
name = func.__name__
df['f(%s)' % name] = df[name].apply(f)
print(df)
print(df.T) # TODO: why is this skipping 10?
def to_decimal(n):
return Decimal(str(n))
for f1, f2 in itertools.combinations(funcs, 2):
f1_name, f2_name = 'f(%s)' % f1.__name__, 'f(%s)' % f2.__name__
name = "%s-%s" % (f1_name, f2_name)
print(('name', name))
# print(df[f1_name])
if 'drange' in f1_name:
#print(df[f2_name].astype(Decimal))
df[name] = df[f1_name] - df[f2_name].apply(to_decimal)
elif 'drange' in f2_name:
#print(df[f1_name].astype(Decimal))
df[name] = df[f1_name].apply(to_decimal) - df[f2_name]
else:
df[name] = df[f1_name] - df[f2_name]
print(df)
print(df.T)
return df
def main():
my_point_was()
print('---')
sympy_says()
print('----')
return thing(-1, 1, 0.1)
main()
(Decimal('-1'), Decimal('-1')) (Decimal('-0.9'), Decimal('-1.111111111111111111111111111')) (Decimal('-0.8'), Decimal('-1.25')) (Decimal('-0.7'), Decimal('-1.428571428571428571428571429')) (Decimal('-0.6'), Decimal('-1.666666666666666666666666667')) (Decimal('-0.5'), Decimal('-2')) (Decimal('-0.4'), Decimal('-2.5')) (Decimal('-0.3'), Decimal('-3.333333333333333333333333333')) (Decimal('-0.2'), Decimal('-5')) (Decimal('-0.1'), Decimal('-1E+1')) (Decimal('0.0'), 'infinity (ZeroDivisionError)') (Decimal('0.1'), Decimal('1E+1')) (Decimal('0.2'), Decimal('5')) (Decimal('0.3'), Decimal('3.333333333333333333333333333')) (Decimal('0.4'), Decimal('2.5')) (Decimal('0.5'), Decimal('2')) (Decimal('0.6'), Decimal('1.666666666666666666666666667')) (Decimal('0.7'), Decimal('1.428571428571428571428571429')) (Decimal('0.8'), Decimal('1.25')) (Decimal('0.9'), Decimal('1.111111111111111111111111111')) (Decimal('1.0'), Decimal('1')) --- 1/x oo -oo oo nan ---- irange irange_ frange drange drange_ 0 -1.0 -1.000000e+00 -1.000000e+00 -1 -1 1 -0.9 -9.000000e-01 -9.000000e-01 -0.9 -0.8999999999999999944488848769 2 -0.8 -8.000000e-01 -8.000000e-01 -0.8 -0.7999999999999999888977697538 3 -0.7 -7.000000e-01 -7.000000e-01 -0.7 -0.6999999999999999833466546307 4 -0.6 -6.000000e-01 -6.000000e-01 -0.6 -0.5999999999999999777955395076 5 -0.5 -5.000000e-01 -5.000000e-01 -0.5 -0.4999999999999999722444243845 6 -0.4 -4.000000e-01 -4.000000e-01 -0.4 -0.3999999999999999666933092614 7 -0.3 -3.000000e-01 -3.000000e-01 -0.3 -0.2999999999999999611421941383 8 -0.2 -2.000000e-01 -2.000000e-01 -0.2 -0.1999999999999999555910790152 9 -0.1 -1.000000e-01 -1.000000e-01 -0.1 -0.09999999999999995003996389207 10 0.0 -1.387779e-16 -1.387779e-16 0.0 5.551115123105578270211815834E-17 11 0.1 1.000000e-01 1.000000e-01 0.1 0.1000000000000000610622663542 12 0.2 2.000000e-01 2.000000e-01 0.2 0.2000000000000000666133814773 13 0.3 3.000000e-01 3.000000e-01 0.3 0.3000000000000000721644966004 14 0.4 4.000000e-01 4.000000e-01 0.4 0.4000000000000000777156117235 15 0.5 5.000000e-01 5.000000e-01 0.5 0.5000000000000000832667268466 16 0.6 6.000000e-01 6.000000e-01 0.6 0.6000000000000000888178419697 17 0.7 7.000000e-01 7.000000e-01 0.7 0.7000000000000000943689570928 18 0.8 8.000000e-01 8.000000e-01 0.8 0.8000000000000000999200722159 19 0.9 9.000000e-01 9.000000e-01 0.9 0.9000000000000001054711873390 20 1.0 1.000000e+00 1.000000e+00 1.0 None 0 1 2 \ irange -1 -0.9 -0.8 irange_ -1 -0.9 -0.8 frange -1 -0.9 -0.8 drange -1 -0.9 -0.8 drange_ -1 -0.8999999999999999944488848769 -0.7999999999999999888977697538 3 4 \ irange -0.7 -0.6 irange_ -0.7 -0.6 frange -0.7 -0.6 drange -0.7 -0.6 drange_ -0.6999999999999999833466546307 -0.5999999999999999777955395076 5 6 \ irange -0.5 -0.4 irange_ -0.5 -0.4 frange -0.5 -0.4 drange -0.5 -0.4 drange_ -0.4999999999999999722444243845 -0.3999999999999999666933092614 7 8 \ irange -0.3 -0.2 irange_ -0.3 -0.2 frange -0.3 -0.2 drange -0.3 -0.2 drange_ -0.2999999999999999611421941383 -0.1999999999999999555910790152 9 ... \ irange -0.1 ... irange_ -0.1 ... frange -0.1 ... drange -0.1 ... drange_ -0.09999999999999995003996389207 ... 11 12 \ irange 0.1 0.2 irange_ 0.1 0.2 frange 0.1 0.2 drange 0.1 0.2 drange_ 0.1000000000000000610622663542 0.2000000000000000666133814773 13 14 \ irange 0.3 0.4 irange_ 0.3 0.4 frange 0.3 0.4 drange 0.3 0.4 drange_ 0.3000000000000000721644966004 0.4000000000000000777156117235 15 16 \ irange 0.5 0.6 irange_ 0.5 0.6 frange 0.5 0.6 drange 0.5 0.6 drange_ 0.5000000000000000832667268466 0.6000000000000000888178419697 17 18 \ irange 0.7 0.8 irange_ 0.7 0.8 frange 0.7 0.8 drange 0.7 0.8 drange_ 0.7000000000000000943689570928 0.8000000000000000999200722159 19 20 irange 0.9 1 irange_ 0.9 1 frange 0.9 1 drange 0.9 1.0 drange_ 0.9000000000000001054711873390 None [5 rows x 21 columns] irange irange_ frange drange \ 0 -1.0 -1.000000e+00 -1.000000e+00 -1 1 -0.9 -9.000000e-01 -9.000000e-01 -0.9 2 -0.8 -8.000000e-01 -8.000000e-01 -0.8 3 -0.7 -7.000000e-01 -7.000000e-01 -0.7 4 -0.6 -6.000000e-01 -6.000000e-01 -0.6 5 -0.5 -5.000000e-01 -5.000000e-01 -0.5 6 -0.4 -4.000000e-01 -4.000000e-01 -0.4 7 -0.3 -3.000000e-01 -3.000000e-01 -0.3 8 -0.2 -2.000000e-01 -2.000000e-01 -0.2 9 -0.1 -1.000000e-01 -1.000000e-01 -0.1 10 0.0 -1.387779e-16 -1.387779e-16 0.0 11 0.1 1.000000e-01 1.000000e-01 0.1 12 0.2 2.000000e-01 2.000000e-01 0.2 13 0.3 3.000000e-01 3.000000e-01 0.3 14 0.4 4.000000e-01 4.000000e-01 0.4 15 0.5 5.000000e-01 5.000000e-01 0.5 16 0.6 6.000000e-01 6.000000e-01 0.6 17 0.7 7.000000e-01 7.000000e-01 0.7 18 0.8 8.000000e-01 8.000000e-01 0.8 19 0.9 9.000000e-01 9.000000e-01 0.9 20 1.0 1.000000e+00 1.000000e+00 1.0 drange_ f(irange) f(irange_) f(frange) \ 0 -1 -1.000000 -1.000000e+00 -1.000000e+00 1 -0.8999999999999999944488848769 -1.111111 -1.111111e+00 -1.111111e+00 2 -0.7999999999999999888977697538 -1.250000 -1.250000e+00 -1.250000e+00 3 -0.6999999999999999833466546307 -1.428571 -1.428571e+00 -1.428571e+00 4 -0.5999999999999999777955395076 -1.666667 -1.666667e+00 -1.666667e+00 5 -0.4999999999999999722444243845 -2.000000 -2.000000e+00 -2.000000e+00 6 -0.3999999999999999666933092614 -2.500000 -2.500000e+00 -2.500000e+00 7 -0.2999999999999999611421941383 -3.333333 -3.333333e+00 -3.333333e+00 8 -0.1999999999999999555910790152 -5.000000 -5.000000e+00 -5.000000e+00 9 -0.09999999999999995003996389207 -10.000000 -1.000000e+01 -1.000000e+01 10 5.551115123105578270211815834E-17 inf -7.205759e+15 -7.205759e+15 11 0.1000000000000000610622663542 10.000000 1.000000e+01 1.000000e+01 12 0.2000000000000000666133814773 5.000000 5.000000e+00 5.000000e+00 13 0.3000000000000000721644966004 3.333333 3.333333e+00 3.333333e+00 14 0.4000000000000000777156117235 2.500000 2.500000e+00 2.500000e+00 15 0.5000000000000000832667268466 2.000000 2.000000e+00 2.000000e+00 16 0.6000000000000000888178419697 1.666667 1.666667e+00 1.666667e+00 17 0.7000000000000000943689570928 1.428571 1.428571e+00 1.428571e+00 18 0.8000000000000000999200722159 1.250000 1.250000e+00 1.250000e+00 19 0.9000000000000001054711873390 1.111111 1.111111e+00 1.111111e+00 20 None 1.000000 1.000000e+00 1.000000e+00 f(drange) f(drange_) 0 -1 -1 1 -1.111111111111111111111111111 -1.111111111111111117964339658 2 -1.25 -1.250000000000000017347234760 3 -1.428571428571428571428571429 -1.428571428571428605414990550 4 -1.666666666666666666666666667 -1.666666666666666728345723590 5 -2 -2.000000000000000111022302462 6 -2.5 -2.500000000000000208166817116 7 -3.333333333333333333333333333 -3.333333333333333765086731797 8 -5 -5.000000000000001110223024620 9 -1E+1 -10.00000000000000499600361079 10 inf 18014398509547551.13019760304 11 1E+1 9.999999999999993893773364580 12 5 4.999999999999998334665463068 13 3.333333333333333333333333333 3.333333333333332531505593329 14 2.5 2.499999999999999514277426728 15 2 1.999999999999999666933092614 16 1.666666666666666666666666667 1.666666666666666419950438973 17 1.428571428571428571428571429 1.428571428571428378838863076 18 1.25 1.249999999999999843874887163 19 1.111111111111111111111111111 1.111111111111110980899768717 20 1 None 0 1 \ irange -1 -0.9 irange_ -1 -0.9 frange -1 -0.9 drange -1 -0.9 drange_ -1 -0.8999999999999999944488848769 f(irange) -1 -1.11111 f(irange_) -1 -1.11111 f(frange) -1 -1.11111 f(drange) -1 -1.111111111111111111111111111 f(drange_) -1 -1.111111111111111117964339658 2 3 \ irange -0.8 -0.7 irange_ -0.8 -0.7 frange -0.8 -0.7 drange -0.8 -0.7 drange_ -0.7999999999999999888977697538 -0.6999999999999999833466546307 f(irange) -1.25 -1.42857 f(irange_) -1.25 -1.42857 f(frange) -1.25 -1.42857 f(drange) -1.25 -1.428571428571428571428571429 f(drange_) -1.250000000000000017347234760 -1.428571428571428605414990550 4 5 \ irange -0.6 -0.5 irange_ -0.6 -0.5 frange -0.6 -0.5 drange -0.6 -0.5 drange_ -0.5999999999999999777955395076 -0.4999999999999999722444243845 f(irange) -1.66667 -2 f(irange_) -1.66667 -2 f(frange) -1.66667 -2 f(drange) -1.666666666666666666666666667 -2 f(drange_) -1.666666666666666728345723590 -2.000000000000000111022302462 6 7 \ irange -0.4 -0.3 irange_ -0.4 -0.3 frange -0.4 -0.3 drange -0.4 -0.3 drange_ -0.3999999999999999666933092614 -0.2999999999999999611421941383 f(irange) -2.5 -3.33333 f(irange_) -2.5 -3.33333 f(frange) -2.5 -3.33333 f(drange) -2.5 -3.333333333333333333333333333 f(drange_) -2.500000000000000208166817116 -3.333333333333333765086731797 8 9 \ irange -0.2 -0.1 irange_ -0.2 -0.1 frange -0.2 -0.1 drange -0.2 -0.1 drange_ -0.1999999999999999555910790152 -0.09999999999999995003996389207 f(irange) -5 -10 f(irange_) -5 -10 f(frange) -5 -10 f(drange) -5 -1E+1 f(drange_) -5.000000000000001110223024620 -10.00000000000000499600361079 ... 11 \ irange ... 0.1 irange_ ... 0.1 frange ... 0.1 drange ... 0.1 drange_ ... 0.1000000000000000610622663542 f(irange) ... 10 f(irange_) ... 10 f(frange) ... 10 f(drange) ... 1E+1 f(drange_) ... 9.999999999999993893773364580 12 13 \ irange 0.2 0.3 irange_ 0.2 0.3 frange 0.2 0.3 drange 0.2 0.3 drange_ 0.2000000000000000666133814773 0.3000000000000000721644966004 f(irange) 5 3.33333 f(irange_) 5 3.33333 f(frange) 5 3.33333 f(drange) 5 3.333333333333333333333333333 f(drange_) 4.999999999999998334665463068 3.333333333333332531505593329 14 15 \ irange 0.4 0.5 irange_ 0.4 0.5 frange 0.4 0.5 drange 0.4 0.5 drange_ 0.4000000000000000777156117235 0.5000000000000000832667268466 f(irange) 2.5 2 f(irange_) 2.5 2 f(frange) 2.5 2 f(drange) 2.5 2 f(drange_) 2.499999999999999514277426728 1.999999999999999666933092614 16 17 \ irange 0.6 0.7 irange_ 0.6 0.7 frange 0.6 0.7 drange 0.6 0.7 drange_ 0.6000000000000000888178419697 0.7000000000000000943689570928 f(irange) 1.66667 1.42857 f(irange_) 1.66667 1.42857 f(frange) 1.66667 1.42857 f(drange) 1.666666666666666666666666667 1.428571428571428571428571429 f(drange_) 1.666666666666666419950438973 1.428571428571428378838863076 18 19 \ irange 0.8 0.9 irange_ 0.8 0.9 frange 0.8 0.9 drange 0.8 0.9 drange_ 0.8000000000000000999200722159 0.9000000000000001054711873390 f(irange) 1.25 1.11111 f(irange_) 1.25 1.11111 f(frange) 1.25 1.11111 f(drange) 1.25 1.111111111111111111111111111 f(drange_) 1.249999999999999843874887163 1.111111111111110980899768717 20 irange 1 irange_ 1 frange 1 drange 1.0 drange_ None f(irange) 1 f(irange_) 1 f(frange) 1 f(drange) 1 f(drange_) None [10 rows x 21 columns] ('name', 'f(irange)-f(irange_)') ('name', 'f(irange)-f(frange)') ('name', 'f(irange)-f(drange)')
--------------------------------------------------------------------------- TypeError Traceback (most recent call last) ~/-wrk/-ce27/maths/lib/python3.6/site-packages/pandas/core/ops.py in na_op(x, y) 675 try: --> 676 result = expressions.evaluate(op, str_rep, x, y, **eval_kwargs) 677 except TypeError: ~/-wrk/-ce27/maths/lib/python3.6/site-packages/pandas/core/computation/expressions.py in evaluate(op, op_str, a, b, use_numexpr, **eval_kwargs) 203 if use_numexpr: --> 204 return _evaluate(op, op_str, a, b, **eval_kwargs) 205 return _evaluate_standard(op, op_str, a, b) ~/-wrk/-ce27/maths/lib/python3.6/site-packages/pandas/core/computation/expressions.py in _evaluate_standard(op, op_str, a, b, **eval_kwargs) 63 with np.errstate(all='ignore'): ---> 64 return op(a, b) 65 TypeError: unsupported operand type(s) for -: 'decimal.Decimal' and 'float' During handling of the above exception, another exception occurred: TypeError Traceback (most recent call last) ~/-wrk/-ce27/maths/lib/python3.6/site-packages/pandas/core/ops.py in safe_na_op(lvalues, rvalues) 699 with np.errstate(all='ignore'): --> 700 return na_op(lvalues, rvalues) 701 except Exception: ~/-wrk/-ce27/maths/lib/python3.6/site-packages/pandas/core/ops.py in na_op(x, y) 681 mask = notna(x) & notna(y) --> 682 result[mask] = op(x[mask], _values_from_object(y[mask])) 683 elif isinstance(x, np.ndarray): TypeError: unsupported operand type(s) for -: 'decimal.Decimal' and 'float' During handling of the above exception, another exception occurred: TypeError Traceback (most recent call last) <ipython-input-7-38102465a3b9> in <module>() 5 print('----') 6 return thing(-1, 1, 0.1) ----> 7 main() <ipython-input-7-38102465a3b9> in main() 4 sympy_says() 5 print('----') ----> 6 return thing(-1, 1, 0.1) 7 main() <ipython-input-6-b45380a6d4fc> in thing(start, stop, step) 33 elif 'drange' in f2_name: 34 #print(df[f1_name].astype(Decimal)) ---> 35 df[name] = df[f1_name].apply(to_decimal) - df[f2_name] 36 else: 37 df[name] = df[f1_name] - df[f2_name] ~/-wrk/-ce27/maths/lib/python3.6/site-packages/pandas/core/ops.py in wrapper(left, right, name, na_op) 737 lvalues = lvalues.values 738 --> 739 result = wrap_results(safe_na_op(lvalues, rvalues)) 740 return construct_result( 741 left, ~/-wrk/-ce27/maths/lib/python3.6/site-packages/pandas/core/ops.py in safe_na_op(lvalues, rvalues) 708 if is_object_dtype(lvalues): 709 return libalgos.arrmap_object(lvalues, --> 710 lambda x: op(x, rvalues)) 711 raise 712 pandas/_libs/algos_common_helper.pxi in pandas._libs.algos.arrmap_object() ~/-wrk/-ce27/maths/lib/python3.6/site-packages/pandas/core/ops.py in <lambda>(x) 708 if is_object_dtype(lvalues): 709 return libalgos.arrmap_object(lvalues, --> 710 lambda x: op(x, rvalues)) 711 raise 712 TypeError: unsupported operand type(s) for -: 'decimal.Decimal' and 'float'