flt 1.4.7 → 1.5.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/History.txt +5 -0
- data/lib/flt/num.rb +39 -11
- data/lib/flt/version.rb +1 -1
- data/test/test_normalized.rb +67 -0
- metadata +4 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 84bc5146381ff127868320f22bb421bc8d1ad16a
|
4
|
+
data.tar.gz: 66f6fc689cb2297638127a1217fe4ee3e19b8aa7
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 10bc77b0f1ab349a36abcf4512aa9a16aecc886e4da95ec2c6edc180c1c00b74113f98d2673f1c2aaae3cf7856b1be8291be0e59f2e9082f541cceae8c5f2130
|
7
|
+
data.tar.gz: 1279653a5e9471834c3f48819db261bcb5cbf4e749ded3cc0d039a3e4bb3572eb20323b90fb0058739630b6bf8cd6eb36a6132713960da8f7b6c2919fca79122
|
data/History.txt
CHANGED
data/lib/flt/num.rb
CHANGED
@@ -422,6 +422,7 @@ class Num < Numeric
|
|
422
422
|
# taken as emin and emax=1-emin. Such limits comply with IEEE 754-2008
|
423
423
|
# * :capitals : (true or false) to use capitals in text representations
|
424
424
|
# * :clamp : (true or false) enables clamping
|
425
|
+
# * :normalized : (true or false) normalizes all results
|
425
426
|
#
|
426
427
|
# See also the context constructor method Flt::Num.Context().
|
427
428
|
def initialize(num_class, *options)
|
@@ -441,6 +442,7 @@ class Num < Numeric
|
|
441
442
|
@coercible_type_handlers = num_class.base_coercible_types.dup
|
442
443
|
@conversions = num_class.base_conversions.dup
|
443
444
|
@angle = :rad # angular units: :rad (radians) / :deg (degrees) / :grad (gradians)
|
445
|
+
@normalized = false
|
444
446
|
end
|
445
447
|
assign options.first
|
446
448
|
|
@@ -515,7 +517,11 @@ class Num < Numeric
|
|
515
517
|
@num_class.int_div_radix_power(x,n)
|
516
518
|
end
|
517
519
|
|
518
|
-
attr_accessor :rounding, :emin, :emax, :flags, :traps, :ignored_flags, :capitals, :clamp, :angle
|
520
|
+
attr_accessor :rounding, :emin, :emax, :flags, :traps, :ignored_flags, :capitals, :clamp, :angle, :normalized
|
521
|
+
|
522
|
+
def normalized?
|
523
|
+
normalized
|
524
|
+
end
|
519
525
|
|
520
526
|
# TODO: consider the convenience of adding accessors of this kind:
|
521
527
|
# def rounding(new_rounding=nil)
|
@@ -630,9 +636,10 @@ class Num < Numeric
|
|
630
636
|
@emin = options[:emin] unless options[:emin].nil?
|
631
637
|
@emax = options[:emax] unless options[:emax].nil?
|
632
638
|
@capitals = options[:capitals ] unless options[:capitals ].nil?
|
633
|
-
@clamp = options[:clamp
|
634
|
-
@exact = options[:exact
|
635
|
-
@angle = options[:angle
|
639
|
+
@clamp = options[:clamp] unless options[:clamp].nil?
|
640
|
+
@exact = options[:exact] unless options[:exact].nil?
|
641
|
+
@angle = options[:angle] unless options[:angle].nil?
|
642
|
+
@normalized = options[:normalized] unless options[:normalized].nil?
|
636
643
|
update_precision
|
637
644
|
if options[:extra_precision] && !@exact
|
638
645
|
@precision += options[:extra_precision]
|
@@ -660,6 +667,7 @@ class Num < Numeric
|
|
660
667
|
@coercible_type_handlers = other.coercible_type_handlers.dup
|
661
668
|
@conversions = other.conversions.dup
|
662
669
|
@angle = other.angle
|
670
|
+
@normalized = other.normalized
|
663
671
|
end
|
664
672
|
|
665
673
|
def dup
|
@@ -1477,18 +1485,19 @@ class Num < Numeric
|
|
1477
1485
|
# * :base is the numeric base of the input, 10 by default.
|
1478
1486
|
def initialize(*args)
|
1479
1487
|
options = args.pop if args.last.is_a?(Hash)
|
1480
|
-
|
1481
|
-
context
|
1488
|
+
options ||= {}
|
1489
|
+
context = args.pop if args.size > 0 && (args.last.kind_of?(ContextBase) || args.last.nil?)
|
1490
|
+
context ||= options.delete(:context)
|
1482
1491
|
mode = args.pop if args.last.is_a?(Symbol) && ![:inf, :nan, :snan].include?(args.last)
|
1483
1492
|
args = args.first if args.size==1 && args.first.is_a?(Array)
|
1484
|
-
if args.empty? && options
|
1493
|
+
if args.empty? && !options.empty?
|
1485
1494
|
args = [options.delete(:sign)||+1,
|
1486
1495
|
options.delete(:coefficient) || 0,
|
1487
1496
|
options.delete(:exponent) || 0]
|
1488
1497
|
end
|
1489
|
-
mode ||= options
|
1490
|
-
base =
|
1491
|
-
context = options if context.nil? &&
|
1498
|
+
mode ||= options.delete(:mode)
|
1499
|
+
base = options.delete(:base)
|
1500
|
+
context = options if context.nil? && !options.empty?
|
1492
1501
|
context = define_context(context)
|
1493
1502
|
|
1494
1503
|
case args.size
|
@@ -3593,6 +3602,26 @@ class Num < Numeric
|
|
3593
3602
|
return ans
|
3594
3603
|
end
|
3595
3604
|
|
3605
|
+
if context.normalized?
|
3606
|
+
exp = @exp
|
3607
|
+
coeff = @coeff
|
3608
|
+
if self_is_subnormal
|
3609
|
+
if exp > context.etiny
|
3610
|
+
coeff = num_class.int_mult_radix_power(coeff, exp - context.etiny)
|
3611
|
+
exp = context.etiny
|
3612
|
+
end
|
3613
|
+
else
|
3614
|
+
min_normal_coeff = context.minimum_normalized_coefficient
|
3615
|
+
while coeff < min_normal_coeff
|
3616
|
+
coeff = num_class.int_mult_radix_power(coeff, 1)
|
3617
|
+
exp -= 1
|
3618
|
+
end
|
3619
|
+
end
|
3620
|
+
if exp != @exp || coeff != @coeff
|
3621
|
+
return Num(@sign, coeff, exp)
|
3622
|
+
end
|
3623
|
+
end
|
3624
|
+
|
3596
3625
|
if context.clamp? && @exp>etop
|
3597
3626
|
context.exception Clamped
|
3598
3627
|
self_padded = num_class.int_mult_radix_power(@coeff, @exp-etop)
|
@@ -3600,7 +3629,6 @@ class Num < Numeric
|
|
3600
3629
|
end
|
3601
3630
|
|
3602
3631
|
return Num(self)
|
3603
|
-
|
3604
3632
|
end
|
3605
3633
|
|
3606
3634
|
# adjust payload of a NaN to the context
|
data/lib/flt/version.rb
CHANGED
@@ -0,0 +1,67 @@
|
|
1
|
+
require File.expand_path(File.join(File.dirname(__FILE__),'helper.rb'))
|
2
|
+
|
3
|
+
|
4
|
+
class TestNormalized < Test::Unit::TestCase
|
5
|
+
|
6
|
+
include Flt
|
7
|
+
|
8
|
+
def setup
|
9
|
+
initialize_context
|
10
|
+
end
|
11
|
+
|
12
|
+
def test_giac_floating_point
|
13
|
+
BinNum.context.precision = 48
|
14
|
+
BinNum.context.rounding = :down
|
15
|
+
BinNum.context.normalized = true
|
16
|
+
x = (BinNum(4)/3-1)*3 - 1
|
17
|
+
assert_equal [-1, 140737488355328, -93], x.split
|
18
|
+
|
19
|
+
x = BinNum(11)/15
|
20
|
+
assert_equal [1, 206414982921147, -48], x.split
|
21
|
+
x *= BinNum('1E308')
|
22
|
+
assert_equal [1, 229644291251027, 975], x.split
|
23
|
+
end
|
24
|
+
|
25
|
+
def test_normalized_context
|
26
|
+
refute DecNum.context.normalized?
|
27
|
+
DecNum.context(normalized: true) do
|
28
|
+
assert DecNum.context.normalized?
|
29
|
+
assert_equal [1, 1, -1], DecNum('0.1').split
|
30
|
+
assert_equal [1, 100000000, -9], (+DecNum('0.1')).split
|
31
|
+
assert_equal [1, 100000000, -9], (DecNum('0.1')+0).split
|
32
|
+
assert_equal [1, 100000000, -9], (DecNum('0.1')/1).split
|
33
|
+
end
|
34
|
+
refute DecNum.context.normalized?
|
35
|
+
assert_equal [1, 1, -1], DecNum('0.1').split
|
36
|
+
assert_equal [1, 1, -1], (+DecNum('0.1')).split
|
37
|
+
assert_equal [1, 1, -1], (DecNum('0.1')+0).split
|
38
|
+
assert_equal [1, 1, -1], (DecNum('0.1')/1).split
|
39
|
+
context = DecNum.context(normalized: true)
|
40
|
+
assert context.normalized?
|
41
|
+
assert_equal [1, 100000000, -9], context.plus(DecNum('0.1')).split
|
42
|
+
assert_equal [1, 100000000, -9], context.add(DecNum('0.1'), 0).split
|
43
|
+
assert_equal [1, 100000000, -9], context.divide(DecNum('0.1'), 1).split
|
44
|
+
refute DecNum.context.normalized?
|
45
|
+
assert_equal [1, 1, -1], DecNum('0.1').split
|
46
|
+
assert_equal [1, 1, -1], (+DecNum('0.1')).split
|
47
|
+
assert_equal [1, 1, -1], (DecNum('0.1')+0).split
|
48
|
+
assert_equal [1, 1, -1], (DecNum('0.1')/1).split
|
49
|
+
end
|
50
|
+
|
51
|
+
def test_precision
|
52
|
+
x = (DecNum(4)/3 - 1)*3 - 1 # -1e-8
|
53
|
+
assert_equal [-1, 1, -8], x.split
|
54
|
+
|
55
|
+
DecNum.context.normalized = true
|
56
|
+
x = (DecNum(4)/3 - 1)*3 - 1 # -1.00000000e-8
|
57
|
+
assert_equal [-1, 100000000, -16], x.split
|
58
|
+
|
59
|
+
x = (BinNum(4)/3 - 1)*3 - 1 # -0x1p-52
|
60
|
+
assert_equal [-1, 1, -52], x.split
|
61
|
+
|
62
|
+
BinNum.context.normalized = true
|
63
|
+
x = (BinNum(4)/3 - 1)*3 - 1 # -0x1.0000000000000p-52
|
64
|
+
assert_equal [-1, 4503599627370496, -104], x.split
|
65
|
+
end
|
66
|
+
|
67
|
+
end
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: flt
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 1.
|
4
|
+
version: 1.5.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Javier Goizueta
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2015-04-
|
11
|
+
date: 2015-04-06 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: bundler
|
@@ -99,6 +99,7 @@ files:
|
|
99
99
|
- test/test_formatter.rb
|
100
100
|
- test/test_hex_format.rb
|
101
101
|
- test/test_multithreading.rb
|
102
|
+
- test/test_normalized.rb
|
102
103
|
- test/test_num_constructor.rb
|
103
104
|
- test/test_odd_even.rb
|
104
105
|
- test/test_rationalizer.rb
|
@@ -157,6 +158,7 @@ test_files:
|
|
157
158
|
- test/test_formatter.rb
|
158
159
|
- test/test_hex_format.rb
|
159
160
|
- test/test_multithreading.rb
|
161
|
+
- test/test_normalized.rb
|
160
162
|
- test/test_num_constructor.rb
|
161
163
|
- test/test_odd_even.rb
|
162
164
|
- test/test_rationalizer.rb
|