def aptst_out(x,maplefunc,apfunc) puts "x = c(#{x})" puts "$pgm.puts \"fprintf(out_fd,\\\"x = #{x}\\\\n\\\");\"" puts '$pgm.puts "total_tests := total_tests + 1;"' puts "fxr = x.#{apfunc}" puts "$pgm.puts \"fxm := #{maplefunc}(#{x});\"" puts "$pgm.puts \"fxr2 := \#{fxr.to_s_main};\"" puts "$pgm.puts \"fxrerr := \#{fxr.to_s_err};\"" puts "$pgm.puts \"fxr := fxr2;\"" puts "$pgm.puts \"abs_err := abs(fxm - fxr);\"" puts "$pgm.puts \"if fxm <> 0.0 then \"" puts "$pgm.puts \"percent_error := abs_err * 100.0 / fxm; else percent_error := 0.0;\"" puts "$pgm.puts \"end;\"" puts "$pgm.puts \"if (percent_error > 1.0e-10) then\"" puts "$pgm.puts \"fprintf(except_fd,\\\"PERCENT ERROR > 1.0e-10\\\\n\\\");\"" puts "$pgm.puts \"dump_except(#{maplefunc},#{apfunc},#{x},fxm,fxr2,fxrerr,percent_error,abs_err,except_fd);\"" puts "$pgm.puts \"end;\"" puts "$pgm.puts \"if (abs_err > fxrerr) then\"" puts "$pgm.puts \"fprintf(except_fd,\\\"ABS ERROR > ESTIMATE\\\\n\\\");\"" puts "$pgm.puts \"dump_except(#{maplefunc},#{apfunc},#{x},fxm,fxr2,fxrerr,percent_error,abs_err,except_fd);\"" puts "$pgm.puts \"end;\"" puts "$pgm.puts \"fprintf(out_fd,\\\"fxr = %18.12e\\\\n\\\",fxr);\"" puts "$pgm.puts \"fprintf(out_fd,\\\"fxm = %18.12e\\\\n\\\",fxm);\"" puts "$pgm.puts \"fprintf(out_fd,\\\"fxrerr = %18.12e\\\\n\\\",fxrerr);\"" end def testfunc(maplefunc,apfunc,startx,endx,incr) x = startx.to_f xf = endx.to_f xinc = incr.to_f cnt = 0 puts "puts \"maplefunc = #{maplefunc} apfunc = #{apfunc}\"" puts "$pgm.puts \"fprintf(out_fd,\\\"maplefunc = #{maplefunc} apfunc = #{apfunc}\\\\n\\\");\"" puts "$pgm.puts \"fprintf(except_fd,\\\"maplefunc = #{maplefunc} apfunc = #{apfunc}\\\\n\\\");\"" while (x < xf && cnt < 100) aptst_out(x.to_s,maplefunc,apfunc) x += xinc cnt += 1 end end def main puts "puts \"APFP Regression Test\"" puts 'require "rapfp/ApConfig"' puts 'require "rapfp/Ap"' puts 'require "time"' puts 'rconst = $ApConst.new' puts 'rconst.one.setrconst(rconst)' puts 'rconst.init2' puts 'rconst.one.setrconst(rconst)' puts '$RConst = rconst' puts 'cconst = ApcConst.new(rconst)' puts 'cconst.one.setcconst(cconst)' puts 'cconst.one.setrconst(rconst)' puts '$CConst = cconst' puts '$pgm = File.new("testpgm.mxt","w")' puts '$pgm.puts "global total_tests, total_exceptions;"' puts "$pgm.puts \"mstart := trunc(time()*1000.0);\"" puts "$pgm.puts \"rstart := \#{Time.now.to_i}*1000;\"" puts "t = Process.times" puts "$pgm.puts \"rcpuustart := \#{t.utime}*1000;\"" puts "$pgm.puts \"rcpusstart := \#{t.stime}*1000;\"" puts '$pgm.puts "total_tests := 0;"' puts '$pgm.puts "total_exceptions := 0;"' puts '$pgm.puts "hours_elapsed := proc(msec)"' puts '$pgm.puts "local hrs;"' puts '$pgm.puts "hrs := trunc(evalf(msec/3600000));"' puts '$pgm.puts "hrs ;"' puts '$pgm.puts "end;"' puts '$pgm.puts "min_elapsed := proc(hrs,msec)"' puts '$pgm.puts "local min2;"' puts '$pgm.puts "min2 := trunc(evalf((msec-hrs*3600000)/60000));"' puts '$pgm.puts "min2;"' puts '$pgm.puts "end;"' puts '$pgm.puts "sec_elapsed := proc(hrs,min2,msec)"' puts '$pgm.puts "local sec2;"' puts '$pgm.puts "sec2 := trunc(evalf((msec - hrs*360000 - min2 * 60000)/1000)) ;"' puts '$pgm.puts "sec2 ;"' puts '$pgm.puts "end;"' puts '$pgm.puts "msec_elapsed := proc(hrs,min2,sec2,msec)"' puts '$pgm.puts "local msec2;"' puts '$pgm.puts "msec2 := msec - hrs*3600000 - min2 * 60000 - sec2 * 1000;"' puts '$pgm.puts "msec2 ;"' puts '$pgm.puts "end;"' puts "$pgm.puts \"dump_except := proc(maplefunc,apfunc,x,fxm,fxr,fxrerr,percent_error,abs_error,except_fd)\"" puts '$pgm.puts "global total_tests, total_exceptions;"' puts '$pgm.puts "total_exceptions := total_exceptions + 1;"' puts "$pgm.puts \"fprintf(except_fd,\\\"EXCEPTION: Maple func = %s APFP func = %s\\\\n\\\",maplefunc,apfunc);\"" puts "$pgm.puts \"fprintf(except_fd,\\\"x = %18.12e\\\\n\\\",x);\"" puts "$pgm.puts \"fprintf(except_fd,\\\"Ruby APFP = %18.12e\\\\n\\\",fxr);\"" puts "$pgm.puts \"fprintf(except_fd,\\\"Maple = %18.12e\\\\n\\\",fxm);\"" puts "$pgm.puts \"fprintf(except_fd,\\\"Ruby est fxrerr= %18.12e\\\\n\\\",fxrerr);\"" puts "$pgm.puts \"fprintf(except_fd,\\\"Abs Error = %18.12e\\\\n\\\",abs_error);\"" puts "$pgm.puts \"fprintf(except_fd,\\\"Percent Error = %18.12e\\\\n\\\",percent_error);\"" puts '$pgm.puts "end;"' puts '$pgm.puts "out_fd := fopen(`c:\\\\\\\\cygwin\\\\\\\\home\\\\\\\\dennis\\\\\\\\src\\\\\\\\mine\\\\\\\\aptst\\\\\\\\aptst.txt`,WRITE,TEXT);"' puts '$pgm.puts "except_fd := fopen(`c:\\\\\\\\cygwin\\\\\\\\home\\\\\\\\dennis\\\\\\\\src\\\\\\\\mine\\\\\\\\aptst\\\\\\\\apexcept.txt`,WRITE,TEXT);"' puts '$pgm.puts "Digits := 16;"' testfunc("sin","sin","-6.0","6.5","0.1") testfunc("cos","cos","-6.0","6.5","0.1") testfunc("tan","tan","-1.5","1.5","0.1") testfunc("exp","exp","-1.5","1.5","0.1") testfunc("exp","exp","-100.5","100.5","10.1") testfunc("arcsin","asin","-1.0","1.0","0.1") testfunc("arccos","acos","-1.0","1.0","0.1") testfunc("arctan","atan","-10.5","10.5","0.1") testfunc("ln","log","0.01","10.5","0.1") testfunc("ln","log","0.1","100.5","1.1") testfunc("log10","log10","0.01","10.5","0.1") testfunc("log10","log10","0.1","100.5","1.1") testfunc("sinh","sinh","-1.5","1.5","0.1") testfunc("cosh","cosh","-1.5","1.5","0.1") testfunc("tanh","tanh","-1.5","1.5","0.1") testfunc("sqrt","sqrt","0.0","1.5","0.1") testfunc("abs","abs","-1.5","1.5","0.1") testfunc("trunc","trunc","-19.5","19.5","0.12") testfunc("frac","frac","-19.5","19.5","0.11") testfunc("erf","erf","-1.5","1.5","0.1") puts "$pgm.puts \"fprintf(out_fd,\\\"total_tests = %d\\\\n\\\",total_tests);\"" puts "$pgm.puts \"fprintf(out_fd,\\\"total_exceptions = %d\\\\n\\\",total_exceptions);\"" puts "$pgm.puts \"fprintf(except_fd,\\\"total_tests = %d\\\\n\\\",total_tests);\"" puts "$pgm.puts \"fprintf(except_fd,\\\"total_exceptions = %d\\\\n\\\",total_exceptions);\"" puts '$pgm.puts "mend := trunc(time()*1000.0);"' puts "$pgm.puts \"rend := \#{Time.now.to_i}*1000;\"" puts "t = Process.times" puts "$pgm.puts \"rcpuuend := \#{t.utime}*1000;\"" puts "$pgm.puts \"rcpusend := \#{t.stime}*1000;\"" puts '$pgm.puts "melapsed := trunc(evalf(mend - mstart));"' puts '$pgm.puts "relapsed := trunc(evalf(rend - rstart));"' puts '$pgm.puts "rcpuuelapsed := trunc(evalf(rcpuuend - rcpuustart));"' puts '$pgm.puts "rcpuselapsed := trunc(evalf(rcpusend - rcpusstart));"' puts '$pgm.puts "mhours := hours_elapsed(melapsed);"' puts '$pgm.puts "rhours := hours_elapsed(relapsed);"' puts '$pgm.puts "rcpuuhours := hours_elapsed(rcpuuelapsed);"' puts '$pgm.puts "rcpushours := hours_elapsed(rcpuselapsed);"' puts '$pgm.puts "mmin := min_elapsed(mhours,melapsed);"' puts '$pgm.puts "rmin := min_elapsed(rhours,relapsed);"' puts '$pgm.puts "rcpuumin := min_elapsed(rcpuuhours,rcpuuelapsed);"' puts '$pgm.puts "rcpusmin := min_elapsed(rhours,rcpuselapsed);"' puts '$pgm.puts "msec := sec_elapsed(mhours,mmin,melapsed);"' puts '$pgm.puts "rsec := sec_elapsed(rhours,rmin,relapsed);"' puts '$pgm.puts "rcpuusec := sec_elapsed(rcpuuhours,rcpuumin,rcpuuelapsed);"' puts '$pgm.puts "rcpussec := sec_elapsed(rcpushours,rcpusmin,rcpuselapsed);"' puts '$pgm.puts "mmsec := msec_elapsed(mhours,mmin,msec,melapsed);"' puts '$pgm.puts "rmsec := msec_elapsed(rhours,rmin,rsec,relapsed);"' puts '$pgm.puts "rcpuumsec := msec_elapsed(rcpuuhours,rcpuumin,rcpuusec,rcpuuelapsed);"' puts '$pgm.puts "rcpusmsec := msec_elapsed(rcpushours,rcpusmin,rcpussec,rcpuselapsed);"' puts "$pgm.puts \"fprintf(out_fd,\\\"Maple %d hours %d minutes %d seconds %d msec CPU\\\\n\\\",mhours,mmin,msec,mmsec);\"" puts "$pgm.puts \"fprintf(out_fd,\\\"Ruby %d hours %d minutes %d seconds %d msec Clock\\\\n\\\",rhours,rmin,rsec,rmsec);\"" puts "$pgm.puts \"fprintf(out_fd,\\\"Ruby %d hours %d minutes %d seconds %d msec User CPU\\\\n\\\",rcpuuhours,rcpuumin,rcpuusec,rcpuumsec);\"" puts "$pgm.puts \"fprintf(out_fd,\\\"Ruby %d hours %d minutes %d seconds %d msec System CPU\\\\n\\\",rcpushours,rcpusmin,rcpussec,rcpusmsec);\"" puts "$pgm.puts \"fprintf(except_fd,\\\"Maple %d hours %d minutes %d seconds %d msec CPU\\\\n\\\",mhours,mmin,msec,mmsec);\"" puts "$pgm.puts \"fprintf(except_fd,\\\"Ruby %d hours %d minutes %d seconds %d msec Clock\\\\n\\\",rhours,rmin,rsec,rmsec);\"" puts "$pgm.puts \"fprintf(except_fd,\\\"Ruby %d hours %d minutes %d seconds %d msec User CPU\\\\n\\\",rcpuuhours,rcpuumin,rcpuusec,rcpuumsec);\"" puts "$pgm.puts \"fprintf(except_fd,\\\"Ruby %d hours %d minutes %d seconds %d msec System CPU\\\\n\\\",rcpushours,rcpusmin,rcpussec,rcpusmsec);\"" puts "$pgm.puts \"printf(\\\"Maple %d hours %d minutes %d seconds %d msec CPU\\\\n\\\",mhours,mmin,msec,mmsec);\"" puts "$pgm.puts \"printf(\\\"Ruby %d hours %d minutes %d seconds %d msec Clock\\\\n\\\",rhours,rmin,rsec,rmsec);\"" puts "$pgm.puts \"printf(\\\"Ruby %d hours %d minutes %d seconds %d msec User CPU\\\\n\\\",rcpuuhours,rcpuumin,rcpuusec,rcpuumsec);\"" puts "$pgm.puts \"printf(\\\"Ruby %d hours %d minutes %d seconds %d msec System CPU\\\\n\\\",rcpushours,rcpusmin,rcpussec,rcpusmsec);\"" puts '$pgm.puts "fclose(out_fd);"' puts '$pgm.puts "fclose(except_fd);"' puts "puts \"End of APFP Regression Test\"" end main