#include #include using namespace std; #define TRANSCENDENTAL #include "Complex.h" #include "Quaternion.h" #include "Octonion.h" #include "Sedenion.h" #include "Trigintaduonion.h" // The Taylor series coefficients for those functions where it is not too complex too // trivial (sin, cos, sinh, cosh) or too complex (asec, acsc, acosh, acsch) // I might try the others at some point in the future, but: // asec(x)/sqrt(x - 1) has a Taylor series around x = 1 // acsc(x)/sqrt(x - 1) has a Taylor series around x = 1 // acosh(x)/sqrt(x - 1) has a Taylor series around x = 1 // acosh(x)/sqrt(x - 1) has a Taylor series around x = 1 // Don't know why I didn't do acsch - it's quite straight-forward except for // the logarithmic term, which I already do for asech. // Errors tend to occur close to branch cuts, usually when |Re(z)| << |Im(z)| /********************************************** * ****************************************** * * * * * * * Tables of Taylor Series Coefficients * * * * * * * ****************************************** * **********************************************/ static const double tanc[100] = { 0, 1.0, 0, 0.33333333333333333, 0, 0.13333333333333333, 0, 0.53968253968253968e-1, 0, 0.21869488536155203e-1, 0, 0.88632355299021966e-2, 0, 0.35921280365724810e-2, 0, 0.14558343870513183e-2, 0, 0.59002744094558598e-3, 0, 0.23912911424355248e-3, 0, 0.96915379569294503e-4, 0, 0.39278323883316834e-4, 0, 0.15918905069328965e-4, 0, 0.64516892156554308e-5, 0, 0.26147711512907546e-5, 0, 0.10597268320104654e-5, 0, 0.42949110782738059e-6, 0, 0.17406618963571648e-6, 0, 0.70546369464009683e-7, 0, 0.28591366623052539e-7, 0, 0.11587644432798852e-7, 0, 0.46962953982309016e-8, 0, 0.19033368339312759e-8, 0, 0.77139336353590623e-9, 0, 0.31263395458920870e-9, 0, 0.12670576930305401e-9, 0, 0.51351914080393677e-10, 0, 0.20812146867700474e-10, 0, 0.84348454190943383e-11, 0, 0.34185140868111558e-11, 0, 0.13854715742948469e-11, 0, 0.56151047924146801e-12, 0, 0.22757162553728748e-12, 0, 0.92231305851395317e-13, 0, 0.37379940310967389e-13, 0, 0.15149519187148605e-13, 0, 0.61398688626168138e-14, 0, 0.24883951222762789e-14, 0, 0.10085085566354096e-14, 0, 0.40873312268690138e-15, 0, 0.16565329513786284e-15, 0, 0.67136751750487117e-16, 0, 0.27209500613044588e-16, 0, 0.11027595233722371e-16, 0, 0.44693160072374125e-17, 0, 0.18113455516997667e-17, 0, 0.73411070113401475e-18, 0, 0.29752386065361939e-18, 0, 0.12058187889305073e-18, 0, 0.48869994781043705e-19 }; static const double secc[100] = { 1.0, 0, 0.5, 0, 0.20833333333333333, 0, 0.84722222222222222e-1, 0, 0.34350198412698413e-1, 0, 0.13922233245149912e-1, 0, 0.56424968100315323e-2, 0, 0.22868190951648293e-2, 0, 0.92681292737742184e-3, 0, 0.37562313385259450e-3, 0, 0.15223432221797662e-3, 0, 0.61698246877700525e-4, 0, 0.25005357609459247e-4, 0, 0.10134289721572026e-4, 0, 0.41072729198567004e-5, 0, 0.16646150151280280e-5, 0, 0.67464305456632013e-6, 0, 0.27342253129896734e-6, 0, 0.11081397802278207e-6, 0, 0.44911213669537136e-7, 0, 0.18201829311245770e-7, 0, 0.73769235610848765e-8, 0, 0.29897545073926764e-8, 0, 0.12117018619561619e-8, 0, 0.49108426750009155e-9, 0, 0.19902895700495881e-9, 0, 0.80663398011369520e-10, 0, 0.32691643852499818e-10, 0, 0.13249424201396147e-10, 0, 0.53697893706595739e-11, 0, 0.21762936597810882e-11, 0, 0.88201859824934000e-12, 0, 0.35746867347671487e-12, 0, 0.14487659644686842e-12, 0, 0.58716272936280060e-13, 0, 0.23796809091881837e-13, 0, 0.96444834564008509e-14, 0, 0.39087619176859166e-14, 0, 0.15841615363041244e-14, 0, 0.64203648775599251e-15, 0, 0.26020758752402585e-15, 0, 0.10545816304260601e-15, 0, 0.42740583616893926e-16, 0, 0.17322106086512011e-16, 0, 0.70203851674541611e-17, 0, 0.28452549391662691e-17, 0, 0.11531383928021365e-17, 0, 0.46734938744854201e-18, 0, 0.18940957244323117e-18, 0, 0.76764808292549220e-19, 0 }; static const double cscc[100] = { 0, 0.16666666666666667, 0, 0.19444444444444444e-1, 0, 0.20502645502645503e-2, 0, 0.20998677248677249e-3, 0, 0.21336045641601197e-4, 0, 0.21633474427786597e-5, 0, 0.21923271344567641e-6, 0, 0.22213930853920415e-7, 0, 0.22507674795567867e-8, 0, 0.22805107707218212e-9, 0, 0.23106421580996967e-10, 0, 0.23411704028931947e-11, 0, 0.23721016693292246e-12, 0, 0.24034415154237358e-13, 0, 0.24351953983824320e-14, 0, 0.24673688033682493e-15, 0, 0.24999672768310464e-16, 0, 0.25329964356669149e-17, 0, 0.25664619702639552e-18, 0, 0.26003696460089973e-19, 0, 0.26347253044141820e-20, 0, 0.26695348641570915e-21, 0, 0.27048043221089541e-22, 0, 0.27405397543699319e-23, 0, 0.27767473173164386e-24, 0, 0.28134332486618781e-25, 0, 0.28506038685312915e-26, 0, 0.28882655805501747e-27, 0, 0.29264248729476757e-28, 0, 0.29650883196743643e-29, 0, 0.30042625815347699e-30, 0, 0.30439544073348818e-31, 0, 0.30841706350448099e-32, 0, 0.31249181929768069e-33, 0, 0.31662041009788535e-34, 0, 0.32080354716440138e-35, 0, 0.32504195115357679e-36, 0, 0.32933635224295338e-37, 0, 0.33368749025705918e-38, 0, 0.33809611479486289e-39, 0, 0.34256298535891216e-40, 0, 0.34708887148617804e-41, 0, 0.35167455288062819e-42, 0, 0.35632081954755155e-43, 0, 0.36102847192965769e-44, 0, 0.36579832104497434e-45, 0, 0.37063118862656674e-46, 0, 0.37552790726410299e-47, 0, 0.38048932054728968e-48, 0, 0 }; static const double cotc[100] = { 0, -0.33333333333333333, 0, -0.22222222222222222e-1, 0, -0.21164021164021164e-2, 0, -0.21164021164021164e-3, 0, -0.21377799155576933e-4, 0, -0.21644042808063972e-5, 0, -0.21925947851873778e-6, 0, -0.22214608789979679e-7, 0, -0.22507846516808993e-8, 0, -0.22805151204592183e-9, 0, -0.23106432599002624e-10, 0, -0.23411706819824884e-11, 0, -0.23721017400233654e-12, 0, -0.24034415333307706e-13, 0, -0.24351954029183369e-14, 0, -0.24673688045172075e-15, 0, -0.24999672771220809e-16, 0, -0.25329964357406348e-17, 0, -0.25664619702826287e-18, 0, -0.26003696460137274e-19, 0, -0.26347253044153801e-20, 0, -0.26695348641573950e-21, 0, -0.27048043221090310e-22, 0, -0.27405397543699513e-23, 0, -0.27767473173164435e-24, 0, -0.28134332486618794e-25, 0, -0.28506038685312918e-26, 0, -0.28882655805501748e-27, 0, -0.29264248729476758e-28, 0, -0.29650883196743643e-29, 0, -0.30042625815347699e-30, 0, -0.30439544073348818e-31, 0, -0.30841706350448099e-32, 0, -0.31249181929768069e-33, 0, -0.31662041009788535e-34, 0, -0.32080354716440138e-35, 0, -0.32504195115357679e-36, 0, -0.32933635224295338e-37, 0, -0.33368749025705918e-38, 0, -0.33809611479486289e-39, 0, -0.34256298535891216e-40, 0, -0.34708887148617804e-41, 0, -0.35167455288062819e-42, 0, -0.35632081954755155e-43, 0, -0.36102847192965769e-44, 0, -0.36579832104497434e-45, 0, -0.37063118862656674e-46, 0, -0.37552790726410299e-47, 0, -0.38048932054728968e-48, 0, -0.38551628321120260e-49 }; static const double tanhc[100] = { 0, 1.0, 0, -0.33333333333333333, 0, 0.13333333333333333, 0, -0.53968253968253968e-1, 0, 0.21869488536155203e-1, 0, -0.88632355299021966e-2, 0, 0.35921280365724810e-2, 0, -0.14558343870513183e-2, 0, 0.59002744094558598e-3, 0, -0.23912911424355248e-3, 0, 0.96915379569294503e-4, 0, -0.39278323883316834e-4, 0, 0.15918905069328965e-4, 0, -0.64516892156554308e-5, 0, 0.26147711512907546e-5, 0, -0.10597268320104654e-5, 0, 0.42949110782738059e-6, 0, -0.17406618963571648e-6, 0, 0.70546369464009683e-7, 0, -0.28591366623052539e-7, 0, 0.11587644432798852e-7, 0, -0.46962953982309016e-8, 0, 0.19033368339312759e-8, 0, -0.77139336353590623e-9, 0, 0.31263395458920870e-9, 0, -0.12670576930305401e-9, 0, 0.51351914080393677e-10, 0, -0.20812146867700474e-10, 0, 0.84348454190943383e-11, 0, -0.34185140868111558e-11, 0, 0.13854715742948469e-11, 0, -0.56151047924146801e-12, 0, 0.22757162553728748e-12, 0, -0.92231305851395317e-13, 0, 0.37379940310967389e-13, 0, -0.15149519187148605e-13, 0, 0.61398688626168138e-14, 0, -0.24883951222762789e-14, 0, 0.10085085566354096e-14, 0, -0.40873312268690138e-15, 0, 0.16565329513786284e-15, 0, -0.67136751750487117e-16, 0, 0.27209500613044588e-16, 0, -0.11027595233722371e-16, 0, 0.44693160072374125e-17, 0, -0.18113455516997667e-17, 0, 0.73411070113401475e-18, 0, -0.29752386065361939e-18, 0, 0.12058187889305073e-18, 0, -0.48869994781043705e-19 }; static const double sechc[100] = { 1.0, 0, -0.5, 0, 0.20833333333333333, 0, -0.84722222222222222e-1, 0, 0.34350198412698413e-1, 0, -0.13922233245149912e-1, 0, 0.56424968100315323e-2, 0, -0.22868190951648293e-2, 0, 0.92681292737742184e-3, 0, -0.37562313385259450e-3, 0, 0.15223432221797662e-3, 0, -0.61698246877700525e-4, 0, 0.25005357609459247e-4, 0, -0.10134289721572026e-4, 0, 0.41072729198567004e-5, 0, -0.16646150151280280e-5, 0, 0.67464305456632013e-6, 0, -0.27342253129896734e-6, 0, 0.11081397802278207e-6, 0, -0.44911213669537136e-7, 0, 0.18201829311245770e-7, 0, -0.73769235610848765e-8, 0, 0.29897545073926764e-8, 0, -0.12117018619561619e-8, 0, 0.49108426750009155e-9, 0, -0.19902895700495881e-9, 0, 0.80663398011369520e-10, 0, -0.32691643852499818e-10, 0, 0.13249424201396147e-10, 0, -0.53697893706595739e-11, 0, 0.21762936597810882e-11, 0, -0.88201859824934000e-12, 0, 0.35746867347671487e-12, 0, -0.14487659644686842e-12, 0, 0.58716272936280060e-13, 0, -0.23796809091881837e-13, 0, 0.96444834564008509e-14, 0, -0.39087619176859166e-14, 0, 0.15841615363041244e-14, 0, -0.64203648775599251e-15, 0, 0.26020758752402585e-15, 0, -0.10545816304260601e-15, 0, 0.42740583616893926e-16, 0, -0.17322106086512011e-16, 0, 0.70203851674541611e-17, 0, -0.28452549391662691e-17, 0, 0.11531383928021365e-17, 0, -0.46734938744854201e-18, 0, 0.18940957244323117e-18, 0, -0.76764808292549220e-19, 0 }; static const double cschc[100] = { 0, -0.16666666666666667, 0, 0.19444444444444444e-1, 0, -0.20502645502645503e-2, 0, 0.20998677248677249e-3, 0, -0.21336045641601197e-4, 0, 0.21633474427786597e-5, 0, -0.21923271344567641e-6, 0, 0.22213930853920415e-7, 0, -0.22507674795567867e-8, 0, 0.22805107707218212e-9, 0, -0.23106421580996967e-10, 0, 0.23411704028931947e-11, 0, -0.23721016693292246e-12, 0, 0.24034415154237358e-13, 0, -0.24351953983824320e-14, 0, 0.24673688033682493e-15, 0, -0.24999672768310464e-16, 0, 0.25329964356669149e-17, 0, -0.25664619702639552e-18, 0, 0.26003696460089973e-19, 0, -0.26347253044141820e-20, 0, 0.26695348641570915e-21, 0, -0.27048043221089541e-22, 0, 0.27405397543699319e-23, 0, -0.27767473173164386e-24, 0, 0.28134332486618781e-25, 0, -0.28506038685312915e-26, 0, 0.28882655805501747e-27, 0, -0.29264248729476757e-28, 0, 0.29650883196743643e-29, 0, -0.30042625815347699e-30, 0, 0.30439544073348818e-31, 0, -0.30841706350448099e-32, 0, 0.31249181929768069e-33, 0, -0.31662041009788535e-34, 0, 0.32080354716440138e-35, 0, -0.32504195115357679e-36, 0, 0.32933635224295338e-37, 0, -0.33368749025705918e-38, 0, 0.33809611479486289e-39, 0, -0.34256298535891216e-40, 0, 0.34708887148617804e-41, 0, -0.35167455288062819e-42, 0, 0.35632081954755155e-43, 0, -0.36102847192965769e-44, 0, 0.36579832104497434e-45, 0, -0.37063118862656674e-46, 0, 0.37552790726410299e-47, 0, -0.38048932054728968e-48, 0 }; static const double cothc[100] = { 0, 0.33333333333333333, 0, -0.22222222222222222e-1, 0, 0.21164021164021164e-2, 0, -0.21164021164021164e-3, 0, 0.21377799155576933e-4, 0, -0.21644042808063972e-5, 0, 0.21925947851873778e-6, 0, -0.22214608789979679e-7, 0, 0.22507846516808993e-8, 0, -0.22805151204592183e-9, 0, 0.23106432599002624e-10, 0, -0.23411706819824884e-11, 0, 0.23721017400233654e-12, 0, -0.24034415333307706e-13, 0, 0.24351954029183369e-14, 0, -0.24673688045172075e-15, 0, 0.24999672771220809e-16, 0, -0.25329964357406348e-17, 0, 0.25664619702826287e-18, 0, -0.26003696460137274e-19, 0, 0.26347253044153801e-20, 0, -0.26695348641573950e-21, 0, 0.27048043221090310e-22, 0, -0.27405397543699513e-23, 0, 0.27767473173164435e-24, 0, -0.28134332486618794e-25, 0, 0.28506038685312918e-26, 0, -0.28882655805501748e-27, 0, 0.29264248729476758e-28, 0, -0.29650883196743643e-29, 0, 0.30042625815347699e-30, 0, -0.30439544073348818e-31, 0, 0.30841706350448099e-32, 0, -0.31249181929768069e-33, 0, 0.31662041009788535e-34, 0, -0.32080354716440138e-35, 0, 0.32504195115357679e-36, 0, -0.32933635224295338e-37, 0, 0.33368749025705918e-38, 0, -0.33809611479486289e-39, 0, 0.34256298535891216e-40, 0, -0.34708887148617804e-41, 0, 0.35167455288062819e-42, 0, -0.35632081954755155e-43, 0, 0.36102847192965769e-44, 0, -0.36579832104497434e-45, 0, 0.37063118862656674e-46, 0, -0.37552790726410299e-47, 0, 0.38048932054728968e-48, 0, -0.38551628321120260e-49 }; static const double logc[100] = { 0, 1, -0.5, 0.33333333333333333, -0.25, 0.2, -0.16666666666666667, 0.14285714285714286, -0.125, 0.11111111111111111, -0.1, 0.90909090909090909e-1, -0.83333333333333333e-1, 0.76923076923076923e-1, -0.71428571428571429e-1, 0.66666666666666667e-1, -0.625e-1, 0.58823529411764706e-1, -0.55555555555555556e-1, 0.52631578947368421e-1, -0.5e-1, 0.47619047619047619e-1, -0.45454545454545455e-1, 0.43478260869565217e-1, -0.41666666666666667e-1, 0.4e-1, -0.38461538461538462e-1, 0.37037037037037037e-1, -0.35714285714285714e-1, 0.34482758620689655e-1, -0.33333333333333333e-1, 0.32258064516129032e-1, -0.3125e-1, 0.30303030303030303e-1, -0.29411764705882353e-1, 0.28571428571428571e-1, -0.27777777777777778e-1, 0.27027027027027027e-1, -0.26315789473684211e-1, 0.25641025641025641e-1, -0.25e-1, 0.24390243902439024e-1, -0.23809523809523810e-1, 0.23255813953488372e-1, -0.22727272727272727e-1, 0.22222222222222222e-1, -0.21739130434782609e-1, 0.21276595744680851e-1, -0.20833333333333333e-1, 0.20408163265306122e-1, -0.2e-1, 0.19607843137254902e-1, -0.19230769230769231e-1, 0.18867924528301887e-1, -0.18518518518518519e-1, 0.18181818181818182e-1, -0.17857142857142857e-1, 0.17543859649122807e-1, -0.17241379310344828e-1, 0.16949152542372881e-1, -0.16666666666666667e-1, 0.16393442622950820e-1, -0.16129032258064516e-1, 0.15873015873015873e-1, -0.15625e-1, 0.15384615384615385e-1, -0.15151515151515152e-1, 0.14925373134328358e-1, -0.14705882352941176e-1, 0.14492753623188406e-1, -0.14285714285714286e-1, 0.14084507042253521e-1, -0.13888888888888889e-1, 0.13698630136986301e-1, -0.13513513513513514e-1, 0.13333333333333333e-1, -0.13157894736842105e-1, 0.12987012987012987e-1, -0.12820512820512821e-1, 0.12658227848101266e-1, -0.125e-1, 0.12345679012345679e-1, -0.12195121951219512e-1, 0.12048192771084337e-1, -0.11904761904761905e-1, 0.11764705882352941e-1, -0.11627906976744186e-1, 0.11494252873563218e-1, -0.11363636363636364e-1, 0.11235955056179775e-1, -0.11111111111111111e-1, 0.10989010989010989e-1, -0.10869565217391304e-1, 0.10752688172043011e-1, -0.10638297872340426e-1, 0.10526315789473684e-1, -0.10416666666666667e-1, 0.10309278350515464e-1, -0.10204081632653061e-1, 0.10101010101010101e-1 }; static const double asinc[100] = { 0, 1, 0, 0.16666666666666667, 0, 0.75e-1, 0, 0.44642857142857143e-1, 0, 0.30381944444444444e-1, 0, 0.22372159090909091e-1, 0, 0.17352764423076923e-1, 0, 0.1396484375e-1, 0, 0.11551800896139706e-1, 0, 0.97616095291940789e-2, 0, 0.83903358096168155e-2, 0, 0.73125258735988451e-2, 0, 0.64472103118896484e-2, 0, 0.57400376708419235e-2, 0, 0.51533096823199042e-2, 0, 0.46601434869150962e-2, 0, 0.42409070936793631e-2, 0, 0.38809645588376692e-2, 0, 0.35692053938259345e-2, 0, 0.32970595034734847e-2, 0, 0.30578216492580307e-2, 0, 0.28461784011089422e-2, 0, 0.26578706382072899e-2, 0, 0.24894486782468835e-2, 0, 0.23380918921119752e-2, 0, 0.22014739737101382e-2, 0, 0.20776610325181674e-2, 0, 0.19650336162772836e-2, 0, 0.18622264064031275e-2, 0, 0.17680811205154182e-2, 0, 0.16816093935831068e-2, 0, 0.16019632753514440e-2, 0, 0.15284115961225676e-2, 0, 0.14603208940791154e-2, 0, 0.13971399176302534e-2, 0, 0.13383869512751784e-2, 0, 0.12836393876290286e-2, 0, 0.12325250985000168e-2, 0, 0.11847152561624393e-2, 0, 0.11399183307022237e-2, 0, 0.10978750465914472e-2, 0, 0.10583541258722429e-2, 0, 0.10211486797106276e-2, 0, 0.98607313698333129e-3, 0, 0.95296061974295640e-3, 0, 0.92166069218363342e-3, 0, 0.89203742309170971e-3, 0, 0.86396771246586756e-3, 0, 0.83733984160271206e-3, 0, 0.81205221290867015e-3 }; static const double acosc[100] = { 1.5707963267948966, -1, 0, -0.16666666666666667, 0, -0.75e-1, 0, -0.44642857142857143e-1, 0, -0.30381944444444444e-1, 0, -0.22372159090909091e-1, 0, -0.17352764423076923e-1, 0, -0.1396484375e-1, 0, -0.11551800896139706e-1, 0, -0.97616095291940789e-2, 0, -0.83903358096168155e-2, 0, -0.73125258735988451e-2, 0, -0.64472103118896484e-2, 0, -0.57400376708419235e-2, 0, -0.51533096823199042e-2, 0, -0.46601434869150962e-2, 0, -0.42409070936793631e-2, 0, -0.38809645588376692e-2, 0, -0.35692053938259345e-2, 0, -0.32970595034734847e-2, 0, -0.30578216492580307e-2, 0, -0.28461784011089422e-2, 0, -0.26578706382072899e-2, 0, -0.24894486782468835e-2, 0, -0.23380918921119752e-2, 0, -0.22014739737101382e-2, 0, -0.20776610325181674e-2, 0, -0.19650336162772836e-2, 0, -0.18622264064031275e-2, 0, -0.17680811205154182e-2, 0, -0.16816093935831068e-2, 0, -0.16019632753514440e-2, 0, -0.15284115961225676e-2, 0, -0.14603208940791154e-2, 0, -0.13971399176302534e-2, 0, -0.13383869512751784e-2, 0, -0.12836393876290286e-2, 0, -0.12325250985000168e-2, 0, -0.11847152561624393e-2, 0, -0.11399183307022237e-2, 0, -0.10978750465914472e-2, 0, -0.10583541258722429e-2, 0, -0.10211486797106276e-2, 0, -0.98607313698333129e-3, 0, -0.95296061974295640e-3, 0, -0.92166069218363342e-3, 0, -0.89203742309170971e-3, 0, -0.86396771246586756e-3, 0, -0.83733984160271206e-3, 0, -0.81205221290867015e-3 }; static const double atanc[100] = { 0, 1, 0, -0.33333333333333333, 0, 0.2, 0, -0.14285714285714286, 0, 0.11111111111111111, 0, -0.90909090909090909e-1, 0, 0.76923076923076923e-1, 0, -0.66666666666666667e-1, 0, 0.58823529411764706e-1, 0, -0.52631578947368421e-1, 0, 0.47619047619047619e-1, 0, -0.43478260869565217e-1, 0, 0.4e-1, 0, -0.37037037037037037e-1, 0, 0.34482758620689655e-1, 0, -0.32258064516129032e-1, 0, 0.30303030303030303e-1, 0, -0.28571428571428571e-1, 0, 0.27027027027027027e-1, 0, -0.25641025641025641e-1, 0, 0.24390243902439024e-1, 0, -0.23255813953488372e-1, 0, 0.22222222222222222e-1, 0, -0.21276595744680851e-1, 0, 0.20408163265306122e-1, 0, -0.19607843137254902e-1, 0, 0.18867924528301887e-1, 0, -0.18181818181818182e-1, 0, 0.17543859649122807e-1, 0, -0.16949152542372881e-1, 0, 0.16393442622950820e-1, 0, -0.15873015873015873e-1, 0, 0.15384615384615385e-1, 0, -0.14925373134328358e-1, 0, 0.14492753623188406e-1, 0, -0.14084507042253521e-1, 0, 0.13698630136986301e-1, 0, -0.13333333333333333e-1, 0, 0.12987012987012987e-1, 0, -0.12658227848101266e-1, 0, 0.12345679012345679e-1, 0, -0.12048192771084337e-1, 0, 0.11764705882352941e-1, 0, -0.11494252873563218e-1, 0, 0.11235955056179775e-1, 0, -0.10989010989010989e-1, 0, 0.10752688172043011e-1, 0, -0.10526315789473684e-1, 0, 0.10309278350515464e-1, 0, -0.10101010101010101e-1 }; static const double acotc[100] = { 1.5707963267948966, -1, 0, 0.33333333333333333, 0, -0.2, 0, 0.14285714285714286, 0, -0.11111111111111111, 0, 0.90909090909090909e-1, 0, -0.76923076923076923e-1, 0, 0.66666666666666667e-1, 0, -0.58823529411764706e-1, 0, 0.52631578947368421e-1, 0, -0.47619047619047619e-1, 0, 0.43478260869565217e-1, 0, -0.4e-1, 0, 0.37037037037037037e-1, 0, -0.34482758620689655e-1, 0, 0.32258064516129032e-1, 0, -0.30303030303030303e-1, 0, 0.28571428571428571e-1, 0, -0.27027027027027027e-1, 0, 0.25641025641025641e-1, 0, -0.24390243902439024e-1, 0, 0.23255813953488372e-1, 0, -0.22222222222222222e-1, 0, 0.21276595744680851e-1, 0, -0.20408163265306122e-1, 0, 0.19607843137254902e-1, 0, -0.18867924528301887e-1, 0, 0.18181818181818182e-1, 0, -0.17543859649122807e-1, 0, 0.16949152542372881e-1, 0, -0.16393442622950820e-1, 0, 0.15873015873015873e-1, 0, -0.15384615384615385e-1, 0, 0.14925373134328358e-1, 0, -0.14492753623188406e-1, 0, 0.14084507042253521e-1, 0, -0.13698630136986301e-1, 0, 0.13333333333333333e-1, 0, -0.12987012987012987e-1, 0, 0.12658227848101266e-1, 0, -0.12345679012345679e-1, 0, 0.12048192771084337e-1, 0, -0.11764705882352941e-1, 0, 0.11494252873563218e-1, 0, -0.11235955056179775e-1, 0, 0.10989010989010989e-1, 0, -0.10752688172043011e-1, 0, 0.10526315789473684e-1, 0, -0.10309278350515464e-1, 0, 0.10101010101010101e-1 }; static const double asinhc[100] = { 0, 1, 0, -0.16666666666666667, 0, 0.75e-1, 0, -0.44642857142857143e-1, 0, 0.30381944444444444e-1, 0, -0.22372159090909091e-1, 0, 0.17352764423076923e-1, 0, -0.1396484375e-1, 0, 0.11551800896139706e-1, 0, -0.97616095291940789e-2, 0, 0.83903358096168155e-2, 0, -0.73125258735988451e-2, 0, 0.64472103118896484e-2, 0, -0.57400376708419235e-2, 0, 0.51533096823199042e-2, 0, -0.46601434869150962e-2, 0, 0.42409070936793631e-2, 0, -0.38809645588376692e-2, 0, 0.35692053938259345e-2, 0, -0.32970595034734847e-2, 0, 0.30578216492580307e-2, 0, -0.28461784011089422e-2, 0, 0.26578706382072899e-2, 0, -0.24894486782468835e-2, 0, 0.23380918921119752e-2, 0, -0.22014739737101382e-2, 0, 0.20776610325181674e-2, 0, -0.19650336162772836e-2, 0, 0.18622264064031275e-2, 0, -0.17680811205154182e-2, 0, 0.16816093935831068e-2, 0, -0.16019632753514440e-2, 0, 0.15284115961225676e-2, 0, -0.14603208940791154e-2, 0, 0.13971399176302534e-2, 0, -0.13383869512751784e-2, 0, 0.12836393876290286e-2, 0, -0.12325250985000168e-2, 0, 0.11847152561624393e-2, 0, -0.11399183307022237e-2, 0, 0.10978750465914472e-2, 0, -0.10583541258722429e-2, 0, 0.10211486797106276e-2, 0, -0.98607313698333129e-3, 0, 0.95296061974295640e-3, 0, -0.92166069218363342e-3, 0, 0.89203742309170971e-3, 0, -0.86396771246586756e-3, 0, 0.83733984160271206e-3, 0, -0.81205221290867015e-3 }; static const double atanhc[100] = { 0, 1, 0, 0.33333333333333333, 0, 0.2, 0, 0.14285714285714286, 0, 0.11111111111111111, 0, 0.90909090909090909e-1, 0, 0.76923076923076923e-1, 0, 0.66666666666666667e-1, 0, 0.58823529411764706e-1, 0, 0.52631578947368421e-1, 0, 0.47619047619047619e-1, 0, 0.43478260869565217e-1, 0, 0.4e-1, 0, 0.37037037037037037e-1, 0, 0.34482758620689655e-1, 0, 0.32258064516129032e-1, 0, 0.30303030303030303e-1, 0, 0.28571428571428571e-1, 0, 0.27027027027027027e-1, 0, 0.25641025641025641e-1, 0, 0.24390243902439024e-1, 0, 0.23255813953488372e-1, 0, 0.22222222222222222e-1, 0, 0.21276595744680851e-1, 0, 0.20408163265306122e-1, 0, 0.19607843137254902e-1, 0, 0.18867924528301887e-1, 0, 0.18181818181818182e-1, 0, 0.17543859649122807e-1, 0, 0.16949152542372881e-1, 0, 0.16393442622950820e-1, 0, 0.15873015873015873e-1, 0, 0.15384615384615385e-1, 0, 0.14925373134328358e-1, 0, 0.14492753623188406e-1, 0, 0.14084507042253521e-1, 0, 0.13698630136986301e-1, 0, 0.13333333333333333e-1, 0, 0.12987012987012987e-1, 0, 0.12658227848101266e-1, 0, 0.12345679012345679e-1, 0, 0.12048192771084337e-1, 0, 0.11764705882352941e-1, 0, 0.11494252873563218e-1, 0, 0.11235955056179775e-1, 0, 0.10989010989010989e-1, 0, 0.10752688172043011e-1, 0, 0.10526315789473684e-1, 0, 0.10309278350515464e-1, 0, 0.10101010101010101e-1 }; static const double asechc[100] = { 0.69314718055994531, 0, -0.25, 0, -0.9375e-1, 0, -0.52083333333333333e-1, 0, -0.341796875e-1, 0, -0.24609375e-1, 0, -0.18798828125e-1, 0, -0.14962332589285714e-1, 0, -0.12273788452148438e-1, 0, -0.10303921169704861e-1, 0, -0.88098526000976562e-2, 0, -0.76449134133078835e-2, 0, -0.67158440748850505e-2, 0, -0.59608083504896898e-2, 0, -0.53373564566884722e-2, 0, -0.48154816031455994e-2, 0, -0.43734354403568432e-2, 0, -0.39951105752740713e-2, 0, -0.36683499880988772e-2, 0, -0.33838242272491028e-2, 0, -0.31342671904894814e-2, 0, -0.29139445535162979e-2, 0, -0.27182767890756374e-2, 0, -0.25435671277739897e-2, 0, -0.23868021398643080e-2, 0, -0.22455034531843410e-2, 0, -0.21176160523742860e-2, 0, -0.20014231276898259e-2, 0, -0.18954804493746119e-2, 0, -0.17985652777656841e-2, 0, -0.17096362168094919e-2, 0, -0.16278013926958222e-2, 0, -0.15522930273119828e-2, 0, -0.14824469682318293e-2, 0, -0.14176860928895218e-2, 0, -0.13575067648648238e-2, 0, -0.13014677124572095e-2, 0, -0.12491808430743414e-2, 0, -0.12003036147961556e-2, 0, -0.11545326682753291e-2, 0, -0.11115984846738403e-2, 0, -0.10712608835048312e-2, 0, -0.10333052116119446e-2, 0, -0.99753910369243980e-3, 0, -0.96378971769458091e-3, 0, -0.93190136654122934e-3, 0, -0.90173348203835873e-3, 0, -0.87315885834316402e-3, 0, -0.84606213161940698e-3, 0, -0.82033845997916679e-3, 0 }; static const double acothc[100] = { 0, 1, 0, 0.33333333333333333, 0, 0.2, 0, 0.14285714285714286, 0, 0.11111111111111111, 0, 0.90909090909090909e-1, 0, 0.76923076923076923e-1, 0, 0.66666666666666667e-1, 0, 0.58823529411764706e-1, 0, 0.52631578947368421e-1, 0, 0.47619047619047619e-1, 0, 0.43478260869565217e-1, 0, 0.4e-1, 0, 0.37037037037037037e-1, 0, 0.34482758620689655e-1, 0, 0.32258064516129032e-1, 0, 0.30303030303030303e-1, 0, 0.28571428571428571e-1, 0, 0.27027027027027027e-1, 0, 0.25641025641025641e-1, 0, 0.24390243902439024e-1, 0, 0.23255813953488372e-1, 0, 0.22222222222222222e-1, 0, 0.21276595744680851e-1, 0, 0.20408163265306122e-1, 0, 0.19607843137254902e-1, 0, 0.18867924528301887e-1, 0, 0.18181818181818182e-1, 0, 0.17543859649122807e-1, 0, 0.16949152542372881e-1, 0, 0.16393442622950820e-1, 0, 0.15873015873015873e-1, 0, 0.15384615384615385e-1, 0, 0.14925373134328358e-1, 0, 0.14492753623188406e-1, 0, 0.14084507042253521e-1, 0, 0.13698630136986301e-1, 0, 0.13333333333333333e-1, 0, 0.12987012987012987e-1, 0, 0.12658227848101266e-1, 0, 0.12345679012345679e-1, 0, 0.12048192771084337e-1, 0, 0.11764705882352941e-1, 0, 0.11494252873563218e-1, 0, 0.11235955056179775e-1, 0, 0.10989010989010989e-1, 0, 0.10752688172043011e-1, 0, 0.10526315789473684e-1, 0, 0.10309278350515464e-1, 0, 0.10101010101010101e-1 }; static const double bessel_J2c[100] = { 0, 0, 0.125, 0, -0.10416666666666666667e-1, 0, 0.32552083333333333333e-3, 0, -0.54253472222222222222e-5, 0, 0.56514033564814814815e-7, 0, -0.40367166832010582011e-9, 0, 0.21024566058338844797e-11, 0, -0.83430817691820812687e-14, 0, 0.26072130528694003965e-16, 0, -0.65838713456297989810e-19, 0, 0.13716398636728747877e-21, 0, -0.23979717896378929855e-24, 0, 0.35684104012468645618e-27, 0, -0.45748851298036725151e-30, 0, 0.51058985823701702177e-33, 0, -0.50057829238923237429e-36, 0, 0.43452976769898643601e-39, 0, -0.33632334961221860372e-42, 0, 0.23355788167515180814e-45, 0, -0.14633952485911767427e-48, 0, 0.83147457306316860383e-52, 0, -0.43036986183393820074e-55, 0, 0.20377360882288740565e-58, 0, -0.88597221227342350284e-62, 0, 0.35495681581467287774e-65, 0, -0.13146548733876773250e-68, 0, 0.45146115157543864182e-72, 0, -0.14414468441105959190e-75, 0, 0.42900203693767735683e-79, 0, -0.11929978780246867543e-82, 0, 0.31067653073559550892e-86, 0, -0.75922905849363516354e-90, 0, 0.17445520645533896221e-93, 0, -0.37760867198125316496e-97, 0, 0.77125954244537002647e-101, 0, -0.14889180356088224449e-104, 0, 0.27209759422675848774e-108, 0, -0.47140955340741248742e-112, 0, 0.77534466020956001221e-116, 0, -0.12122336776259537402e-119, 0, 0.18039191631338597324e-123, 0, -0.25580249051813098871e-127, 0, 0.34605315275721183538e-131, 0, -0.44709709658554500695e-135, 0, 0.55224443748214551254e-139, 0, -0.65277120269757152782e-143, 0, 0.73909782914127211030e-147, 0, -0.80232070032704310715e-151, 0, 0.83575072950733656994e-155, 0 }; /********************************************** * ****************************************** * * * * * * * The Tester Class * * * * * * * ****************************************** * **********************************************/ template class Tester { private: double norm; int error_count; public: Tester( double n = 0.5 ):error_count( 0 ), norm( n ) { // empty } void reset() { error_count = 0; } int count() { return error_count; } void exp_test( int N, double eps = 1e-13 ) { T z; for ( int i = 0; i < N; ++i ) { z = T::random(); z *= norm/z.abs(); T approx = 1.0; T term = 1.0; for ( int j = 1; j < 100; ++j ) { term *= z/j; approx += term; } if ( abs( approx - z.exp() ) > eps ) { cout << " z = " << z << endl; cout << " |z| = " << z.abs() << endl; cout << " exp(z) = " << z.exp() << endl; cout << "Approximation: " << approx << endl; cout << " Error: " << abs( approx - z.exp() ) << endl << endl; ++error_count; } } } void sin_test( int N, double eps = 1e-13 ) { T z; for ( int i = 0; i < N; ++i ) { z = T::random(); z *= norm/z.abs(); T approx = z; T term = z; for ( int j = 1; j < 50; ++j ) { term *= -z.sqr()/((2*j)*(2*j + 1)); approx += term; } if ( abs( approx - z.sin() ) > eps ) { cout << " z = " << z << endl; cout << " |z| = " << z.abs() << endl; cout << " sin(z) = " << z.sin() << endl; cout << "Approximation: " << approx << endl; cout << " Error: " << abs( approx - z.sin() ) << endl << endl; ++error_count; } } } void cos_test( int N, double eps = 1e-13 ) { T z; for ( int i = 0; i < N; ++i ) { z = T::random(); z *= norm/z.abs(); T approx = 1.0; T term = 1.0; for ( int j = 1; j < 50; ++j ) { term *= -z.sqr()/((2*j - 1)*(2*j)); approx += term; } if ( abs( approx - z.cos() ) > eps ) { cout << " z = " << z << endl; cout << " |z| = " << z.abs() << endl; cout << " cos(z) = " << z.cos() << endl; cout << "Approximation: " << approx << endl; cout << " Error: " << abs( approx - z.cos() ) << endl << endl; ++error_count; } } } void tan_test( int N, double eps = 1e-13 ) { T z; for ( int i = 0; i < N; ++i ) { z = T::random(); z *= norm/z.abs(); T approx = 0.0; T term = 1.0; for ( int j = 1; j < 100; ++j ) { term *= z; approx += tanc[j]*term; } if ( abs( approx - z.tan() ) > eps ) { cout << " z = " << z << endl; cout << " |z| = " << z.abs() << endl; cout << " tan(z) = " << z.tan() << endl; cout << "Approximation: " << approx << endl; cout << " Error: " << abs( approx - z.tan() ) << endl << endl; ++error_count; } } } void sec_test( int N, double eps = 1e-13 ) { T z; for ( int i = 0; i < N; ++i ) { z = T::random(); z *= norm/z.abs(); T approx = 1.0; T term = 1.0; for ( int j = 1; j < 100; ++j ) { term *= z; approx += secc[j]*term; } if ( abs( approx - z.sec() ) > eps ) { cout << " z = " << z << endl; cout << " |z| = " << z.abs() << endl; cout << " sec(z) = " << z.sec() << endl; cout << "Approximation: " << approx << endl; cout << " Error: " << abs( approx - z.sec() ) << endl << endl; ++error_count; } } } void csc_test( int N, double eps = 1e-13 ) { T z; for ( int i = 0; i < N; ++i ) { z = T::random(); z *= norm/z.abs(); T approx = 1.0/z; T term = 1.0; for ( int j = 1; j < 100; ++j ) { term *= z; approx += cscc[j]*term; } if ( abs( approx - z.csc() ) > eps ) { cout << " z = " << z << endl; cout << " |z| = " << z.abs() << endl; cout << " csc(z) = " << z.csc() << endl; cout << "Approximation: " << approx << endl; cout << " Error: " << abs( approx - z.csc() ) << endl << endl; ++error_count; } } } void cot_test( int N, double eps = 1e-13 ) { T z; for ( int i = 0; i < N; ++i ) { z = T::random(); z *= norm/z.abs(); T approx = 1.0/z; T term = 1.0; for ( int j = 1; j < 100; ++j ) { term *= z; approx += cotc[j]*term; } if ( abs( approx - z.cot() ) > eps ) { cout << " z = " << z << endl; cout << " |z| = " << z.abs() << endl; cout << " cot(z) = " << z.cot() << endl; cout << "Approximation: " << approx << endl; cout << " Error: " << abs( approx - z.cot() ) << endl << endl; ++error_count; } } } void sinh_test( int N, double eps = 1e-13 ) { T z; for ( int i = 0; i < N; ++i ) { z = T::random(); z *= norm/z.abs(); T approx = z; T term = z; for ( int j = 1; j < 50; ++j ) { term *= z.sqr()/((2*j)*(2*j + 1)); approx += term; } if ( abs( approx - z.sinh() ) > eps ) { cout << " z = " << z << endl; cout << " |z| = " << z.abs() << endl; cout << " sinh(z) = " << z.sinh() << endl; cout << "Approximation: " << approx << endl; cout << " Error: " << abs( approx - z.sinh() ) << endl << endl; ++error_count; } } } void cosh_test( int N, double eps = 1e-13 ) { T z; for ( int i = 0; i < N; ++i ) { z = T::random(); z *= norm/z.abs(); T approx = 1.0; T term = 1.0; for ( int j = 1; j < 50; ++j ) { term *= z.sqr()/((2*j - 1)*(2*j)); approx += term; } if ( abs( approx - z.cosh() ) > eps ) { cout << " z = " << z << endl; cout << " |z| = " << z.abs() << endl; cout << " cosh(z) = " << z.cosh() << endl; cout << "Approximation: " << approx << endl; cout << " Error: " << abs( approx - z.cosh() ) << endl << endl; ++error_count; } } } void tanh_test( int N, double eps = 1e-13 ) { T z; for ( int i = 0; i < N; ++i ) { z = T::random(); z *= norm/z.abs(); T approx = 0.0; T term = 1.0; for ( int j = 1; j < 100; ++j ) { term *= z; approx += tanhc[j]*term; } if ( abs( approx - z.tanh() ) > eps ) { cout << " z = " << z << endl; cout << " |z| = " << z.abs() << endl; cout << " tanh(z) = " << z.tanh() << endl; cout << "Approximation: " << approx << endl; cout << " Error: " << abs( approx - z.tanh() ) << endl << endl; ++error_count; } } } void sech_test( int N, double eps = 1e-13 ) { T z; for ( int i = 0; i < N; ++i ) { z = T::random(); z *= norm/z.abs(); T approx = 1.0; T term = 1.0; for ( int j = 1; j < 100; ++j ) { term *= z; approx += sechc[j]*term; } if ( abs( approx - z.sech() ) > eps ) { cout << " z = " << z << endl; cout << " |z| = " << z.abs() << endl; cout << " sech(z) = " << z.sech() << endl; cout << "Approximation: " << approx << endl; cout << " Error: " << abs( approx - z.sech() ) << endl << endl; ++error_count; } } } void csch_test( int N, double eps = 1e-13 ) { T z; for ( int i = 0; i < N; ++i ) { z = T::random(); z *= norm/z.abs(); T approx = 1.0/z; T term = 1.0; for ( int j = 1; j < 100; ++j ) { term *= z; approx += cschc[j]*term; } if ( abs( approx - z.csch() ) > eps ) { cout << " z = " << z << endl; cout << " |z| = " << z.abs() << endl; cout << " csch(z) = " << z.csch() << endl; cout << "Approximation: " << approx << endl; cout << " Error: " << abs( approx - z.csch() ) << endl << endl; ++error_count; } } } void coth_test( int N, double eps = 1e-13 ) { T z; for ( int i = 0; i < N; ++i ) { z = T::random(); z *= norm/z.abs(); T approx = 1.0/z; T term = 1.0; for ( int j = 1; j < 100; ++j ) { term *= z; approx += cothc[j]*term; } if ( abs( approx - z.coth() ) > eps ) { cout << " z = " << z << endl; cout << " |z| = " << z.abs() << endl; cout << " coth(z) = " << z.coth() << endl; cout << "Approximation: " << approx << endl; cout << " Error: " << abs( approx - z.coth() ) << endl << endl; ++error_count; } } } void log_test( int N, double eps = 1e-13 ) { T z; for ( int i = 0; i < N; ++i ) { z = T::random(); z *= norm/z.abs(); z += 1.0; T approx = 0.0; T term = 1.0; for ( int j = 1; j < 100; ++j ) { term *= (z - 1.0); approx += logc[j]*term; } if ( abs( approx - z.log() ) > eps ) { cout << " z = " << z << endl; cout << " |z| = " << z.abs() << endl; cout << " log(z) = " << z.log() << endl; cout << "Approximation: " << approx << endl; cout << " Error: " << abs( approx - z.log() ) << endl << endl; ++error_count; } if ( abs( z - z.log().exp() ) > eps ) { cout << " z = " << z << endl; cout << " |z| = " << z.abs() << endl; cout << " log(z) = " << z.log() << endl; cout << " exp(log(z)) = " << z.log().exp() << endl; cout << " Error: " << abs( z - z.log().exp() ) << endl << endl; ++error_count; } } } void asin_test( int N, double eps = 1e-13 ) { T z; for ( int i = 0; i < N; ++i ) { z = T::random(); z *= norm/z.abs(); T approx = 0.0; T term = 1.0; for ( int j = 1; j < 100; ++j ) { term *= z; approx += asinc[j]*term; } if ( abs( approx - z.asin() ) > eps ) { cout << " z = " << z << endl; cout << " |z| = " << z.abs() << endl; cout << " asin(z) = " << z.asin() << endl; cout << "Approximation: " << approx << endl; cout << " Error: " << abs( approx - z.asin() ) << endl << endl; ++error_count; } if ( abs( z - z.asin().sin() ) > eps ) { cout << " z = " << z << endl; cout << " |z| = " << z.abs() << endl; cout << " asin(z) = " << z.asin() << endl; cout << " sin(asin(z)) = " << z.asin().sin() << endl; cout << " Error: " << abs( z - z.asin().sin() ) << endl << endl; ++error_count; } } } void acos_test( int N, double eps = 1e-13 ) { T z; for ( int i = 0; i < N; ++i ) { z = T::random(); z *= norm/z.abs(); T approx = acosc[0]; T term = 1.0; for ( int j = 1; j < 100; ++j ) { term *= z; approx += acosc[j]*term; } if ( abs( approx - z.acos() ) > eps ) { cout << " z = " << z << endl; cout << " |z| = " << z.abs() << endl; cout << " acos(z) = " << z.acos() << endl; cout << "Approximation: " << approx << endl; cout << " Error: " << abs( approx - z.acos() ) << endl << endl; ++error_count; } if ( abs( z - z.acos().cos() ) > eps ) { cout << " z = " << z << endl; cout << " |z| = " << z.abs() << endl; cout << " acos(z) = " << z.acos() << endl; cout << " cos(acos(z)) = " << z.acos().cos() << endl; cout << " Error: " << abs( z - z.acos().cos() ) << endl << endl; ++error_count; } } } void atan_test( int N, double eps = 1e-13 ) { T z; for ( int i = 0; i < N; ++i ) { z = T::random(); z *= norm/z.abs(); T approx = atanc[0]; T term = 1.0; for ( int j = 1; j < 100; ++j ) { term *= z; approx += atanc[j]*term; } if ( abs( approx - z.atan() ) > eps ) { cout << " z = " << z << endl; cout << " |z| = " << z.abs() << endl; cout << " atan(z) = " << z.atan() << endl; cout << "Approximation: " << approx << endl; cout << " Error: " << abs( approx - z.atan() ) << endl << endl; ++error_count; } if ( abs( z - z.atan().tan() ) > eps ) { cout << " z = " << z << endl; cout << " |z| = " << z.abs() << endl; cout << " atan(z) = " << z.atan() << endl; cout << " tan(atan(z)) = " << z.atan().tan() << endl; cout << " Error: " << abs( z - z.atan().tan() ) << endl << endl; ++error_count; } } } void asec_test( int N, double eps = 1e-13 ) { T z; for ( int i = 0; i < N; ++i ) { z = T::random(); z *= norm/z.abs(); if ( abs( z - z.asec().sec() ) > eps ) { cout << " z = " << z << endl; cout << " |z| = " << z.abs() << endl; cout << " asec(z) = " << z.asec() << endl; cout << " sec(asec(z)) = " << z.asec().sec() << endl; cout << " Error: " << abs( z - z.asec().sec() ) << endl << endl; ++error_count; } } } void acsc_test( int N, double eps = 1e-13 ) { T z; for ( int i = 0; i < N; ++i ) { z = T::random(); z *= norm/z.abs(); if ( abs( z - z.acsc().csc() ) > eps ) { cout << " z = " << z << endl; cout << " |z| = " << z.abs() << endl; cout << " acsc(z) = " << z.acsc() << endl; cout << " csc(acsc(z)) = " << z.acsc().csc() << endl; cout << " Error: " << abs( z - z.acsc().csc() ) << endl << endl; ++error_count; } } } void acot_test( int N, double eps = 1e-13 ) { T z; for ( int i = 0; i < N; ++i ) { z = T::random(); z *= norm/z.abs(); T approx = acotc[0]; T term = 1.0; for ( int j = 1; j < 100; ++j ) { term *= z; approx += acotc[j]*term; } if ( abs( approx - z.acot() ) > eps ) { cout << " z = " << z << endl; cout << " |z| = " << z.abs() << endl; cout << " acot(z) = " << z.acot() << endl; cout << "Approximation: " << approx << endl; cout << " Error: " << abs( approx - z.acot() ) << endl << endl; ++error_count; } if ( abs( z - z.acot().cot() ) > eps ) { cout << " z = " << z << endl; cout << " |z| = " << z.abs() << endl; cout << " acot(z) = " << z.acot() << endl; cout << " cot(acot(z)) = " << z.acot().cot() << endl; cout << " Error: " << abs( z - z.acot().cot() ) << endl << endl; ++error_count; } } } void asinh_test( int N, double eps = 1e-13 ) { T z; for ( int i = 0; i < N; ++i ) { z = T::random(); z *= norm/z.abs(); T approx = asinhc[0]; T term = 1.0; for ( int j = 1; j < 100; ++j ) { term *= z; approx += asinhc[j]*term; } if ( abs( approx - z.asinh() ) > eps ) { cout << " z = " << z << endl; cout << " |z| = " << z.abs() << endl; cout << " asinh(z) = " << z.asinh() << endl; cout << "Approximation: " << approx << endl; cout << " Error: " << abs( approx - z.asinh() ) << endl << endl; ++error_count; } if ( abs( z - z.asinh().sinh() ) > eps ) { cout << " z = " << z << endl; cout << " |z| = " << z.abs() << endl; cout << " asinh(z) = " << z.asinh() << endl; cout << " sinh(asinh(z)) = " << z.asinh().sinh() << endl; cout << " Error: " << abs( z - z.asinh().sinh() ) << endl << endl; ++error_count; } } } void acosh_test( int N, double eps = 1e-13 ) { T z; for ( int i = 0; i < N; ++i ) { z = T::random(); z *= norm/z.abs(); if ( abs( z - z.acosh().cosh() ) > eps ) { cout << " z = " << z << endl; cout << " |z| = " << z.abs() << endl; cout << " acosh(z) = " << z.acosh() << endl; cout << " cosh(acosh(z)) = " << z.acosh().cosh() << endl; cout << " Error: " << abs( z - z.acosh().cosh() ) << endl << endl; ++error_count; } } } void atanh_test( int N, double eps = 1e-13 ) { T z; for ( int i = 0; i < N; ++i ) { z = T::random(); z *= norm/z.abs(); T approx = atanhc[0]; T term = 1.0; for ( int j = 1; j < 100; ++j ) { term *= z; approx += atanhc[j]*term; } if ( abs( approx - z.atanh() ) > eps ) { cout << " z = " << z << endl; cout << " |z| = " << z.abs() << endl; cout << " atanh(z) = " << z.atanh() << endl; cout << "Approximation: " << approx << endl; cout << " Error: " << abs( approx - z.atanh() ) << endl << endl; ++error_count; } if ( abs( z - z.atanh().tanh() ) > eps ) { cout << " z = " << z << endl; cout << " |z| = " << z.abs() << endl; cout << " atanh(z) = " << z.atanh() << endl; cout << " tanh(atanh(z)) = " << z.atanh().tanh() << endl; cout << " Error: " << abs( z - z.atanh().tanh() ) << endl << endl; ++error_count; } } } void asech_test( int N, double eps = 1e-13 ) { T z; for ( int i = 0; i < N; ++i ) { z = T::random(); z *= norm/z.abs(); T approx = asechc[0] - z.log(); T term = 1.0; for ( int j = 1; j < 100; ++j ) { term *= z; approx += asechc[j]*term; } if ( abs( approx - z.asech() ) > eps ) { cout << " z = " << z << endl; cout << " |z| = " << z.abs() << endl; cout << " asech(z) = " << z.asech() << endl; cout << "Approximation: " << approx << endl; cout << " Error: " << abs( approx - z.asech() ) << endl << endl; ++error_count; } if ( abs( z - z.asech().sech() ) > eps ) { cout << " z = " << z << endl; cout << " |z| = " << z.abs() << endl; cout << " asech(z) = " << z.asech() << endl; cout << " sech(asech(z)) = " << z.asech().sech() << endl; cout << " Error: " << abs( z - z.asech().sech() ) << endl << endl; ++error_count; } } } void acsch_test( int N, double eps = 1e-13 ) { T z; for ( int i = 0; i < N; ++i ) { z = T::random(); z *= norm/z.abs(); if ( abs( z - z.acsch().csch() ) > eps ) { cout << " z = " << z << endl; cout << " |z| = " << z.abs() << endl; cout << " acsch(z) = " << z.acsch() << endl; cout << " csch(acsch(z)) = " << z.acsch().csch() << endl; cout << " Error: " << abs( z - z.acsch().csch() ) << endl << endl; ++error_count; } } } void acoth_test( int N, double eps = 1e-13 ) { T z; for ( int i = 0; i < N; ++i ) { z = T::random(); z *= norm/z.abs(); T approx = z.imag() * ( -1.5707963267948966 / z.imag().abs() ); T term = 1.0; for ( int j = 1; j < 100; ++j ) { term *= z; approx += acothc[j]*term; } if ( abs( approx - z.acoth() ) > eps ) { cout << " z = " << z << endl; cout << " |z| = " << z.abs() << endl; cout << " acoth(z) = " << z.acoth() << endl; cout << "Approximation: " << approx << endl; cout << " Error: " << abs( approx - z.acoth() ) << endl << endl; ++error_count; } if ( abs( z - z.acoth().coth() ) > eps ) { cout << " z = " << z << endl; cout << " |z| = " << z.abs() << endl; cout << " acoth(z) = " << z.acoth() << endl; cout << " coth(acoth(z)) = " << z.acoth().coth() << endl; cout << " Error: " << abs( z - z.acoth().coth() ) << endl << endl; ++error_count; } } } void bessel_J2_test( int N, double eps = 1e-13 ) { T z; for ( int i = 0; i < N; ++i ) { z = T::random(); z *= norm/z.abs(); T approx = T::ZERO; T term = 1.0; for ( int j = 1; j < 100; ++j ) { term *= z; approx += bessel_J2c[j]*term; } if ( abs( approx - z.bessel_J( 2 ) ) > eps ) { cout << " z = " << z << endl; cout << " |z| = " << z.abs() << endl; cout << " J_2(z) = " << z.bessel_J( 2 ) << endl; cout << "Approximation: " << approx << endl; cout << " Error: " << abs( approx - z.bessel_J( 2 ) ) << endl << endl; ++error_count; } } } void sqr_test( int N, double eps = 1e-13 ) { T z; for ( int i = 0; i < N; ++i ) { z = T::random(); z *= norm/z.abs(); T z1 = z.sqr(); T z2 = z*z; T z3 = z; z3 *= z; T z4 = z.pow( 2.0 ); if ( abs( z1 - z2 ) > eps ) { cout << " z = " << z << endl; cout << " |z| = " << z.abs() << endl; cout << " sqr(z) = " << z1 << endl; cout << " z*z = " << z2 << endl; cout << " Error: " << abs(z2 - z1) << endl << endl; ++error_count; } if ( abs( z1 - z3 ) > eps ) { cout << " z = " << z << endl; cout << " |z| = " << z.abs() << endl; cout << " sqr(z) = " << z1 << endl; cout << " z *= z -> " << z3 << endl; cout << " Error: " << abs(z3 - z1) << endl << endl; ++error_count; } if ( abs( z1 - z4 ) > eps ) { cout << " z = " << z << endl; cout << " |z| = " << z.abs() << endl; cout << " sqr(z) = " << z1 << endl; cout << " pow(z,2) = " << z4 << endl; cout << " Error: " << abs(z4 - z1) << endl << endl; ++error_count; } } } void conj_test( int N, double eps = 1e-13 ) { T z; for ( int i = 0; i < N; ++i ) { z = T::random(); z *= norm/z.abs(); T z1 = z.conj(); T z2 = z*z1; T z3 = z1*z; if ( abs( z2 - z3 ) > eps ) { cout << " z = " << z << endl; cout << " |z| = " << z.abs() << endl; cout << " conj(z) = " << z1 << endl; cout << " z*conj(z) = " << z2 << endl; cout << " conj(z)*z = " << z3 << endl << endl; ++error_count; } if ( abs_imag( z + z1 ) != 0 ) { cout << " z = " << z << endl; cout << " |z| = " << z.abs() << endl; cout << " z + conj(z) = " << ( z + z1 ) << endl << endl; ++error_count; } if ( z2.abs_imag() > eps ) { cout << " z = " << z << endl; cout << " |z| = " << z.abs() << endl; cout << " z * conj(z) = " << ( z + z1 ) << endl; cout << " |Im(z * conj(z))| = " << abs_imag( z + z1 ) << endl << endl; ++error_count; } if ( std::fabs( z2.real() - z.norm() ) > eps ) { cout << " z = " << z << endl; cout << " |z| = " << z.abs() << endl; cout << " z * conj(z) = " << ( z + z1 ) << endl; cout << " |Im(z * conj(z))| = " << abs_imag( z + z1 ) << endl << endl; ++error_count; } } } void arith_test( int N, double eps = 1e-13 ) { T z1, z2; for ( int i = 0; i < N; ++i ) { z1 = T::random(); z1 *= norm/z1.abs(); z2 = T::random(); z2 *= norm/z2.abs(); T z3 = z1*z1 + z2*z1 + z1*z2 + z2*z2; T z4 = (z1 + z2)*(z1 + z2); T z5 = pow( z1, 2.0 ) + z2*z1 + z1*z2 + pow( z2, 2.0 ); T z6 = T::ZERO; z6 += z1; z6 *= z1; z6 += z1*z2; z6 += z2*z1; z6 += z2*z2; if ( abs( z3 - z4 ) > eps ) { cout << " z1 = " << z1 << endl; cout << " z2 = " << z2 << endl; cout << " z1*z1 + z2*z1 + z1*z2 + z2*z2 = " << z3 << endl; cout << " (z1 + z2)*(z1 + z2) = " << z4 << endl << endl; cout << " Error: " << abs( z3 - z4 ) << endl << endl; ++error_count; } if ( abs( z3 - z5 ) > eps ) { cout << " z1 = " << z1 << endl; cout << " z2 = " << z2 << endl; cout << " z1*z1 + z2*z1 + z1*z2 + z2*z2 = " << z3 << endl; cout << "pow(z1,2) + z2*z1 + z1*z2 + pow(z2,2) = " << z5 << endl << endl; cout << " Error: " << abs( z3 - z5 ) << endl << endl; ++error_count; } if ( abs( z3 - z6 ) > eps ) { cout << " z1 = " << z1 << endl; cout << " z2 = " << z2 << endl; cout << " z1*z1 + z2*z1 + z1*z2 + z2*z2 = " << z3 << endl; cout << " using +=, *=, +=, etc. = " << z6 << endl << endl; cout << " Error: " << abs( z3 - z6 ) << endl << endl; ++error_count; } z3 = z1*z1 - z2*z1 - z1*z2 + z2*z2; z4 = (z1 - z2)*(z1 - z2); z5 = pow( z1, 2.0 ) - z2*z1 - z1*z2 + pow( z2, 2.0 ); z6 = T::ZERO; z6 += z1; z6 *= z1; z6 -= z1*z2; z6 -= z2*z1; z6 += z2*z2; if ( abs( z3 - z4 ) > eps ) { cout << " z1 = " << z1 << endl; cout << " z2 = " << z2 << endl; cout << " z1*z1 - z2*z1 - z1*z2 + z2*z2 = " << z3 << endl; cout << " (z1 - z2)*(z1 - z2) = " << z4 << endl << endl; cout << " Error: " << abs( z3 - z4 ) << endl << endl; ++error_count; } if ( abs( z3 - z5 ) > eps ) { cout << " z1 = " << z1 << endl; cout << " z2 = " << z2 << endl; cout << " z1*z1 - z2*z1 - z1*z2 + z2*z2 = " << z3 << endl; cout << "pow(z1,2) - z2*z1 - z1*z2 + pow(z2,2) = " << z5 << endl << endl; cout << " Error: " << abs( z3 - z5 ) << endl << endl; ++error_count; } if ( abs( z3 - z6 ) > eps ) { cout << " z1 = " << z1 << endl; cout << " z2 = " << z2 << endl; cout << " z1*z1 - z2*z1 - z1*z2 + z2*z2 = " << z3 << endl; cout << " using +=, *=, -=, etc. = " << z6 << endl << endl; cout << " Error: " << abs( z3 - z6 ) << endl << endl; ++error_count; } } } void bool_test( int N ) { T z1, z2; for ( int i = 0; i < N; ++i ) { z1 = T::random(); z2 = T::random(); bool b1, b2, b3, b4; if ( z1 != z1 ) { cout << " z1 = " << z1 << endl; cout << " z1 != z1 = " << (z1 != z1 ? "true" : "false") << endl; ++error_count; } if ( !(z1 == z1) ) { cout << " z1 = " << z1 << endl; cout << " z1 == z1 = " << (z1 == z1 ? "true" : "false") << endl; ++error_count; } if ( !(z1 != z2) ) { cout << " z1 = " << z1 << endl; cout << " z2 = " << z2 << endl; cout << " z1 != z2 = " << (z1 != z2 ? "true" : "false") << endl; ++error_count; } if ( z1 == z2 ) { cout << " z1 = " << z1 << endl; cout << " z2 = " << z2 << endl; cout << " z1 == z2 = " << (z1 == z2 ? "true" : "false") << endl; ++error_count; } } } void assign_test( int N, double eps = 1e-15 ) { T z1, z2, z3, z4; for ( int i = 0; i < N; ++i ) { z1 = T::random(); z2 = T::random(); z3 = z1; z3 += z2; z4 = z1 + z2; if ( abs( z3 - z4 ) > eps ) { cout << " z1 = " << z1 << endl; cout << " z2 = " << z2 << endl; cout << " z3 = z1; z3 += z2 = " << z3 << endl; cout << " z1 + z2 = " << z4 << endl; cout << " Error: " << abs( z3 - z4 ) << endl << endl; ++error_count; } z3 = z1; z3 -= z2; z4 = z1 - z2; if ( abs( z3 - z4 ) > eps ) { cout << " z1 = " << z1 << endl; cout << " z2 = " << z2 << endl; cout << " z3 = z1; z3 -= z2 = " << z3 << endl; cout << " z1 - z2 = " << z4 << endl; cout << " Error: " << abs( z3 - z4 ) << endl << endl; ++error_count; } z3 = z1; z3 *= z2; z4 = z1 * z2; if ( abs( z3 - z4 ) > eps ) { cout << " z1 = " << z1 << endl; cout << " z2 = " << z2 << endl; cout << " z3 = z1; z3 *= z2 = " << z3 << endl; cout << " z1 * z2 = " << z4 << endl; cout << " Error: " << abs( z3 - z4 ) << endl << endl; ++error_count; } z3 = z1; z3 /= z2; z4 = z1 / z2; if ( abs( z3 - z4 ) > eps ) { cout << " z1 = " << z1 << endl; cout << " z2 = " << z2 << endl; cout << " z3 = z1; z3 /= z2 = " << z3 << endl; cout << " z1 / z2 = " << z4 << endl; cout << " Error: " << abs( z3 - z4 ) << endl << endl; ++error_count; } } } void inverse_arith_test( int N, double eps = 1e-15 ) { T z1, z2, z3; for ( int i = 0; i < N; ++i ) { z1 = T::random(); z2 = T::random(); z3 = z1 + z2; z3 = z3 - z2; if ( abs( z3 - z1 ) > eps ) { cout << " z1 = " << z1 << endl; cout << " z2 = " << z2 << endl; cout << " z3 = z1 + z2; z3 = z3 - z2 = " << z3 << endl; cout << " Error: " << abs( z3 - z1 ) << endl << endl; ++error_count; } z3 = z1 + z2; z3 = (-z2) + z3; if ( abs( z3 - z1 ) > eps ) { cout << " z1 = " << z1 << endl; cout << " z2 = " << z2 << endl; cout << " z3 = z1 + z2; z3 = (-z2) + z3 = " << z3 << endl; cout << " Error: " << abs( z3 - z1 ) << endl << endl; ++error_count; } z3 = z1; z3 += z2; z3 -= z2; if ( abs( z3 - z1 ) > eps ) { cout << " z1 = " << z1 << endl; cout << " z2 = " << z2 << endl; cout << " z3 = z1; z3 +=2; z3 -= z2 = " << z3 << endl; cout << " Error: " << abs( z3 - z1 ) << endl << endl; ++error_count; } z3 = z1 * z2; z3 = z3 / z2; if ( abs( z3 - z1 ) > eps ) { cout << " z1 = " << z1 << endl; cout << " z2 = " << z2 << endl; cout << " z3 = z1 * z2; z3 = z3 / z2 = " << z3 << endl; cout << " Error: " << abs( z3 - z1 ) << endl << endl; ++error_count; } z3 = z1; z3 *= z2; z3 /= z2; if ( abs( z3 - z1 ) > eps ) { cout << " z1 = " << z1 << endl; cout << " z2 = " << z2 << endl; cout << " z3 = z1; z3 *= z2; z3 /= z2 = " << z3 << endl; cout << " Error: " << abs( z3 - z1 ) << endl << endl; ++error_count; } } } void inverse_test( int N, double eps = 1e-15 ) { T z1, z2, z3; for ( int i = 0; i < N; ++i ) { z1 = T::random(); z2 = z1.conj() / z1.norm(); z3 = z1.inverse(); if ( abs( z3 - z2 ) > eps ) { cout << " z1 = " << z1 << endl; cout << " conj(z1)/norm(z1) = " << z2 << endl; cout << " inverse(z1) = " << z3 << endl; cout << " Error: " << abs( z3 - z2 ) << endl << endl; ++error_count; } z3 = 1.0/z1; if ( abs( z3 - z2 ) > eps ) { cout << " z1 = " << z1 << endl; cout << " conj(z1)/norm(z1) = " << z2 << endl; cout << " 1.0 / z1 = " << z3 << endl; cout << " Error: " << abs( z3 - z2 ) << endl << endl; ++error_count; } z3 = z1.pow( -1.0 ); if ( abs( z3 - z2 ) > eps ) { cout << " z1 = " << z1 << endl; cout << " conj(z1)/norm(z1) = " << z2 << endl; cout << " pow(z1 -1) = " << z3 << endl; cout << " Error: " << abs( z3 - z2 ) << endl << endl; ++error_count; } } } void horner_test( int N, double eps = 1e-14 ) { T z1, z2, z3; double * v = new double[10]; double * c = new double[10]; // try it with 10 different polynomials for ( int i = 0; i < 10; ++i ) { for ( int j = 0; j < 10; ++j ) { v[j] = 2.0*static_cast( rand() )/RAND_MAX - 1.0; c[j] = 2.0*static_cast( rand() )/RAND_MAX - 1.0; } for ( int k = 0; k < N; ++k ) { z1 = T::random(); z1 *= 0.5/z1.abs(); z2 = z1.horner( v, 10 ); z3 = v[0]*z1.pow( 9 ) + v[1]*z1.pow( 8 ) + v[2]*z1.pow( 7 ) + v[3]*z1.pow( 6 ) + v[4]*z1.pow( 5 ) + v[5]*z1.pow( 4 ) + v[6]*z1.pow( 3 ) + v[7]*z1.pow( 2 ) + v[8]*z1 + v[9]; if ( abs( z3 - z2 ) > eps ) { cout << " z1 = " << z1 << endl; for ( int j = 0; j < 9; ++j ) { cout << v[j] << "*z^" << (9 - j) << " + "; } cout << " " << v[9] << endl; cout << " Horner: " << z2 << endl; cout << " Polynomial: " << z3 << endl; cout << " Error: " << abs( z3 - z2 ) << endl << endl; ++error_count; } z2 = z1.horner( v, c, 10 ); z3 = v[0]*(z1-c[1])*(z1-c[2])*(z1-c[3])*(z1-c[4])*(z1-c[5])*(z1-c[6])*(z1-c[7])*(z1-c[8])*(z1-c[9]) + v[1]*(z1-c[2])*(z1-c[3])*(z1-c[4])*(z1-c[5])*(z1-c[6])*(z1-c[7])*(z1-c[8])*(z1-c[9]) + v[2]*(z1-c[3])*(z1-c[4])*(z1-c[5])*(z1-c[6])*(z1-c[7])*(z1-c[8])*(z1-c[9]) + v[3]*(z1-c[4])*(z1-c[5])*(z1-c[6])*(z1-c[7])*(z1-c[8])*(z1-c[9]) + v[4]*(z1-c[5])*(z1-c[6])*(z1-c[7])*(z1-c[8])*(z1-c[9]) + v[5]*(z1-c[6])*(z1-c[7])*(z1-c[8])*(z1-c[9]) + v[6]*(z1-c[7])*(z1-c[8])*(z1-c[9]) + v[7]*(z1-c[8])*(z1-c[9]) + v[8]*(z1-c[9]) + v[9]; if ( abs( z3 - z2 ) > eps ) { cout << " z1 = " << z1 << endl; cout << "v = [" << endl; for ( int j = 0; j < 9; ++j ) { cout << v[j] << ", "; } cout << v[9] << "]" << endl; cout << "c = [" << endl; for ( int j = 0; j < 9; ++j ) { cout << c[j] << ", "; } cout << c[9] << "]" << endl; cout << " Horner: " << z2 << endl; cout << " Polynomial: " << z3 << endl; cout << " Error: " << abs( z3 - z2 ) << endl << endl; ++error_count; } } } delete [] v; delete [] c; } void rotation_test( int N, double eps = 1e-14 ) { T z1, z2, z3, z4; for ( int i = 0; i < N; ++i ) { T z1 = T::random(); T z2 = T::random_imag(); z3 = z1.rotate( z2 )/z2.norm(); z4 = (z2*z1*z2.conj())/z2.norm(); if ( abs( z3 - z4 ) > eps ) { cout << " z1 = " << z1 << endl; cout << " z2 = " << z2 << endl; cout << " z1.rotate(z2) = " << z3 << endl; cout << " z2*z1*conj(z2) = " << z4 << endl; cout << " Error: " << abs( z3 - z4 ) << endl << endl; ++error_count; } } for ( int i = 0; i < N; ++i ) { T z1 = T::random(); T z2 = T::random(); z3 = z1.rotate( z2 )/z2.norm(); z4 = (z2*z1*z2.conj())/z2.norm(); if ( abs( z3 - z4 ) > eps ) { cout << " z1 = " << z1 << endl; cout << " z2 = " << z2 << endl; cout << " z1.rotate(z2) = " << z3 << endl; cout << " z2*z1*conj(z2) = " << z4 << endl; cout << " Error: " << abs( z3 - z4 ) << endl << endl; ++error_count; } } } }; /********************************************** * ****************************************** * * * * * * * The Actual Tests * * * * * * * * - Complex * * * * - Quaternion * * * * - Octonion * * * * - Sedenion * * * * - Trigintaduonion * * * * * * * ****************************************** * **********************************************/ int main() { int N = 1000; cout << "************************************************************" << endl; cout << "* COMPLEX *" << endl; cout << "************************************************************" << endl; Tester< Complex > ctest; #ifdef TRANSCENDENTAL cout << "******************************* EXP *******************************" << endl; ctest.exp_test( N ); cout << "******************************* SIN *******************************" << endl; ctest.sin_test( N ); cout << "******************************* COS *******************************" << endl; ctest.cos_test( N ); cout << "******************************* TAN *******************************" << endl; ctest.tan_test( N ); cout << "******************************* SEC *******************************" << endl; ctest.sec_test( N ); cout << "******************************* CSC *******************************" << endl; ctest.csc_test( N ); cout << "******************************* COT *******************************" << endl; ctest.cot_test( N ); cout << "******************************* SINH ******************************" << endl; ctest.sinh_test( N ); cout << "******************************* COSH ******************************" << endl; ctest.cosh_test( N ); cout << "******************************* TANH ******************************" << endl; ctest.tanh_test( N ); cout << "******************************* SECH ******************************" << endl; ctest.sech_test( N ); cout << "******************************* CSCH ******************************" << endl; ctest.csch_test( N ); cout << "******************************* COTH ******************************" << endl; ctest.coth_test( N ); cout << "******************************* LOG *******************************" << endl; ctest.log_test( N ); cout << "******************************* ASIN ******************************" << endl; ctest.asin_test( N ); cout << "******************************* ACOS ******************************" << endl; ctest.acos_test( N ); cout << "******************************* ATAN ******************************" << endl; ctest.atan_test( N ); cout << "******************************* ASEC ******************************" << endl; ctest.asec_test( N ); cout << "******************************* ACSC ******************************" << endl; ctest.acsc_test( N ); cout << "******************************* ACOT ******************************" << endl; ctest.acot_test( N ); cout << "****************************** ASINH ******************************" << endl; ctest.asinh_test( N ); cout << "****************************** ACOSH ******************************" << endl; ctest.acosh_test( N ); cout << "****************************** ATANH ******************************" << endl; ctest.atanh_test( N ); cout << "****************************** ASECH ******************************" << endl; ctest.asech_test( N ); cout << "****************************** ACSCH ******************************" << endl; ctest.acsch_test( N ); cout << "****************************** ACOTH ******************************" << endl; ctest.acoth_test( N ); cout << "***************************** BESSEL J ****************************" << endl; ctest.bessel_J2_test( N ); #endif cout << "******************************* Z*Z *******************************" << endl; ctest.sqr_test( N, 2.3e-16 ); cout << "******************************* CONJ ******************************" << endl; ctest.conj_test( N, 2.3e-16 ); cout << "**************************** ARITHMETIC ***************************" << endl; ctest.arith_test( N, 3.7e-16 ); cout << "*************************** BOOLEAN LOGIC *************************" << endl; ctest.bool_test( N ); cout << "***************************** ASSIGNMENT **************************" << endl; ctest.assign_test( N ); cout << "****************************** INVERSE ****************************" << endl; ctest.inverse_arith_test( N ); ctest.inverse_test( N ); cout << "****************************** HORNER *****************************" << endl; ctest.horner_test( N ); cout << "Total error count: " << ctest.count() << endl; cout << "************************************************************" << endl; cout << "* QUATERNIONS *" << endl; cout << "************************************************************" << endl; Tester< Quaternion > qtest; #ifdef TRANSCENDENTAL cout << "******************************* EXP *******************************" << endl; qtest.exp_test( N ); cout << "******************************* SIN *******************************" << endl; qtest.sin_test( N ); cout << "******************************* COS *******************************" << endl; qtest.cos_test( N ); cout << "******************************* TAN *******************************" << endl; qtest.tan_test( N ); cout << "******************************* SEC *******************************" << endl; qtest.sec_test( N ); cout << "******************************* CSC *******************************" << endl; qtest.csc_test( N ); cout << "******************************* COT *******************************" << endl; qtest.cot_test( N ); cout << "******************************* SINH ******************************" << endl; qtest.sinh_test( N ); cout << "******************************* COSH ******************************" << endl; qtest.cosh_test( N ); cout << "******************************* TANH ******************************" << endl; qtest.tanh_test( N ); cout << "******************************* SECH ******************************" << endl; qtest.sech_test( N ); cout << "******************************* CSCH ******************************" << endl; qtest.csch_test( N ); cout << "******************************* COTH ******************************" << endl; qtest.coth_test( N ); cout << "******************************* LOG *******************************" << endl; qtest.log_test( N ); cout << "******************************* ASIN ******************************" << endl; qtest.asin_test( N ); cout << "******************************* ACOS ******************************" << endl; qtest.acos_test( N ); cout << "******************************* ATAN ******************************" << endl; qtest.atan_test( N ); cout << "******************************* ASEC ******************************" << endl; qtest.asec_test( N ); cout << "******************************* ACSC ******************************" << endl; qtest.acsc_test( N ); cout << "******************************* ACOT ******************************" << endl; qtest.acot_test( N ); cout << "****************************** ASINH ******************************" << endl; qtest.asinh_test( N ); cout << "****************************** ACOSH ******************************" << endl; qtest.acosh_test( N ); cout << "****************************** ATANH ******************************" << endl; qtest.atanh_test( N ); cout << "****************************** ASECH ******************************" << endl; qtest.asech_test( N ); cout << "****************************** ACSCH ******************************" << endl; qtest.acsch_test( N ); cout << "****************************** ACOTH ******************************" << endl; qtest.acoth_test( N ); cout << "***************************** BESSEL J ****************************" << endl; qtest.bessel_J2_test( N ); #endif cout << "******************************* Z*Z *******************************" << endl; qtest.sqr_test( N, 2.3e-16 ); cout << "******************************* CONJ ******************************" << endl; qtest.conj_test( N, 2.3e-16 ); cout << "**************************** ARITHMETIC ***************************" << endl; qtest.arith_test( N, 3.7e-16 ); cout << "*************************** BOOLEAN LOGIC *************************" << endl; qtest.bool_test( N ); cout << "***************************** ASSIGNMENT **************************" << endl; qtest.assign_test( N ); cout << "****************************** INVERSE ****************************" << endl; qtest.inverse_arith_test( N ); qtest.inverse_test( N ); cout << "****************************** HORNER *****************************" << endl; qtest.horner_test( N ); cout << "***************************** ROTATION ****************************" << endl; qtest.rotation_test( N ); cout << "Total error count: " << qtest.count() << endl; cout << "************************************************************" << endl; cout << "* OCTONIONS *" << endl; cout << "************************************************************" << endl; Tester< Octonion > otest; #ifdef TRANSCENDENTAL cout << "******************************* EXP *******************************" << endl; otest.exp_test( N ); cout << "******************************* SIN *******************************" << endl; otest.sin_test( N ); cout << "******************************* COS *******************************" << endl; otest.cos_test( N ); cout << "******************************* TAN *******************************" << endl; otest.tan_test( N ); cout << "******************************* SEC *******************************" << endl; otest.sec_test( N ); cout << "******************************* CSC *******************************" << endl; otest.csc_test( N ); cout << "******************************* COT *******************************" << endl; otest.cot_test( N ); cout << "******************************* SINH ******************************" << endl; otest.sinh_test( N ); cout << "******************************* COSH ******************************" << endl; otest.cosh_test( N ); cout << "******************************* TANH ******************************" << endl; otest.tanh_test( N ); cout << "******************************* SECH ******************************" << endl; otest.sech_test( N ); cout << "******************************* CSCH ******************************" << endl; otest.csch_test( N ); cout << "******************************* COTH ******************************" << endl; otest.coth_test( N ); cout << "******************************* LOG *******************************" << endl; otest.log_test( N ); cout << "******************************* ASIN ******************************" << endl; otest.asin_test( N ); cout << "******************************* ACOS ******************************" << endl; otest.acos_test( N ); cout << "******************************* ATAN ******************************" << endl; otest.atan_test( N ); cout << "******************************* ASEC ******************************" << endl; otest.asec_test( N ); cout << "******************************* ACSC ******************************" << endl; otest.acsc_test( N ); cout << "******************************* ACOT ******************************" << endl; otest.acot_test( N ); cout << "****************************** ASINH ******************************" << endl; otest.asinh_test( N ); cout << "****************************** ACOSH ******************************" << endl; otest.acosh_test( N ); cout << "****************************** ATANH ******************************" << endl; otest.atanh_test( N ); cout << "****************************** ASECH ******************************" << endl; otest.asech_test( N ); cout << "****************************** ACSCH ******************************" << endl; otest.acsch_test( N ); cout << "****************************** ACOTH ******************************" << endl; otest.acoth_test( N ); cout << "***************************** BESSEL J ****************************" << endl; otest.bessel_J2_test( N ); #endif cout << "******************************* Z*Z *******************************" << endl; otest.sqr_test( N, 2.3e-16 ); cout << "******************************* CONJ ******************************" << endl; otest.conj_test( N, 2.3e-16 ); cout << "**************************** ARITHMETIC ***************************" << endl; otest.arith_test( N, 3.7e-16 ); cout << "*************************** BOOLEAN LOGIC *************************" << endl; otest.bool_test( N ); cout << "***************************** ASSIGNMENT **************************" << endl; otest.assign_test( N ); cout << "****************************** INVERSE ****************************" << endl; otest.inverse_arith_test( N ); otest.inverse_test( N ); cout << "****************************** HORNER *****************************" << endl; otest.horner_test( N ); cout << "***************************** ROTATION ****************************" << endl; otest.rotation_test( N ); cout << "Total error count: " << otest.count() << endl; cout << "************************************************************" << endl; cout << "* SEDENIONS *" << endl; cout << "************************************************************" << endl; Tester< Sedenion > stest; #ifdef TRANSCENDENTAL cout << "******************************* EXP *******************************" << endl; stest.exp_test( N ); cout << "******************************* SIN *******************************" << endl; stest.sin_test( N ); cout << "******************************* COS *******************************" << endl; stest.cos_test( N ); cout << "******************************* TAN *******************************" << endl; stest.tan_test( N ); cout << "******************************* SEC *******************************" << endl; stest.sec_test( N ); cout << "******************************* CSC *******************************" << endl; stest.csc_test( N ); cout << "******************************* COT *******************************" << endl; stest.cot_test( N ); cout << "******************************* SINH ******************************" << endl; stest.sinh_test( N ); cout << "******************************* COSH ******************************" << endl; stest.cosh_test( N ); cout << "******************************* TANH ******************************" << endl; stest.tanh_test( N ); cout << "******************************* SECH ******************************" << endl; stest.sech_test( N ); cout << "******************************* CSCH ******************************" << endl; stest.csch_test( N ); cout << "******************************* COTH ******************************" << endl; stest.coth_test( N ); cout << "******************************* LOG *******************************" << endl; stest.log_test( N ); cout << "******************************* ASIN ******************************" << endl; stest.asin_test( N ); cout << "******************************* ACOS ******************************" << endl; stest.acos_test( N ); cout << "******************************* ATAN ******************************" << endl; stest.atan_test( N ); cout << "******************************* ASEC ******************************" << endl; stest.asec_test( N ); cout << "******************************* ACSC ******************************" << endl; stest.acsc_test( N ); cout << "******************************* ACOT ******************************" << endl; stest.acot_test( N ); cout << "****************************** ASINH ******************************" << endl; stest.asinh_test( N ); cout << "****************************** ACOSH ******************************" << endl; stest.acosh_test( N ); cout << "****************************** ATANH ******************************" << endl; stest.atanh_test( N ); cout << "****************************** ASECH ******************************" << endl; stest.asech_test( N ); cout << "****************************** ACSCH ******************************" << endl; stest.acsch_test( N ); cout << "****************************** ACOTH ******************************" << endl; stest.acoth_test( N ); cout << "***************************** BESSEL J ****************************" << endl; stest.bessel_J2_test( N ); #endif cout << "******************************* Z*Z *******************************" << endl; stest.sqr_test( N, 2.3e-16 ); cout << "******************************* CONJ ******************************" << endl; stest.conj_test( N, 2.3e-16 ); cout << "**************************** ARITHMETIC ***************************" << endl; stest.arith_test( N, 3.7e-16 ); cout << "*************************** BOOLEAN LOGIC *************************" << endl; stest.bool_test( N ); cout << "***************************** ASSIGNMENT **************************" << endl; stest.assign_test( N ); cout << "****************************** INVERSE ****************************" << endl; // stest.inverse_arith_test( N ); stest.inverse_test( N ); cout << "****************************** HORNER *****************************" << endl; stest.horner_test( N ); cout << "***************************** ROTATION ****************************" << endl; stest.rotation_test( N ); cout << "Total error count: " << stest.count() << endl; cout << "************************************************************" << endl; cout << "* TRIGINTADUONION *" << endl; cout << "************************************************************" << endl; Tester< Trigintaduonion > ttest; #ifdef TRANSCENDENTAL cout << "******************************* EXP *******************************" << endl; ttest.exp_test( N ); cout << "******************************* SIN *******************************" << endl; ttest.sin_test( N ); cout << "******************************* COS *******************************" << endl; ttest.cos_test( N ); cout << "******************************* TAN *******************************" << endl; ttest.tan_test( N ); cout << "******************************* SEC *******************************" << endl; ttest.sec_test( N ); cout << "******************************* CSC *******************************" << endl; ttest.csc_test( N ); cout << "******************************* COT *******************************" << endl; ttest.cot_test( N ); cout << "******************************* SINH ******************************" << endl; ttest.sinh_test( N ); cout << "******************************* COSH ******************************" << endl; ttest.cosh_test( N ); cout << "******************************* TANH ******************************" << endl; ttest.tanh_test( N ); cout << "******************************* SECH ******************************" << endl; ttest.sech_test( N ); cout << "******************************* CSCH ******************************" << endl; ttest.csch_test( N ); cout << "******************************* COTH ******************************" << endl; ttest.coth_test( N ); cout << "******************************* LOG *******************************" << endl; ttest.log_test( N ); cout << "******************************* ASIN ******************************" << endl; ttest.asin_test( N ); cout << "******************************* ACOS ******************************" << endl; ttest.acos_test( N ); cout << "******************************* ATAN ******************************" << endl; ttest.atan_test( N ); cout << "******************************* ASEC ******************************" << endl; ttest.asec_test( N ); cout << "******************************* ACSC ******************************" << endl; ttest.acsc_test( N ); cout << "******************************* ACOT ******************************" << endl; ttest.acot_test( N ); cout << "****************************** ASINH ******************************" << endl; ttest.asinh_test( N ); cout << "****************************** ACOSH ******************************" << endl; ttest.acosh_test( N ); cout << "****************************** ATANH ******************************" << endl; ttest.atanh_test( N ); cout << "****************************** ASECH ******************************" << endl; ttest.asech_test( N ); cout << "****************************** ACSCH ******************************" << endl; ttest.acsch_test( N ); cout << "****************************** ACOTH ******************************" << endl; ttest.acoth_test( N ); cout << "***************************** BESSEL J ****************************" << endl; ttest.bessel_J2_test( N ); #endif cout << "******************************* Z*Z *******************************" << endl; ttest.sqr_test( N, 2.3e-16 ); cout << "******************************* CONJ ******************************" << endl; ttest.conj_test( N, 2.3e-16 ); cout << "**************************** ARITHMETIC ***************************" << endl; ttest.arith_test( N, 1e-15 ); cout << "*************************** BOOLEAN LOGIC *************************" << endl; ttest.bool_test( N ); cout << "***************************** ASSIGNMENT **************************" << endl; ttest.assign_test( N ); cout << "****************************** INVERSE ****************************" << endl; // ttest.inverse_arith_test( N ); ttest.inverse_test( N ); cout << "****************************** HORNER *****************************" << endl; ttest.horner_test( N ); cout << "***************************** ROTATION ****************************" << endl; ttest.rotation_test( N ); cout << "Total error count: " << ttest.count() << endl; }