#!/usr/bin/env python
import numpy as np
def poly_eval( x, a) :
return sum ( [ an*x**n for n, an in enumerate ( a) ] )
def sqrt_1px( x) :
a = [ 1.0 ,
0.49959804148061 ,
-0.12047308243453 ,
0.04585425015501 ,
-0.01076564682800 ]
return poly_eval( x, a)
def log2_1px( x) :
a = [ 0.0 ,
1.44254494359510 ,
-0.7181452567504 ,
0.45754919692582 ,
-0.27790534462866 ,
0.121797910687826 ,
-0.02584144982967 ]
return poly_eval( x, a)
def pow2x( x) :
a = [ 1.0 ,
0.69303212081966 ,
0.24137976293709 ,
0.05203236900844 ,
0.01355574723481 ]
return poly_eval( x, a)
def sin_pi2x( x) :
a = [ 0.0 ,
1.57079632679490 ,
0.0 ,
-0.64596406188166 ,
0.0 ,
0.07969158490912 ,
0.0 ,
-0.00467687997706 ,
0.0 ,
0.00015303015470 ]
return poly_eval( x, a)
def cos_pix( x) :
return 1 - 2 *sin_pi2x( x) **2
if __name__ == '__main__' :
xp = np.linspace ( 0 , 1 , 1001 )
xn = np.linspace ( -1 , 0 , 1001 )
x = np.linspace ( -1 , 1 , 2001 )
# sqrt(1+x)
mae = np.max ( np.abs ( sqrt_1px( xp) -np.sqrt ( 1 +xp) ) )
print "sqrt(1+x)\n Maximum Absolute Error: %e\n " % mae
# log2(1+x)
mae = np.max ( np.abs ( log2_1px( xp) - np.log2 ( 1 +xp) ) )
print "log2(1+x)\n Maximum Absolute Error: %e\n " % mae
# 2^x
mae = np.max ( np.abs ( pow2x( xp) - 2 **xp) )
print "2^x\n Maximum Absolute Error: %e\n " % mae
# sin(pi/2*x)
mae = np.max ( np.abs ( sin_pi2x( x) - np.sin ( np.pi /2 *x) ) )
print "sin(pi/2*x)\n Maximum Absolute Error: %e\n " % mae
# cos(pi*x)
mae = np.max ( np.abs ( cos_pix( x) - np.cos ( np.pi *x) ) )
print "cos(pi*x)\n Maximum Absolute Error: %e\n " % mae
IyEvdXNyL2Jpbi9lbnYgcHl0aG9uCgppbXBvcnQgbnVtcHkgYXMgbnAKCmRlZiBwb2x5X2V2YWwoeCwgYSk6CiAgICByZXR1cm4gc3VtKFthbip4KipuIGZvciBuLGFuIGluIGVudW1lcmF0ZShhKV0pCgpkZWYgc3FydF8xcHgoeCk6CiAgICBhID0gWzEuMCwgCiAgICAgICAgIDAuNDk5NTk4MDQxNDgwNjEsIAogICAgICAgICAtMC4xMjA0NzMwODI0MzQ1MywgCiAgICAgICAgIDAuMDQ1ODU0MjUwMTU1MDEsIAogICAgICAgICAtMC4wMTA3NjU2NDY4MjgwMCBdCiAgICByZXR1cm4gcG9seV9ldmFsKHgsIGEpCgpkZWYgbG9nMl8xcHgoeCk6CiAgICBhID0gWzAuMCwKICAgICAgICAgMS40NDI1NDQ5NDM1OTUxMCwKICAgICAgICAgLTAuNzE4MTQ1MjU2NzUwNCwKICAgICAgICAgMC40NTc1NDkxOTY5MjU4MiwKICAgICAgICAgLTAuMjc3OTA1MzQ0NjI4NjYsCiAgICAgICAgIDAuMTIxNzk3OTEwNjg3ODI2LAogICAgICAgICAtMC4wMjU4NDE0NDk4Mjk2NyBdCiAgICByZXR1cm4gcG9seV9ldmFsKHgsIGEpCgpkZWYgcG93MngoeCk6CiAgICBhID0gWyAxLjAsCiAgICAgICAgMC42OTMwMzIxMjA4MTk2NiAsCiAgICAgICAgMC4yNDEzNzk3NjI5MzcwOSwKICAgICAgICAwLjA1MjAzMjM2OTAwODQ0LAogICAgICAgIDAuMDEzNTU1NzQ3MjM0ODEgXQogICAgcmV0dXJuIHBvbHlfZXZhbCh4LGEpCiAgICAKZGVmIHNpbl9waTJ4KHgpOgogICAgYSA9IFsgMC4wLAogICAgICAgICAxLjU3MDc5NjMyNjc5NDkwLAogICAgICAgICAwLjAsCiAgICAgICAgIC0wLjY0NTk2NDA2MTg4MTY2LAogICAgICAgICAwLjAsCiAgICAgICAgIDAuMDc5NjkxNTg0OTA5MTIsCiAgICAgICAgIDAuMCwKICAgICAgICAgLTAuMDA0Njc2ODc5OTc3MDYsCiAgICAgICAgIDAuMCwKICAgICAgICAgMC4wMDAxNTMwMzAxNTQ3MCBdCiAgICByZXR1cm4gcG9seV9ldmFsKHgsIGEpCiAgICAKZGVmIGNvc19waXgoeCk6CiAgICByZXR1cm4gMSAtIDIqc2luX3BpMngoeCkqKjIKICAgIAppZiBfX25hbWVfXyA9PSAnX19tYWluX18nOgogICAgeHAgPSBucC5saW5zcGFjZSgwLCAxLCAxMDAxKQogICAgeG4gPSBucC5saW5zcGFjZSgtMSwgMCwgMTAwMSkKICAgIHggID0gbnAubGluc3BhY2UoLTEsIDEsIDIwMDEpCiAgICAKICAgICMgc3FydCgxK3gpCiAgICBtYWUgPSBucC5tYXgobnAuYWJzKHNxcnRfMXB4KHhwKS1ucC5zcXJ0KDEreHApKSkKICAgIHByaW50ICJzcXJ0KDEreClcbk1heGltdW0gQWJzb2x1dGUgRXJyb3I6ICVlXG4iICUgbWFlCiAgICAKICAgICMgbG9nMigxK3gpCiAgICBtYWUgPSBucC5tYXgobnAuYWJzKGxvZzJfMXB4KHhwKSAtIG5wLmxvZzIoMSt4cCkpKQogICAgcHJpbnQgImxvZzIoMSt4KVxuTWF4aW11bSBBYnNvbHV0ZSBFcnJvcjogJWVcbiIgJSBtYWUKICAgIAogICAgIyAyXngKICAgIG1hZSA9IG5wLm1heChucC5hYnMocG93MngoeHApIC0gMioqeHApKQogICAgcHJpbnQgIjJeeFxuTWF4aW11bSBBYnNvbHV0ZSBFcnJvcjogJWVcbiIgJSBtYWUKICAgIAogICAgIyBzaW4ocGkvMip4KQogICAgbWFlID0gbnAubWF4KG5wLmFicyhzaW5fcGkyeCh4KSAtIG5wLnNpbihucC5waS8yKngpKSkKICAgIHByaW50ICJzaW4ocGkvMip4KVxuTWF4aW11bSBBYnNvbHV0ZSBFcnJvcjogJWVcbiIgJSBtYWUgICAgCiAgICAKICAgICMgY29zKHBpKngpCiAgICBtYWUgPSBucC5tYXgobnAuYWJzKGNvc19waXgoeCkgLSBucC5jb3MobnAucGkqeCkpKQogICAgcHJpbnQgImNvcyhwaSp4KVxuTWF4aW11bSBBYnNvbHV0ZSBFcnJvcjogJWVcbiIgJSBtYWUK