flt 1.4.7 → 1.5.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- 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
|