test/test_rtnlzr.rb in nio-0.2.1 vs test/test_rtnlzr.rb in nio-0.2.2

- old
+ new

@@ -1,125 +1,125 @@ - -# Copyright (C) 2003-2005, Javier Goizueta <javier@goizueta.info> -# -# This program is free software; you can redistribute it and/or -# modify it under the terms of the GNU General Public License -# as published by the Free Software Foundation; either version 2 -# of the License, or (at your option) any later version. -require 'test/unit' - -require 'nio/rtnlzr' -require 'nio/sugar' -include Nio -require 'yaml' -require 'bigdecimal/math' - -class TestRtnlzr < Test::Unit::TestCase - - class BgMth - extend BigMath - end - - def setup - - $data = YAML.load(File.read(File.join(File.dirname(__FILE__) ,'data.yaml'))).collect{|x| [x].pack('H*').unpack('E')[0]} - - end - - - def test_basic_rtnlzr - # basic Rtnlzr tests - r = Rtnlzr.new - assert_equal [13,10], r.rationalize(1.3) - assert_equal [13,10], Rtnlzr.max_denominator(1.3,10) - assert_equal [13,10], Rtnlzr.max_denominator(BigDecimal('1.3'),10) - assert_equal [1,3], Rtnlzr.max_denominator(1.0/3,10) - assert_equal [1,3], Rtnlzr.max_denominator(BigDecimal('1')/3,10) - - # basic tests of Float#nio_r - assert_equal Rational(1,3), (1.0/3.0).nio_r - assert_equal Rational(2,3), (2.0/3.0).nio_r - assert_equal Rational(1237,1234), (1237.0/1234.0).nio_r - assert_equal Rational(89,217), (89.0/217.0).nio_r - - # rationalization of Floats using a tolerance - t = Tolerance.new(1e-15,:sig) - assert_equal Rational(540429, 12500),43.23432.nio_r(t) - assert_equal Rational(6636649, 206596193),0.032123772.nio_r(t) - assert_equal Rational(280943, 2500000), 0.1123772.nio_r(t) - assert_equal Rational(39152929, 12500), 3132.23432.nio_r(t) - assert_equal Rational(24166771439, 104063), 232232.123223432.nio_r(t) - assert_equal Rational(792766404965, 637), 1244531247.98273123.nio_r(t) - #$data.each do |x| - # assert t.equals?(x, x.nio_r(t).to_f), "out of tolerance: #{x.inspect} #{x.nio_r(t).inspect}" - #end - - # rationalization with maximum denominator - assert_equal Rational(9441014047197, 7586), (1244531247.98273123.nio_r(10000)) - assert_equal Rational(11747130449709, 9439), BigDecimal('1244531247.982731230').nio_r(10000) - - - # approximate a value in [0.671,0.672]; - # Float - assert_equal [43,64], Rtnlzr.new(Tolerance.new(0.0005)).rationalize(0.6715) - assert_equal [43,64], Rtnlzr.new(Tol(0.0005)).rationalize(0.6715) - assert_equal [43,64], Rtnlzr.new(Rational(5,10000)).rationalize(0.6715) - # BigDecimal - assert_equal [43,64], Rtnlzr.new(BigTolerance.new(BigDecimal('0.0005'))).rationalize(BigDecimal('0.6715')) - assert_equal [43,64], Rtnlzr.new(Tol(BigDecimal('0.0005'))).rationalize(BigDecimal('0.6715')) - assert_equal [43,64], Rtnlzr.new(Rational(5,10000)).rationalize(BigDecimal('0.6715')) - # - assert_equal Rational(43,64), 0.6715.nio_r(0.0005) - assert_equal Rational(43,64), 0.6715.nio_r(Rational(5,10000)) - assert_equal Rational(47,70), 0.6715.nio_r(70) - assert_equal Rational(45,67), 0.6715.nio_r(69) - assert_equal Rational(2,3), 0.6715.nio_r(10) - - # some PI tests - assert_equal Rational(899125804609,286200632530), BgMth.PI(64).nio_r(BigTolerance.new(BigDec('261E-24'))) - assert_equal Rational(899125804609,286200632530), BgMth.PI(64).nio_r(Tol(BigDec('261E-24'))) - assert_equal Rational(899125804609,286200632530), BgMth.PI(64).nio_r(BigDec('261E-24')) - assert_equal Rational(899125804609,286200632530), BgMth.PI(64).nio_r(BigDec(261E-24)) - assert_equal Rational(899125804609,286200632530), BgMth.PI(64).nio_r(261E-24) - - # BigDecimal tests - #t = BigTolerance.new(BigDecimal('1e-15'),:sig) - t = BigTolerance.decimals(20,:sig) - $data.each do |x| - x = BigDec(x,:exact) - q = x.nio_r(t) - assert t.equals?(x, BigDec(q)), "out of tolerance: #{x.inspect} #{BigDec(q)}" - end - end - - def test_compare_algorithms - r = Rtnlzr.new(Tolerance.new(1e-5,:sig)) - ($data + $data.collect{|x| -x}).each do |x| - q1 = r.rationalize_Knuth(x) - q2 = r.rationalize_Horn(x) - q3 = r.rationalize_HornHutchins(x) - #q4 = r.rationalize_KnuthB(x) - q1 = [-q1[0],-q1[1]] if q1[1] < 0 - q2 = [-q2[0],-q2[1]] if q2[1] < 0 - q3 = [-q3[0],-q3[1]] if q3[1] < 0 - assert_equal q1, q2 - assert_equal q1, q3 - #assert_equal q1, q4 - end - r = Rtnlzr.new(Tolerance.epsilon) - ($data + $data.collect{|x| -x}).each do |x| - q1 = r.rationalize_Knuth(x) - q2 = r.rationalize_Horn(x) - q3 = r.rationalize_HornHutchins(x) - q1 = [-q1[0],-q1[1]] if q1[1] < 0 - q2 = [-q2[0],-q2[1]] if q2[1] < 0 - q3 = [-q3[0],-q3[1]] if q3[1] < 0 - #q4 = r.rationalize_KnuthB(x) - assert_equal q1, q2 - assert_equal q1, q3 - #assert_equal q1, q4 - end - - end - - -end + +# Copyright (C) 2003-2005, Javier Goizueta <javier@goizueta.info> +# +# This program is free software; you can redistribute it and/or +# modify it under the terms of the GNU General Public License +# as published by the Free Software Foundation; either version 2 +# of the License, or (at your option) any later version. +require 'test/unit' + +require 'nio/rtnlzr' +require 'nio/sugar' +include Nio +require 'yaml' +require 'bigdecimal/math' + +class TestRtnlzr < Test::Unit::TestCase + + class BgMth + extend BigMath + end + + def setup + + $data = YAML.load(File.read(File.join(File.dirname(__FILE__) ,'data.yaml'))).collect{|x| [x].pack('H*').unpack('E')[0]} + + end + + + def test_basic_rtnlzr + # basic Rtnlzr tests + r = Rtnlzr.new + assert_equal [13,10], r.rationalize(1.3) + assert_equal [13,10], Rtnlzr.max_denominator(1.3,10) + assert_equal [13,10], Rtnlzr.max_denominator(BigDecimal('1.3'),10) + assert_equal [1,3], Rtnlzr.max_denominator(1.0/3,10) + assert_equal [1,3], Rtnlzr.max_denominator(BigDecimal('1')/3,10) + + # basic tests of Float#nio_r + assert_equal Rational(1,3), (1.0/3.0).nio_r + assert_equal Rational(2,3), (2.0/3.0).nio_r + assert_equal Rational(1237,1234), (1237.0/1234.0).nio_r + assert_equal Rational(89,217), (89.0/217.0).nio_r + + # rationalization of Floats using a tolerance + t = Tolerance.new(1e-15,:sig) + assert_equal Rational(540429, 12500),43.23432.nio_r(t) + assert_equal Rational(6636649, 206596193),0.032123772.nio_r(t) + assert_equal Rational(280943, 2500000), 0.1123772.nio_r(t) + assert_equal Rational(39152929, 12500), 3132.23432.nio_r(t) + assert_equal Rational(24166771439, 104063), 232232.123223432.nio_r(t) + assert_equal Rational(792766404965, 637), 1244531247.98273123.nio_r(t) + #$data.each do |x| + # assert t.equals?(x, x.nio_r(t).to_f), "out of tolerance: #{x.inspect} #{x.nio_r(t).inspect}" + #end + + # rationalization with maximum denominator + assert_equal Rational(9441014047197, 7586), (1244531247.98273123.nio_r(10000)) + assert_equal Rational(11747130449709, 9439), BigDecimal('1244531247.982731230').nio_r(10000) + + + # approximate a value in [0.671,0.672]; + # Float + assert_equal [43,64], Rtnlzr.new(Tolerance.new(0.0005)).rationalize(0.6715) + assert_equal [43,64], Rtnlzr.new(Tol(0.0005)).rationalize(0.6715) + assert_equal [43,64], Rtnlzr.new(Rational(5,10000)).rationalize(0.6715) + # BigDecimal + assert_equal [43,64], Rtnlzr.new(BigTolerance.new(BigDecimal('0.0005'))).rationalize(BigDecimal('0.6715')) + assert_equal [43,64], Rtnlzr.new(Tol(BigDecimal('0.0005'))).rationalize(BigDecimal('0.6715')) + assert_equal [43,64], Rtnlzr.new(Rational(5,10000)).rationalize(BigDecimal('0.6715')) + # + assert_equal Rational(43,64), 0.6715.nio_r(0.0005) + assert_equal Rational(43,64), 0.6715.nio_r(Rational(5,10000)) + assert_equal Rational(47,70), 0.6715.nio_r(70) + assert_equal Rational(45,67), 0.6715.nio_r(69) + assert_equal Rational(2,3), 0.6715.nio_r(10) + + # some PI tests + assert_equal Rational(899125804609,286200632530), BgMth.PI(64).nio_r(BigTolerance.new(BigDec('261E-24'))) + assert_equal Rational(899125804609,286200632530), BgMth.PI(64).nio_r(Tol(BigDec('261E-24'))) + assert_equal Rational(899125804609,286200632530), BgMth.PI(64).nio_r(BigDec('261E-24')) + assert_equal Rational(899125804609,286200632530), BgMth.PI(64).nio_r(BigDec(261E-24)) + assert_equal Rational(899125804609,286200632530), BgMth.PI(64).nio_r(261E-24) + + # BigDecimal tests + #t = BigTolerance.new(BigDecimal('1e-15'),:sig) + t = BigTolerance.decimals(20,:sig) + $data.each do |x| + x = BigDec(x,:exact) + q = x.nio_r(t) + assert t.equals?(x, BigDec(q)), "out of tolerance: #{x.inspect} #{BigDec(q)}" + end + end + + def test_compare_algorithms + r = Rtnlzr.new(Tolerance.new(1e-5,:sig)) + ($data + $data.collect{|x| -x}).each do |x| + q1 = r.rationalize_Knuth(x) + q2 = r.rationalize_Horn(x) + q3 = r.rationalize_HornHutchins(x) + #q4 = r.rationalize_KnuthB(x) + q1 = [-q1[0],-q1[1]] if q1[1] < 0 + q2 = [-q2[0],-q2[1]] if q2[1] < 0 + q3 = [-q3[0],-q3[1]] if q3[1] < 0 + assert_equal q1, q2 + assert_equal q1, q3 + #assert_equal q1, q4 + end + r = Rtnlzr.new(Tolerance.epsilon) + ($data + $data.collect{|x| -x}).each do |x| + q1 = r.rationalize_Knuth(x) + q2 = r.rationalize_Horn(x) + q3 = r.rationalize_HornHutchins(x) + q1 = [-q1[0],-q1[1]] if q1[1] < 0 + q2 = [-q2[0],-q2[1]] if q2[1] < 0 + q3 = [-q3[0],-q3[1]] if q3[1] < 0 + #q4 = r.rationalize_KnuthB(x) + assert_equal q1, q2 + assert_equal q1, q3 + #assert_equal q1, q4 + end + + end + + +end