test/test_rtnlzr.rb in nio-0.2.3 vs test/test_rtnlzr.rb in nio-0.2.4
- old
+ new
@@ -1,100 +1,122 @@
-# 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'
+require File.dirname(__FILE__) + '/helper.rb'
include Nio
require 'yaml'
+require 'flt'
+require 'flt/float'
+require 'flt/math'
+require 'flt/bigdecimal'
require 'bigdecimal/math'
-class TestRtnlzr < Test::Unit::TestCase
- class BgMth
- extend BigMath
- end
+require 'bigdecimal/math'
+module BgMth
+ extend BigMath
+end
+
+
+class TestRtnlzr < Test::Unit::TestCase
+
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)
-
+ assert_equal [13,10], Rtnlzr.max_denominator(Flt.DecNum('1.3'),10)
+ assert_equal [1,3], Rtnlzr.max_denominator(Flt.DecNum('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)
+ t = Flt.Tolerance(1e-15/2,:floating)
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)
+ 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))
+
+ # 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)
-
-
+ assert_equal Rational(11747130449709, 9439), Flt.DecNum('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(Flt.Tolerance(0.0005)).rationalize(0.6715)
assert_equal [43,64], Rtnlzr.new(Rational(5,10000)).rationalize(0.6715)
+ # BinNum
+ assert_equal [43,64], Rtnlzr.new(Flt.Tolerance(Flt.BinNum('0.0005'))).rationalize(Flt::BinNum('0.6715'))
+ assert_equal [43,64], Rtnlzr.new(Flt.Tolerance(Rational(5,10000))).rationalize(Flt::BinNum('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(Flt.Tolerance('0.0005')).rationalize(BigDecimal('0.6715'))
assert_equal [43,64], Rtnlzr.new(Rational(5,10000)).rationalize(BigDecimal('0.6715'))
- #
+ # DecNum
+ assert_equal [43,64], Rtnlzr.new(Flt.Tolerance(Flt.DecNum('0.0005'))).rationalize(Flt::DecNum('0.6715'))
+ assert_equal [43,64], Rtnlzr.new(Flt.Tolerance(Rational(5,10000))).rationalize(Flt::DecNum('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)
+ assert_equal Rational(899125804609,286200632530), BgMth.PI(64).nio_r(Flt.Tolerance(Flt.DecNum('261E-24')))
+ assert_equal Rational(899125804609,286200632530), BgMth.PI(64).nio_r(Flt.Tolerance(Flt.DecNum('261E-24')))
+ assert_equal Rational(899125804609,286200632530), BgMth.PI(64).nio_r(Flt.DecNum('261E-24'))
+ assert_equal Rational(899125804609,286200632530), BgMth.PI(64).nio_r(261E-24)
+
+ assert_equal Rational(899125804609,286200632530), Flt::DecNum::Math.pi(64).nio_r(Flt.Tolerance(Flt.DecNum('261E-24')))
+ assert_equal Rational(899125804609,286200632530), Flt::DecNum::Math.pi(64).nio_r(Flt.Tolerance(Flt.DecNum('261E-24')))
+ assert_equal Rational(899125804609,286200632530), Flt::DecNum::Math.pi(64).nio_r(Flt.DecNum('261E-24'))
+ assert_equal Rational(899125804609,286200632530), Flt::DecNum::Math.pi(64).nio_r(261E-24)
+
+ # DecNum tests
+ #t = Flt.Tolerance(Flt.DecNum('1e-15'),:floating)
+ t = Flt.Tolerance(20,:sig_decimals)
$data.each do |x|
- x = BigDec(x,:exact)
+ x = Flt.BinNum(x).to_decimal_exact
q = x.nio_r(t)
- assert t.equals?(x, BigDec(q)), "out of tolerance: #{x.inspect} #{BigDec(q)}"
+ assert t.eq?(x, Flt.DecNum(q)), "out of tolerance: #{x.inspect} #{Flt.DecNum(q)}"
end
+
+ # Flt tests
+ #t = Flt.Tolerance(Flt.DecNum('1e-15'),:floating)
+ t = Flt.Tolerance(20,:sig_decimals)
+ $data.each do |x|
+ x = Flt.BinNum(x)
+ q = x.nio_r(t)
+ assert t.eq?(x, Flt.BinNum(q)), "out of tolerance: #{x.inspect} #{Flt.BinNum(q)}"
+ end
+
+
end
def test_compare_algorithms
- r = Rtnlzr.new(Tolerance.new(1e-5,:sig))
+ r = Rtnlzr.new(Flt.Tolerance(1e-5,:floating))
($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)
@@ -103,11 +125,11 @@
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)
+ r = Rtnlzr.new(Flt.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
@@ -116,10 +138,10 @@
#q4 = r.rationalize_KnuthB(x)
assert_equal q1, q2
assert_equal q1, q3
#assert_equal q1, q4
end
-
+
end
-
+
end