flt 1.5.0 → 1.5.1
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/History.txt +8 -0
- data/README.md +765 -0
- data/expand.rb +2 -0
- data/flt.gemspec +1 -0
- data/lib/flt.rb +1 -1
- data/lib/flt/bigdecimal.rb +2 -5
- data/lib/flt/bin_num.rb +1 -4
- data/lib/flt/complex.rb +10 -9
- data/lib/flt/dec_num.rb +9 -10
- data/lib/flt/float.rb +4 -6
- data/lib/flt/math.rb +3 -4
- data/lib/flt/num.rb +54 -21
- data/lib/flt/sugar.rb +1 -2
- data/lib/flt/support.rb +5 -2
- data/lib/flt/support/flag_values.rb +1 -1
- data/lib/flt/support/rationalizer.rb +3 -3
- data/lib/flt/support/rationalizer_extra.rb +6 -6
- data/lib/flt/support/reader.rb +1 -1
- data/lib/flt/tolerance.rb +2 -7
- data/lib/flt/trigonometry.rb +0 -2
- data/lib/flt/version.rb +1 -1
- data/setup.rb +1 -2
- data/test/generate_trig_data.rb +6 -6
- data/test/helper.rb +11 -5
- data/test/reader.rb +1 -1
- data/test/test_base_digits.rb +4 -2
- data/test/test_basic.rb +7 -7
- data/test/test_big_decimal.rb +21 -21
- data/test/test_bin.rb +1 -1
- data/test/test_bin_arithmetic.rb +1 -1
- data/test/test_binfloat_conversion.rb +1 -1
- data/test/test_coercion.rb +1 -1
- data/test/test_comparisons.rb +4 -4
- data/test/test_dectest.rb +2 -2
- data/test/test_define_conversions.rb +10 -10
- data/test/test_epsilon.rb +1 -1
- data/test/test_exact.rb +12 -11
- data/test/test_flags.rb +1 -1
- data/test/test_float.rb +23 -25
- data/test/test_format.rb +1 -1
- data/test/test_formatter.rb +6 -8
- data/test/test_hex_format.rb +2 -2
- data/test/test_multithreading.rb +1 -1
- data/test/test_normalized.rb +1 -1
- data/test/test_num_constructor.rb +6 -1
- data/test/test_odd_even.rb +1 -1
- data/test/test_rationalizer.rb +1 -1
- data/test/test_round.rb +36 -1
- data/test/test_sugar.rb +6 -6
- data/test/test_to_int.rb +4 -4
- data/test/test_to_rf.rb +126 -1
- data/test/test_tol.rb +1 -1
- data/test/test_trig.rb +1 -1
- data/test/test_ulp.rb +3 -3
- metadata +18 -4
- data/README.rdoc +0 -614
data/expand.rb
CHANGED
data/flt.gemspec
CHANGED
data/lib/flt.rb
CHANGED
@@ -6,9 +6,9 @@ require 'flt/support/flag_values'
|
|
6
6
|
require 'flt/support/reader'
|
7
7
|
require 'flt/support/formatter'
|
8
8
|
require 'flt/support/rationalizer'
|
9
|
+
require 'flt/num'
|
9
10
|
require 'flt/float'
|
10
11
|
require 'flt/bigdecimal'
|
11
|
-
require 'flt/num'
|
12
12
|
require 'flt/dec_num'
|
13
13
|
require 'flt/bin_num'
|
14
14
|
require 'flt/tolerance'
|
data/lib/flt/bigdecimal.rb
CHANGED
@@ -1,8 +1,5 @@
|
|
1
1
|
# Support classes for homogeneous treatment of BigDecimal and Num values by defining BigDecimal.context
|
2
2
|
|
3
|
-
require 'flt/num'
|
4
|
-
require 'flt/dec_num'
|
5
|
-
|
6
3
|
require 'bigdecimal'
|
7
4
|
require 'bigdecimal/math'
|
8
5
|
require 'singleton'
|
@@ -109,13 +106,13 @@ class Flt::BigDecimalContext
|
|
109
106
|
end
|
110
107
|
|
111
108
|
def split(x)
|
112
|
-
sgn, d,
|
109
|
+
sgn, d, _b, e = x.split
|
113
110
|
[sgn<0 ? -1 : +1, d.to_i, e-d.size]
|
114
111
|
end
|
115
112
|
|
116
113
|
# Return the value of the number as an signed integer and a scale.
|
117
114
|
def to_int_scale(x)
|
118
|
-
sgn, d,
|
115
|
+
sgn, d, _b, e = x.split
|
119
116
|
c = d.to_i
|
120
117
|
[sgn<0 ? -1 : c, -c, e-d.size]
|
121
118
|
end
|
data/lib/flt/bin_num.rb
CHANGED
@@ -1,6 +1,3 @@
|
|
1
|
-
require 'flt/num'
|
2
|
-
require 'flt/float'
|
3
|
-
|
4
1
|
module Flt
|
5
2
|
|
6
3
|
class BinNum < Num
|
@@ -206,7 +203,7 @@ class BinNum < Num
|
|
206
203
|
# Specific to_f conversion TODO: check if it represents an optimization
|
207
204
|
if Float::RADIX==2
|
208
205
|
def to_f
|
209
|
-
if special?
|
206
|
+
if special? || zero?
|
210
207
|
super
|
211
208
|
else
|
212
209
|
::Math.ldexp(@sign*@coeff, @exp)
|
data/lib/flt/complex.rb
CHANGED
@@ -93,9 +93,9 @@ module Flt
|
|
93
93
|
define_method mth do |*args|
|
94
94
|
is_complex = args.detect{|z| z.kind_of?(Complex)}
|
95
95
|
if is_complex || (negative_arg_to_complex && args.first<0)
|
96
|
-
num_class.context(:extra_precision=>extra_prec) do |
|
97
|
-
#Complex.rectangular
|
98
|
-
Complex.rectangular
|
96
|
+
num_class.context(:extra_precision => extra_prec) do |extra_context|
|
97
|
+
#Complex.rectangular(*blk[extra_context, *args].map{|v| @context.plus(v)})
|
98
|
+
Complex.rectangular(*instance_exec(extra_context, *args, &blk).map{|v| @context.plus(v)})
|
99
99
|
end
|
100
100
|
else
|
101
101
|
@context.send(mth, *args) # Num(@context.send(mth, *args)) ?
|
@@ -238,7 +238,7 @@ module Flt
|
|
238
238
|
z_is_complex = z.kind_of?(Complex)
|
239
239
|
if z_is_complex || z.abs>1
|
240
240
|
# z = Complex(1) unless z_is_complex
|
241
|
-
i = Complex(0
|
241
|
+
# i = Complex(0, @context.num_class[1])
|
242
242
|
fix num_class.context(:extra_precision=>3).cmath{ num_class.one_half*ln((1+z)/(1-z)) }
|
243
243
|
else
|
244
244
|
@context.atanh(z)
|
@@ -256,6 +256,7 @@ module Flt
|
|
256
256
|
end
|
257
257
|
|
258
258
|
def fix_polar(r, theta)
|
259
|
+
re = im = nil
|
259
260
|
num_class.context(:extra_precision=>3) do |mth|
|
260
261
|
re = r*mth.cos(theta)
|
261
262
|
im = r*mth.sin(theta)
|
@@ -264,7 +265,7 @@ module Flt
|
|
264
265
|
end
|
265
266
|
|
266
267
|
def fix(z)
|
267
|
-
fix_rect
|
268
|
+
fix_rect(*z.rectangular)
|
268
269
|
end
|
269
270
|
|
270
271
|
end # ComplexContext
|
@@ -280,9 +281,9 @@ module Flt
|
|
280
281
|
# if ComplexContext is derived from ContextBase: return ComplexContext(self).math(*parameters, &blk)
|
281
282
|
num_class.context(self) do
|
282
283
|
if parameters.empty?
|
283
|
-
Flt.ComplexContext(num_class.context).instance_eval
|
284
|
+
Flt.ComplexContext(num_class.context).instance_eval(&blk)
|
284
285
|
else
|
285
|
-
Flt.xiComplexContext(num_class.context).instance_exec
|
286
|
+
Flt.xiComplexContext(num_class.context).instance_exec(*parameters, &blk)
|
286
287
|
end
|
287
288
|
end
|
288
289
|
end
|
@@ -298,14 +299,14 @@ module Flt
|
|
298
299
|
module DecNum::CMath
|
299
300
|
include MathBase
|
300
301
|
num_class(DecNum){num_class.ccontext}
|
301
|
-
math_function
|
302
|
+
math_function(*Trigonometry.public_instance_methods)
|
302
303
|
math_function :exp, :log, :log2, :log10, :sqrt
|
303
304
|
end
|
304
305
|
|
305
306
|
module BinNum::CMath
|
306
307
|
include MathBase
|
307
308
|
num_class(BinNum){num_class.ccontext}
|
308
|
-
math_function
|
309
|
+
math_function(*Trigonometry.public_instance_methods)
|
309
310
|
math_function :exp, :log, :log2, :log10, :sqrt
|
310
311
|
end
|
311
312
|
|
data/lib/flt/dec_num.rb
CHANGED
@@ -1,6 +1,3 @@
|
|
1
|
-
require 'flt/num'
|
2
|
-
require 'flt/bigdecimal'
|
3
|
-
|
4
1
|
module Flt
|
5
2
|
|
6
3
|
# DecNum arbitrary precision floating point number.
|
@@ -1185,18 +1182,20 @@ class DecNum < Num
|
|
1185
1182
|
return _div_nearest(_iexp(rem, 10**p), 1000), quot - p + 3
|
1186
1183
|
end
|
1187
1184
|
|
1188
|
-
# number of
|
1185
|
+
# number of decimal digits in a nonnegative integer
|
1189
1186
|
def _number_of_digits(i)
|
1190
1187
|
raise TypeError, "The argument to _number_of_digits should be nonnegative." if i < 0
|
1191
|
-
if i.
|
1192
|
-
|
1193
|
-
|
1194
|
-
|
1188
|
+
return 1 if i.zero?
|
1189
|
+
nb = _nbits(i)
|
1190
|
+
nd1 = ((nb-1)*LOG10_2).floor + 1
|
1191
|
+
nd2 = (nb*LOG10_2).floor + 1
|
1192
|
+
if nd1 == nd2
|
1193
|
+
nd1
|
1195
1194
|
else
|
1196
|
-
|
1195
|
+
i >= 10**nd1 ? nd2 : nd1
|
1197
1196
|
end
|
1198
1197
|
end
|
1199
|
-
|
1198
|
+
LOG10_2 = Math.log10(2)
|
1200
1199
|
|
1201
1200
|
end # AuxiliarFunctions
|
1202
1201
|
|
data/lib/flt/float.rb
CHANGED
@@ -2,10 +2,8 @@
|
|
2
2
|
#
|
3
3
|
# The set of constants with Float metadata is also augmented.
|
4
4
|
|
5
|
-
require 'flt/num'
|
6
5
|
require 'singleton'
|
7
6
|
|
8
|
-
|
9
7
|
# Float constants.
|
10
8
|
#
|
11
9
|
# Note that this uses the "fractional significand" interpretation,
|
@@ -80,8 +78,8 @@ class Float
|
|
80
78
|
# Minimum non zero positive denormal number == 0.0.next
|
81
79
|
MIN_D = Math.ldexp(1,Float::MIN_EXP-Float::MANT_DIG);
|
82
80
|
|
83
|
-
# Maximum significand
|
84
|
-
MAX_F = Math.frexp(Float::MAX)[0]
|
81
|
+
# Maximum significand == Math.ldexp(Math.ldexp(1,Float::MANT_DIG)-1,-Float::MANT_DIG)
|
82
|
+
MAX_F = Math.frexp(Float::MAX)[0]
|
85
83
|
|
86
84
|
end
|
87
85
|
|
@@ -491,10 +489,10 @@ class Flt::FloatContext
|
|
491
489
|
|
492
490
|
def math(*parameters, &blk)
|
493
491
|
if parameters.empty?
|
494
|
-
self.instance_eval
|
492
|
+
self.instance_eval(&blk)
|
495
493
|
else
|
496
494
|
# needs instance_exe (available in Ruby 1.9, ActiveRecord; TODO: include implementation here)
|
497
|
-
self.instance_exec
|
495
|
+
self.instance_exec(*parameters, &blk)
|
498
496
|
end
|
499
497
|
end
|
500
498
|
|
data/lib/flt/math.rb
CHANGED
@@ -1,5 +1,4 @@
|
|
1
|
-
require 'flt
|
2
|
-
require 'flt/bin_num'
|
1
|
+
require 'flt'
|
3
2
|
require 'flt/trigonometry'
|
4
3
|
|
5
4
|
module Flt
|
@@ -52,7 +51,7 @@ module Flt
|
|
52
51
|
module DecNum::Math
|
53
52
|
include MathBase
|
54
53
|
num_class DecNum
|
55
|
-
math_function
|
54
|
+
math_function(*Trigonometry.public_instance_methods)
|
56
55
|
math_function :exp, :log, :log2, :log10, :sqrt
|
57
56
|
end
|
58
57
|
|
@@ -60,7 +59,7 @@ module Flt
|
|
60
59
|
module BinNum::Math
|
61
60
|
include MathBase
|
62
61
|
num_class BinNum
|
63
|
-
math_function
|
62
|
+
math_function(*Trigonometry.public_instance_methods)
|
64
63
|
math_function :exp, :log, :log2, :log10, :sqrt
|
65
64
|
end
|
66
65
|
|
data/lib/flt/num.rb
CHANGED
@@ -18,7 +18,6 @@ require 'flt/support/reader'
|
|
18
18
|
require 'flt/support/formatter'
|
19
19
|
require 'flt/support/rationalizer'
|
20
20
|
|
21
|
-
require 'bigdecimal'
|
22
21
|
require 'forwardable'
|
23
22
|
require 'rational'
|
24
23
|
require 'monitor'
|
@@ -216,7 +215,7 @@ class Num < Numeric
|
|
216
215
|
class InvalidOperation < Exception
|
217
216
|
def self.handle(context, *args)
|
218
217
|
if args.size>0
|
219
|
-
sign, coeff,
|
218
|
+
sign, coeff, _exp = args.first.split
|
220
219
|
context.num_class.new([sign, coeff, :nan])._fix_nan(context)
|
221
220
|
else
|
222
221
|
context.num_class.nan
|
@@ -472,10 +471,10 @@ class Num < Numeric
|
|
472
471
|
# TODO: consider renaming this to eval
|
473
472
|
num_class.context(self) do
|
474
473
|
if parameters.empty?
|
475
|
-
num_class.context.instance_eval
|
474
|
+
num_class.context.instance_eval(&blk)
|
476
475
|
else
|
477
476
|
# needs instance_exe (available in Ruby 1.9, ActiveRecord; TODO: include implementation here)
|
478
|
-
num_class.context.instance_exec
|
477
|
+
num_class.context.instance_exec(*parameters, &blk)
|
479
478
|
end
|
480
479
|
end
|
481
480
|
end
|
@@ -2418,7 +2417,7 @@ class Num < Numeric
|
|
2418
2417
|
exp = self.exponent
|
2419
2418
|
dgs = self.digits
|
2420
2419
|
nd = dgs.size # self.number_of_digits
|
2421
|
-
|
2420
|
+
while dgs[nd-1]==0
|
2422
2421
|
exp += 1
|
2423
2422
|
nd -= 1
|
2424
2423
|
end
|
@@ -2703,10 +2702,24 @@ class Num < Numeric
|
|
2703
2702
|
else
|
2704
2703
|
0.0/0.0
|
2705
2704
|
end
|
2705
|
+
elsif zero?
|
2706
|
+
@sign*0.0
|
2706
2707
|
else
|
2707
|
-
|
2708
|
-
|
2709
|
-
|
2708
|
+
f = nil
|
2709
|
+
f ||= to_s.to_f if num_class.radix == 10 # very precise, but slow
|
2710
|
+
unless f
|
2711
|
+
c = @coeff.to_f
|
2712
|
+
if c.finite?
|
2713
|
+
# This is fast to compute but may introduce roundoff error, and overflow or yield NaN
|
2714
|
+
f = if @exp >= 0
|
2715
|
+
@sign*c*(num_class.radix.to_f**@exp)
|
2716
|
+
else
|
2717
|
+
@sign*c/(num_class.radix.to_f**(-@exp))
|
2718
|
+
end
|
2719
|
+
end
|
2720
|
+
f = nil unless f && f.finite?
|
2721
|
+
end
|
2722
|
+
f ||= to_r.to_f # not so slow, also may introduce roundoff error due to arithmetic
|
2710
2723
|
end
|
2711
2724
|
end
|
2712
2725
|
|
@@ -2884,8 +2897,14 @@ class Num < Numeric
|
|
2884
2897
|
end
|
2885
2898
|
|
2886
2899
|
# Digits of the significand as an array of integers
|
2887
|
-
|
2888
|
-
|
2900
|
+
if Gem::Version.new(RUBY_VERSION) >= Gem::Version.new('2.4.0')
|
2901
|
+
def digits
|
2902
|
+
@coeff.is_a?(Integer) ? @coeff.digits(num_class.radix).reverse! : []
|
2903
|
+
end
|
2904
|
+
else
|
2905
|
+
def digits
|
2906
|
+
@coeff.to_s(num_class.radix).split('').map{|d| d.to_i}
|
2907
|
+
end
|
2889
2908
|
end
|
2890
2909
|
|
2891
2910
|
# Significand as an integer, unsigned. Synonym of coefficient
|
@@ -3124,21 +3143,36 @@ class Num < Numeric
|
|
3124
3143
|
# :power 1E3 1E2 10 1 0.1 1E-2 1E-3 1E-4
|
3125
3144
|
# :index 0 1 2 3 4 5 6 7
|
3126
3145
|
# :rindex 7 6 5 4 3 2 1 0
|
3127
|
-
def round(
|
3128
|
-
|
3146
|
+
def round(*args)
|
3147
|
+
# Admit first integer argument
|
3148
|
+
places = args.shift if args.first.is_a?(Integer)
|
3149
|
+
opt = args.shift || {}
|
3150
|
+
raise "Invalid arguments for round" unless args.empty?
|
3151
|
+
|
3152
|
+
# Support Ruby 2.4-style parameters:
|
3153
|
+
half_rounding = opt.delete(:half)
|
3154
|
+
case half_rounding
|
3155
|
+
when :even
|
3156
|
+
opt[:rounding] = :half_even
|
3157
|
+
when :up
|
3158
|
+
opt[:rounding] = :half_up
|
3159
|
+
when :down
|
3160
|
+
opt[:rounding] = :half_down
|
3161
|
+
end
|
3162
|
+
|
3129
3163
|
r = opt[:rounding] || :half_up
|
3130
3164
|
as_int = false
|
3131
|
-
if v=
|
3165
|
+
if v = opt[:precision] || opt[:significant_digits]
|
3132
3166
|
prec = v
|
3133
|
-
elsif v=
|
3167
|
+
elsif v = opt[:places] || places
|
3134
3168
|
prec = adjusted_exponent + 1 + v
|
3135
|
-
elsif v=
|
3169
|
+
elsif v = opt[:exponent]
|
3136
3170
|
prec = adjusted_exponent + 1 - v
|
3137
|
-
elsif v=
|
3171
|
+
elsif v = opt[:power]
|
3138
3172
|
prec = adjusted_exponent + 1 - num_class.Num(v).adjusted_exponent
|
3139
|
-
elsif v=
|
3173
|
+
elsif v = opt[:index]
|
3140
3174
|
prec = i+1
|
3141
|
-
elsif v=
|
3175
|
+
elsif v = opt[:rindex]
|
3142
3176
|
prec = number_of_digits - v
|
3143
3177
|
else
|
3144
3178
|
prec = adjusted_exponent + 1
|
@@ -3203,7 +3237,7 @@ class Num < Numeric
|
|
3203
3237
|
|
3204
3238
|
# Representation as text of a number: this is an alias of Num#format
|
3205
3239
|
def to_s(*args)
|
3206
|
-
format
|
3240
|
+
format(*args)
|
3207
3241
|
end
|
3208
3242
|
|
3209
3243
|
# Raises to the power of x, to modulo if given.
|
@@ -3886,7 +3920,6 @@ class Num < Numeric
|
|
3886
3920
|
end
|
3887
3921
|
|
3888
3922
|
context = define_context(num_context)
|
3889
|
-
inexact = true
|
3890
3923
|
rounding ||= context.rounding
|
3891
3924
|
output_rounding ||= rounding
|
3892
3925
|
|
@@ -3937,7 +3970,7 @@ class Num < Numeric
|
|
3937
3970
|
formatter.format(self, @coeff, @exp, rounding, p, all_digits)
|
3938
3971
|
dec_pos,digits = formatter.adjusted_digits(output_rounding)
|
3939
3972
|
|
3940
|
-
ds = digits.map{|
|
3973
|
+
ds = digits.map{|digit| digit.to_s(output_radix)}.join
|
3941
3974
|
n_ds = ds.size
|
3942
3975
|
exp = dec_pos - n_ds
|
3943
3976
|
leftdigits = dec_pos
|
data/lib/flt/sugar.rb
CHANGED
data/lib/flt/support.rb
CHANGED
@@ -74,7 +74,9 @@ module Flt
|
|
74
74
|
# Number of bits in binary representation of the positive integer n, or 0 if n == 0.
|
75
75
|
def _nbits(x)
|
76
76
|
raise TypeError, "The argument to _nbits should be nonnegative." if x < 0
|
77
|
-
|
77
|
+
# Ruby 2.1 introduced Integer#bit_length
|
78
|
+
return x.bit_length if x.respond_to? :bit_length
|
79
|
+
if x <= MAXIMUM_SMALLISH_INTEGER
|
78
80
|
return 0 if x==0
|
79
81
|
x.to_s(2).length
|
80
82
|
elsif x <= NBITS_LIMIT
|
@@ -92,13 +94,14 @@ module Flt
|
|
92
94
|
end
|
93
95
|
NBITS_BLOCK = 32
|
94
96
|
NBITS_LIMIT = Math.ldexp(1,Float::MANT_DIG).to_i
|
97
|
+
MAXIMUM_SMALLISH_INTEGER = (2 << 63) - 1
|
95
98
|
|
96
99
|
# Number of base b digits in an integer
|
97
100
|
def _ndigits(x, b)
|
98
101
|
raise TypeError, "The argument to _ndigits should be nonnegative." if x < 0
|
99
102
|
return 0 unless x.is_a?(Integer)
|
100
103
|
return _nbits(x) if b==2
|
101
|
-
if x
|
104
|
+
if x <= MAXIMUM_SMALLISH_INTEGER
|
102
105
|
return 0 if x==0
|
103
106
|
x.to_s(b).length
|
104
107
|
elsif x <= NDIGITS_LIMIT
|
@@ -115,7 +115,7 @@ module Flt
|
|
115
115
|
end
|
116
116
|
|
117
117
|
def self.[](*args)
|
118
|
-
new
|
118
|
+
new(*args)
|
119
119
|
end
|
120
120
|
|
121
121
|
# Rationalization method that finds the fraction with
|
@@ -129,8 +129,8 @@ module Flt
|
|
129
129
|
|
130
130
|
# This algorithm is derived from exercise 39 of 4.5.3 in
|
131
131
|
# "The Art of Computer Programming", by Donald E. Knuth.
|
132
|
-
def rationalize_Knuth(
|
133
|
-
rationalization(
|
132
|
+
def rationalize_Knuth(value)
|
133
|
+
rationalization(value) do |x, dx|
|
134
134
|
x = to_r(x)
|
135
135
|
dx = to_r(dx)
|
136
136
|
xp,xq = num_den(x-dx)
|
@@ -47,8 +47,8 @@ module Flt
|
|
47
47
|
# is the most efficient method as implemented in RPL.
|
48
48
|
# Tony Hutchins has come up with PDR6, an improvement over PDQ2;
|
49
49
|
# though benchmarking does not show any speed improvement under Ruby.
|
50
|
-
def rationalize_Horn_Hutchins(
|
51
|
-
rationalization(
|
50
|
+
def rationalize_Horn_Hutchins(value)
|
51
|
+
rationalization(value) do |x, dx|
|
52
52
|
a,b = num_den(dx)
|
53
53
|
n,d = num_den(x)
|
54
54
|
pc,ce = n,-d
|
@@ -76,8 +76,8 @@ module Flt
|
|
76
76
|
# less accurate. We can achieve perfect accuracy as the other methods by doing the
|
77
77
|
# substraction and addition with rationals, but then this method becomes less efficient than
|
78
78
|
# the others for a low number of iterations (low precision required).
|
79
|
-
def rationalize_Knuth_Goizueta(
|
80
|
-
rationalization(
|
79
|
+
def rationalize_Knuth_Goizueta(value)
|
80
|
+
rationalization(value) do |x, dx|
|
81
81
|
x = to_r(x)
|
82
82
|
dx = to_r(dx)
|
83
83
|
xp,xq = num_den(x-dx)
|
@@ -110,8 +110,8 @@ module Flt
|
|
110
110
|
|
111
111
|
# La siguiente variante realiza una iteración menos si xq<xp y una iteración más
|
112
112
|
# si xq>xp.
|
113
|
-
def rationalize_Knuth_Goizueta_b(
|
114
|
-
rationalization(
|
113
|
+
def rationalize_Knuth_Goizueta_b(value)
|
114
|
+
rationalization(value) do |x, dx|
|
115
115
|
x = to_r(x)
|
116
116
|
dx = to_r(dx)
|
117
117
|
xq,xp = num_den(x-dx)
|