# The following statements belong at the beginning require "rapfp/ApConfig" require "rapfp/Ap" rconst = $ApConst.new rconst.one.setrconst(rconst) rconst.init2 rconst.one.setrconst(rconst) $RConst = rconst cconst = ApcConst.new(rconst) cconst.one.setcconst(cconst) cconst.one.setrconst(rconst) $CConst = cconst # Apfp providesRuby classes for Arbitrary Precision Floating Point Numbers. # The provided ApConfig file only is set at 16 digits. # Even at that it is much slower than built in floatingh point numbers. # So what advantages can it have? # The main advantage is that, given the possible error of the inputs - the # possible error of the outputs is calculated along with the output itsself. # A vaariable of that class can be created in the following ways - foe example. ap1 = ap_in("5.0+/-1.0e-3") ap2 = ap_in("0.05e2+/-0.001") ap3 = ap_in("5.0e2+/-0.1e-2") ap4 = c(5.0) #max precision of built in floats ap5 = ap_in("5.0") #max precision set in ApConfig.rb ap6 = ap_in("0.5") #max precision set in ApConfig.rb ap7 = ap_in("6.0+/-1.0e-3") ap8 = ap_in("7.0+/-1.0e-3") ap9 = ap_in("6.00001+/-1.0e-3") ap10 = ap7 - ap9 # The vasluses may be printed puts "ap1 = " + ap1.to_s puts "ap2 = " + ap2.to_s puts "ap3 = " + ap3.to_s puts "ap4 = " + ap4.to_s puts "ap5 = " + ap5.to_s puts "ap6 = " + ap6.to_s puts "ap7 = " + ap7.to_s puts "ap8 = " + ap8.to_s puts "ap9 = " + ap9.to_s puts "ap10 = " + ap10.to_s # The Values and error cam also be printed separately puts "ap1 main = " + ap1.to_s_main puts "ap1 error = " + ap1.to_s_err # The following can also be computed puts "ap1 + ap2 = " + (ap1 + ap2).to_s puts "ap1 - ap2 = " + (ap1 - ap2).to_s puts "ap1 * ap2 = " + (ap1 * ap2).to_s puts "ap1 / ap2 = " + (ap1 / ap2).to_s puts "ap1 ** ap2 = " + (ap1 ** ap2).to_s # And tbe functions puts "ap1.sin = " + ap1.sin.to_s puts "ap1.cos = " + ap1.cos.to_s puts "ap1.tan = " + ap1.tan.to_s puts "ap1.exp = " + ap1.exp.to_s puts "ap1.log (base e) = " + ap1.log.to_s puts "ap1.log10 = " + ap1.log10.to_s puts "ap1.sinh = " + ap1.sinh.to_s puts "ap1.cosh = " + ap1.cosh.to_s puts "ap1.tanh = " + ap1.tanh.to_s puts "ap6.asin = " + ap6.asin.to_s puts "ap6.acos = " + ap6.acos.to_s puts "ap6.atan = " + ap6.atan.to_s puts "ap1.erf = " + ap1.erf.to_s # Comparisons if ap1 < ap7 then puts "ap1 < ap7" else puts "not ap1 < ap7" end if ap1 > ap7 then puts "ap1 > ap7" else puts "not ap1 > ap7" end if ap1 == ap7 then puts "ap1 == ap7" else puts "not ap1 == ap7" end if ap1 <= ap7 then puts "ap1 <= ap7" else puts "not ap1 <= ap7" end if ap1 >= ap7 then puts "ap1 >= ap7" else puts "not ap1 >= ap7" end if ap1 != ap7 then puts "ap1 != ap7" else puts "not ap1 != ap7" end if ap1.not_zero then puts "ap1.not_zero" else puts "not ap1.not_zero" end if ap1.maybe_zero then puts "ap1.maybe_zero" else puts "not ap1.maybe_zero" end # Comparisons of Close values # > and < must be definitely satisfied (even with max error) # == if it is possible within error # >= and <= - not < or not > # != definitely not equal if ap7 < ap9 then puts "ap7 < ap9" else puts "not ap7 < ap9" end if ap7 > ap9 then puts "ap7 > ap9" else puts "not ap7 > ap9" end if ap7 == ap9 then puts "ap7 == ap9" else puts "not ap7 == ap9" end if ap7 <= ap9 then puts "ap7 <= ap9" else puts "not ap7 <= ap9" end if ap7 >= ap9 then puts "ap7 >= ap9" else puts "not ap7 >= ap9" end if ap7 != ap9 then puts "ap7 != ap9" else puts "not ap7 != ap9" end if ap10.not_zero then puts "ap10.not_zero" else puts "not ap10.not_zero" end if ap10.maybe_zero then puts "ap10.maybe_zero" else puts "not ap10.maybe_zero" end #You can also do complex cone = Apc.new(ap_in("1.0"),ap_in("0.0")) czero = Apc.new(ap_in("0.0"),ap_in("0.0")) cI = Apc.new(ap_in("0.0"),ap_in("1.0")) c1pI = Apc.new(ap_in("1.0"),ap_in("1.0")) c2pI = Apc.new(ap_in("2.0"),ap_in("1.0")) cm1 = Apc.new(ap_in("-1.0"),ap_in("0.0")) puts "cone = " + cone.to_s puts "zero = " + czero.to_s puts "cI = " + cI.to_s puts "c1pI = " + c1pI.to_s puts "c2pI = " + c2pI.to_s puts "c2pI = " + c1pI.to_s puts "cm1 = " + cm1.to_s # The can also be computed puts "c1pI + c2pI = " + (c1pI + c2pI).to_s puts "c1pI - c2pI = " + (c1pI - c2pI).to_s puts "c1pI * c2pI = " + (c1pI * c2pI).to_s puts "c1pI / c2pI = " + (c1pI / c2pI).to_s puts "c1pI ** c2pI = " + (c1pI ** c2pI).to_s # And tbe functions puts "c1pI.sin = " + c1pI.sin.to_s puts "c1pI.cos = " + c1pI.cos.to_s puts "c1pI.tan = " + c1pI.tan.to_s puts "c1pI.exp = " + c1pI.exp.to_s puts "c1pI.log (base e) = " + c1pI.log.to_s puts "c1pI.log10 = " + c1pI.log10.to_s puts "c1pI.sinh = " + c1pI.sinh.to_s puts "c1pI.cosh = " + c1pI.cosh.to_s puts "c1pI.tanh = " + c1pI.tanh.to_s puts "c1pI.asin = " + c1pI.asin.to_s puts "c1pI.acos = " + c1pI.acos.to_s puts "c1pI.atan = " + c1pI.atan.to_s # puts "c1pI.erf = " + c1pI.erf.to_s