flt 1.4.1 → 1.4.2
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 +4 -0
- data/lib/flt/dec_num.rb +1 -1
- data/lib/flt/num.rb +55 -35
- data/lib/flt/support/rationalizer_extra.rb +2 -2
- data/lib/flt/version.rb +1 -1
- data/test/test_num_constructor.rb +2 -2
- metadata +2 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: d25ad2ad4f96968dfa38899ca80fbc6c42f2693e
|
4
|
+
data.tar.gz: 1dcceec01b59a5601054eaa5acc6ec6974bd5c75
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: e997aa12648c1c49d0e56dadb521d338e55c6fcd2082a4e9d46a7c103688950190ecb95bc36b285d4d1d5cfb6d348e7092dec5183d0c13476112b01390475d22
|
7
|
+
data.tar.gz: 28173c3cbd4fb78f986251ddfa7c8528dce13fb8b90e3069822c11a3c35902521c4b8b0eda68bf32d18b3c67c56abc86b2212b7b1b258d86d1e9782b31f5e649
|
data/History.txt
CHANGED
data/lib/flt/dec_num.rb
CHANGED
@@ -104,7 +104,7 @@ class DecNum < Num
|
|
104
104
|
# DecNum('0.1000') # -> 0.1000
|
105
105
|
# DecNum('0.12345') # -> 0.12345
|
106
106
|
# DecNum('1.2345E-1') # -> 0.12345
|
107
|
-
# DecNum('0.1000', :short) # -> 0.
|
107
|
+
# DecNum('0.1000', :short) # -> 0.1
|
108
108
|
# DecNum('0.1000',:fixed, :precision=>20) # -> 0.10000000000000000000
|
109
109
|
# DecNum('0.12345',:fixed, :precision=>20) # -> 0.12345000000000000000
|
110
110
|
# DecNum('0.100110E3', :base=>2) # -> 4.8
|
data/lib/flt/num.rb
CHANGED
@@ -1,6 +1,37 @@
|
|
1
1
|
# Base classes for floating-point numbers and contexts.
|
2
2
|
|
3
3
|
#--
|
4
|
+
# TODO: selecting the kind of ulp is awkward; consider one of these options:
|
5
|
+
# * don't support variant ulps; always use Muller's ulp
|
6
|
+
# * use an options hash for the kind of ulp parameter
|
7
|
+
# * keep the kind of ulp in the context
|
8
|
+
# also, note that Tolerance uses only the Muller king of ulp.
|
9
|
+
# TODO: move the exception classes from Flt::Num to Flt ? move also Flt::Num::ContextBas to Flt ?
|
10
|
+
# TODO: find better name for :all_digits (:preserve_precision, :mantain_precision, ...) ?
|
11
|
+
# TODO: should the context determine the mode for cross-base literal-to-Num conversion (:free, :fixed)?
|
12
|
+
# BinNum.context.input = :fixed; x = BinNum('0.1')
|
13
|
+
#++
|
14
|
+
|
15
|
+
require 'flt/support'
|
16
|
+
require 'flt/support/flag_values'
|
17
|
+
require 'flt/support/reader'
|
18
|
+
require 'flt/support/formatter'
|
19
|
+
require 'flt/support/rationalizer'
|
20
|
+
|
21
|
+
require 'bigdecimal'
|
22
|
+
require 'forwardable'
|
23
|
+
require 'rational'
|
24
|
+
require 'monitor'
|
25
|
+
require 'ostruct'
|
26
|
+
|
27
|
+
module Flt
|
28
|
+
|
29
|
+
# Generic radix arbitrary-precision, floating-point numbers. This is a base class for
|
30
|
+
# floating point types of specific radix.
|
31
|
+
#
|
32
|
+
# The implementation of floating-point arithmetic is largely based on the Decimal module of Python,
|
33
|
+
# written by Eric Price, Facundo Batista, Raymond Hettinger, Aahz and Tim Peters.
|
34
|
+
#
|
4
35
|
# =Notes on the representation of Flt::Num numbers.
|
5
36
|
#
|
6
37
|
# * @sign is +1 for plus and -1 for minus
|
@@ -8,7 +39,7 @@
|
|
8
39
|
# * @exp is the exponent to be applied to @coeff as an integer or one of :inf, :nan, :snan for special values
|
9
40
|
#
|
10
41
|
# The value represented is @sign*@coeff*b**@exp with b = num_class.radix the radix for the the Num-derived class.
|
11
|
-
|
42
|
+
#
|
12
43
|
# The original Python Decimal representation has these slots:
|
13
44
|
# * _sign is 1 for minus, 0 for plus
|
14
45
|
# * _int is the integral significand as a string of digits (leading zeroes are not kept)
|
@@ -111,39 +142,7 @@
|
|
111
142
|
#
|
112
143
|
# The known or 'coercible' types for DecNum are initially Integer and Rational, but this can be extended to
|
113
144
|
# other types using define_conversion_from() in a Context object.
|
114
|
-
#++
|
115
|
-
|
116
|
-
#--
|
117
|
-
# TODO: selecting the kind of ulp is awkward; consider one of these options:
|
118
|
-
# * don't support variant ulps; always use Muller's ulp
|
119
|
-
# * use an options hash for the kind of ulp parameter
|
120
|
-
# * keep the kind of ulp in the context
|
121
|
-
# also, note that Tolerance uses only the Muller king of ulp.
|
122
|
-
# TODO: move the exception classes from Flt::Num to Flt ? move also Flt::Num::ContextBas to Flt ?
|
123
|
-
# TODO: find better name for :all_digits (:preserve_precision, :mantain_precision, ...) ?
|
124
|
-
# TODO: should the context determine the mode for cross-base literal-to-Num conversion (:free, :fixed)?
|
125
|
-
# BinNum.context.input = :fixed; x = BinNum('0.1')
|
126
|
-
#++
|
127
|
-
|
128
|
-
require 'flt/support'
|
129
|
-
require 'flt/support/flag_values'
|
130
|
-
require 'flt/support/reader'
|
131
|
-
require 'flt/support/formatter'
|
132
|
-
require 'flt/support/rationalizer'
|
133
|
-
|
134
|
-
require 'bigdecimal'
|
135
|
-
require 'forwardable'
|
136
|
-
require 'rational'
|
137
|
-
require 'monitor'
|
138
|
-
require 'ostruct'
|
139
|
-
|
140
|
-
module Flt
|
141
|
-
|
142
|
-
# Generic radix arbitrary-precision, floating-point numbers. This is a base class for
|
143
|
-
# floating point types of specific radix.
|
144
145
|
#
|
145
|
-
# The implementation of floating-point arithmetic is largely based on the Decimal module of Python,
|
146
|
-
# written by Eric Price, Facundo Batista, Raymond Hettinger, Aahz and Tim Peters.
|
147
146
|
class Num < Numeric
|
148
147
|
|
149
148
|
extend Support # allows use of unqualified FlagValues(), Flags(), etc.
|
@@ -1446,7 +1445,13 @@ class Num < Numeric
|
|
1446
1445
|
# meaning here that if the digit is changed and the value converted back to a literal of the same base and
|
1447
1446
|
# precision, the original literal will not be obtained.
|
1448
1447
|
# * :short is a variation of :free in which only the minimun number of digits that are necessary to
|
1449
|
-
# produce the original literal when the value is converted back with the same original precision
|
1448
|
+
# produce the original literal when the value is converted back with the same original precision;
|
1449
|
+
# namely, given an input in base b1, its :short representation in base 2 is the shortest number in base b2
|
1450
|
+
# such that when converted back to base b2 with the same precision that the input had, the result is identical
|
1451
|
+
# to the input:
|
1452
|
+
# short = Num[b2].new(input, :short, base: b1)
|
1453
|
+
# Num[b1].context.precision = precision_of_inpu
|
1454
|
+
# Num[b1].new(short.to_s(base: b2), :fixed, base: b2)) == Num[b1].new(input, :free, base: b1)
|
1450
1455
|
# * :fixed will round and normalize the value to the precision specified by the context (normalize meaning
|
1451
1456
|
# that exaclty the number of digits specified by the precision will be generated, even if the original
|
1452
1457
|
# literal has fewer digits.) This may fail returning NaN (and raising Inexact) if the context precision is
|
@@ -1544,8 +1549,23 @@ class Num < Numeric
|
|
1544
1549
|
mode ||= :free
|
1545
1550
|
end
|
1546
1551
|
|
1547
|
-
if
|
1552
|
+
if mode == :free && base == num_class.radix
|
1548
1553
|
# simple case, the job is already done
|
1554
|
+
#
|
1555
|
+
# :free mode with same base must not be handled by the Reader;
|
1556
|
+
# note that if we used the Reader for the same base case in :free mode,
|
1557
|
+
# an extra 'significative' digit would be added, because that digit
|
1558
|
+
# is significative in the sense that (under non-directed rounding,
|
1559
|
+
# and with the significance interpretation of Reader wit the all-digits option)
|
1560
|
+
# it's not free to take any value without affecting the value of
|
1561
|
+
# the other digits: e.g. input: '0.1', the result of :free
|
1562
|
+
# conversion with the Reader is '0.10' because de last digit is not free;
|
1563
|
+
# if it was 9 for example the actual value would round to '0.2' with the input
|
1564
|
+
# precision given here.
|
1565
|
+
#
|
1566
|
+
# On the other hand, :short, should be handled by the Reader even when
|
1567
|
+
# the input and output bases are the same because we want to find the shortest
|
1568
|
+
# number that can be converted back to the input with the same input precision.
|
1549
1569
|
else
|
1550
1570
|
rounding = context.rounding
|
1551
1571
|
reader = Support::Reader.new(:mode=>mode)
|
@@ -1,9 +1,9 @@
|
|
1
|
-
# Some rationalization algorithms currently not being used
|
2
|
-
|
3
1
|
module Flt
|
4
2
|
module Support
|
5
3
|
|
6
4
|
class Rationalizer
|
5
|
+
# Some rationalization algorithms currently not being used
|
6
|
+
|
7
7
|
|
8
8
|
# Simple Rationalization by Joe Horn
|
9
9
|
def rationalize_Horn_simple(x, smallest_denominator = false)
|
data/lib/flt/version.rb
CHANGED
@@ -41,13 +41,13 @@ class TestNumConstructor < Test::Unit::TestCase
|
|
41
41
|
assert_equal [1, 1, -1], DecNum('0.1', :free).split
|
42
42
|
assert_equal [1, 1000, -4], DecNum('0.1000', :free).split
|
43
43
|
assert_equal [1, 1, -1], DecNum('0.1',:short).split
|
44
|
-
assert_equal [1,
|
44
|
+
assert_equal [1, 1, -1], DecNum('0.1000',:short).split
|
45
45
|
|
46
46
|
assert_equal [1, 1, -3], BinNum('0.1E-2', :free, :base=>2).split
|
47
47
|
assert_equal [1, 1, -1], BinNum('0.1', :free, :base=>2).split
|
48
48
|
assert_equal [1, 8, -4], BinNum('0.1000', :free, :base=>2).split
|
49
49
|
assert_equal [1, 1, -1], BinNum('0.1',:short, :base=>2).split
|
50
|
-
assert_equal [1,
|
50
|
+
assert_equal [1, 1, -1], BinNum('0.1000',:short, :base=>2).split
|
51
51
|
end
|
52
52
|
|
53
53
|
def test_literal_free_base
|
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.
|
4
|
+
version: 1.4.2
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Javier Goizueta
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2014-10-
|
11
|
+
date: 2014-10-30 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: bundler
|