nio 0.2.0 → 0.2.1
Sign up to get free protection for your applications and to get access to all the features.
- data/History.txt +16 -4
- data/lib/nio/flttol.rb +5 -2
- data/lib/nio/fmt.rb +19 -8
- data/lib/nio/repdec.rb +17 -6
- data/lib/nio/version.rb +1 -1
- data/test/test_fmt.rb +4 -1
- metadata +2 -2
data/History.txt
CHANGED
@@ -1,5 +1,17 @@
|
|
1
|
-
== 0.2.
|
2
|
-
|
3
|
-
*
|
1
|
+
== 0.2.1 2007-12-15
|
2
|
+
|
3
|
+
* Minor enhancements
|
4
|
+
- The RepDec maximum number of digits can now be changed, and the default
|
5
|
+
value has been incremented to 5000 digits (was 2048). With the new value
|
6
|
+
the minimum value of a IEEE 754 extended number can now be shown as
|
7
|
+
different from zero.
|
8
|
+
- Performance optimizations in RepDec#setQ
|
9
|
+
* Bug corrections
|
10
|
+
- Fixed a problem in the formatted output of BigDecimals which affected large numbers.
|
11
|
+
- Fix minor problem with nextfloat
|
12
|
+
|
13
|
+
== 0.2.0 2007-09-22
|
14
|
+
|
15
|
+
* Initial release
|
4
16
|
- The Nio library has been extracted from and old project
|
5
|
-
and
|
17
|
+
and packaged as a Gem.
|
data/lib/nio/flttol.rb
CHANGED
@@ -26,10 +26,13 @@ class Float
|
|
26
26
|
|
27
27
|
x = 1.0
|
28
28
|
_bits_ = 0
|
29
|
-
|
29
|
+
while 1!=x+1
|
30
30
|
_bits_ += 1
|
31
31
|
x /= 2
|
32
|
-
end
|
32
|
+
end
|
33
|
+
if ((1.0+2*x)-1.0)>2*x
|
34
|
+
_bits_ -= 1
|
35
|
+
end
|
33
36
|
|
34
37
|
# Number of RADIX-base digits of precision in a Float
|
35
38
|
MANT_DIG = _bits_
|
data/lib/nio/fmt.rb
CHANGED
@@ -522,11 +522,14 @@ module Nio
|
|
522
522
|
# - <tt>:round</tt> rounding mode applied to conversions
|
523
523
|
# (this is relevant for both input and output). It must be one of:
|
524
524
|
# [<tt>:inf</tt>]
|
525
|
-
# rounds
|
525
|
+
# rounds to nearest with ties toward infinite;
|
526
|
+
# 1.5 is rounded to 2, -1.5 to -2
|
526
527
|
# [<tt>:zero</tt>]
|
527
|
-
# rounds
|
528
|
+
# rounds to nearest with ties toward zero;
|
529
|
+
# 1.5 is rounded to 1, -1.5 to 2
|
528
530
|
# [<tt>:even</tt>]
|
529
|
-
# rounds to the nearest
|
531
|
+
# rounds to the nearest with ties toward an even digit;
|
532
|
+
# 1.5 rounds to 2, 2.5 to 2
|
530
533
|
# - <tt>:approx</tt> approximate mode
|
531
534
|
# [<tt>:only_sig</tt>]
|
532
535
|
# (the default) treats the value as an approximation and only
|
@@ -1263,8 +1266,7 @@ module Nio
|
|
1263
1266
|
end
|
1264
1267
|
|
1265
1268
|
def ratio_float(u,v,k,round_mode,beta=Float::RADIX,n=Float::MANT_DIG)
|
1266
|
-
q = u.
|
1267
|
-
r = u-q*v
|
1269
|
+
q,r = u.divmod(v)
|
1268
1270
|
v_r = v-r
|
1269
1271
|
z = Math.ldexp(q,k)
|
1270
1272
|
if r<v_r
|
@@ -1278,14 +1280,20 @@ module Nio
|
|
1278
1280
|
end
|
1279
1281
|
end
|
1280
1282
|
|
1283
|
+
# valid only for non-negative x
|
1281
1284
|
def nextfloat(x)
|
1282
1285
|
f,e = Math.frexp(x)
|
1283
1286
|
e = Float::MIN_EXP if f==0
|
1284
1287
|
e = [Float::MIN_EXP,e].max
|
1285
1288
|
dx = Math.ldexp(1,e-Float::MANT_DIG) #Math.ldexp(Math.ldexp(1.0,-Float::MANT_DIG),e)
|
1286
|
-
|
1289
|
+
if f==(1.0 - Math.ldexp(1,-Float::MANT_DIG))
|
1290
|
+
x + dx*2
|
1291
|
+
else
|
1292
|
+
x + dx
|
1293
|
+
end
|
1287
1294
|
end
|
1288
1295
|
|
1296
|
+
# valid only for non-negative x
|
1289
1297
|
def prevfloat(x)
|
1290
1298
|
f,e = Math.frexp(x)
|
1291
1299
|
e = Float::MIN_EXP if f==0
|
@@ -1316,7 +1324,8 @@ module Nio
|
|
1316
1324
|
roundh = true
|
1317
1325
|
else
|
1318
1326
|
# here we don't assume any rounding in the floating point numbers
|
1319
|
-
# the result is valid for any rounding
|
1327
|
+
# the result is valid for any rounding but may produce more digits
|
1328
|
+
# than stricly necessary for specifica rounding modes.
|
1320
1329
|
roundl = false
|
1321
1330
|
roundh = false
|
1322
1331
|
end
|
@@ -1444,7 +1453,8 @@ module Nio
|
|
1444
1453
|
roundh = true
|
1445
1454
|
else
|
1446
1455
|
# here we don't assume any rounding in the floating point numbers
|
1447
|
-
# the result is valid for any rounding
|
1456
|
+
# the result is valid for any rounding but may produce more digits
|
1457
|
+
# than stricly necessary for specifica rounding modes.
|
1448
1458
|
roundl = false
|
1449
1459
|
roundh = false
|
1450
1460
|
end
|
@@ -1831,6 +1841,7 @@ class BigDecimal
|
|
1831
1841
|
dec_pos += exp
|
1832
1842
|
neutral.set sign, txt, dec_pos, nil, fmt.get_base_digits(10), true, fmt.get_round
|
1833
1843
|
|
1844
|
+
converted = true
|
1834
1845
|
end
|
1835
1846
|
end
|
1836
1847
|
if !converted
|
data/lib/nio/repdec.rb
CHANGED
@@ -74,7 +74,7 @@ module Nio
|
|
74
74
|
@digits = DigitsDef.new
|
75
75
|
@digits_defined = false
|
76
76
|
|
77
|
-
@max_d =
|
77
|
+
@max_d = 5000
|
78
78
|
|
79
79
|
end
|
80
80
|
attr_accessor :begin_rep, :end_rep, :auto_rep, :dec_sep, :grp_sep, :grp, :max_d
|
@@ -379,6 +379,17 @@ module Nio
|
|
379
379
|
# return !(self==c);
|
380
380
|
#end
|
381
381
|
|
382
|
+
# Change the maximum number of digits that RepDec objects
|
383
|
+
# can handle.
|
384
|
+
def RepDec.maximum_number_of_digits=(n)
|
385
|
+
@max_d = [n,2048].max
|
386
|
+
end
|
387
|
+
# Return the maximum number of digits that RepDec objects
|
388
|
+
# can handle.
|
389
|
+
def RepDec.maximum_number_of_digits
|
390
|
+
@max_d
|
391
|
+
end
|
392
|
+
|
382
393
|
def setQ(x,y, opt=DEF_OPT)
|
383
394
|
@radix = opt.digits.radix if opt.digits_defined?
|
384
395
|
xy_sign = x==0 ? 0 : x<0 ? -1 : +1;
|
@@ -399,7 +410,7 @@ module Nio
|
|
399
410
|
return self
|
400
411
|
end
|
401
412
|
|
402
|
-
k =
|
413
|
+
k = {};
|
403
414
|
@ip = x.div(y) #x/y;
|
404
415
|
x -= @ip*y;
|
405
416
|
i = 0;
|
@@ -407,12 +418,12 @@ module Nio
|
|
407
418
|
|
408
419
|
max_d = opt.max_d
|
409
420
|
while x>0 && @rep_i==nil && (max_d<=0 || i<max_d)
|
410
|
-
@rep_i = k
|
421
|
+
@rep_i = k[x]
|
411
422
|
if @rep_i.nil? then
|
412
|
-
k
|
423
|
+
k[x] = i;
|
413
424
|
x *= @radix
|
414
|
-
|
415
|
-
|
425
|
+
d,x = x.divmod(y)
|
426
|
+
@d.push d
|
416
427
|
i += 1;
|
417
428
|
end
|
418
429
|
end
|
data/lib/nio/version.rb
CHANGED
data/test/test_fmt.rb
CHANGED
@@ -152,7 +152,10 @@ class TestFmt < Test::Unit::TestCase
|
|
152
152
|
x = BigDecimal(x.to_s)
|
153
153
|
assert_equal x,BigDecimal.nio_read(x.nio_write(fmt),fmt)
|
154
154
|
end
|
155
|
-
|
155
|
+
assert_equal "1E500",BigDec('1E500').nio_write
|
156
|
+
assert_equal "1E-500",BigDec('1E-500').nio_write
|
157
|
+
assert_equal "-1E500",BigDec('-1E500').nio_write
|
158
|
+
assert_equal "-1E-500",BigDec('-1E-500').nio_write
|
156
159
|
end
|
157
160
|
|
158
161
|
def test_Rational
|
metadata
CHANGED