kgl 0.0.4 → 0.0.6

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 CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: bd117b9cbf076dbaf0e603b4bf8782c486dac9ed4ca0b8aca2b132a4c2cad9c6
4
- data.tar.gz: 277a4f5825763bda9fb3d0ffa574f218bb8d1d36d7be83a51bc8b73691ce131e
3
+ metadata.gz: 89523b5350ef65694c439eca64804c5c89e2f450cd1b2fcb2fca9eaa466df07b
4
+ data.tar.gz: 3c104f76f6ccf3b2283b22162b04ad164076953d9c174e5f54156e96c55de2c0
5
5
  SHA512:
6
- metadata.gz: 864878ddf6cc7b145fcd33fc2186babdd06bf8f3126dc662c66e746fa62346ba30b11e47cfcb504975aa1367115563a5dfc10adc2e1a17f70ff01b5d6e98e750
7
- data.tar.gz: d191f15fa644cda1a619094901de5fab04239ec6d4d983fd20c06b43f6f61b9ec11877aa0bb3003f0c122b80306b47861811380d87dc4405233b8d00309d1a41
6
+ metadata.gz: 706e175a11fc0bcb0d7162e97452d19bbc4a86155d6301fa98d320dd15a98ad52fcfb9dcde08b61caa602d75e25ad27e837cc9246f09b0506fe642878eb530cb
7
+ data.tar.gz: f8aa095bd04e2a05d464c72cf22a60eb19637d98342f146e0bffb51c8945314afc9e84bce9406d0286311d6228634f1092c85e480febdd43bd05cca5aeba6c1d
data/CHANGELOG.md CHANGED
@@ -1,7 +1,13 @@
1
1
  # Change Log
2
2
 
3
+ ## 0.0.6 2026/04/13
4
+ - Add `Rational#approx_reduction` and refine `Float#to_r` by using this method.
5
+
6
+ ## 0.0.5 2026/04/12
7
+ - `Float#to_r` and `Float#to_r_exact` raise `FloatDomainError` when `self` is not finite.
8
+
3
9
  ## 0.0.4 2026/04/02
4
- - Add `Float#to_r_exact` that returns exact Rational value expressed by self.
10
+ - Add `Float#to_r_exact` that returns exact Rational value expressed by `self`.
5
11
 
6
12
  ## 0.0.3 2024/12/03
7
13
  - Add `Kgl.#rpw`.
data/CODE_OF_CONDUCT.md CHANGED
File without changes
data/README.md CHANGED
@@ -32,6 +32,11 @@ Returns `Rational` value of `self`.
32
32
  Returns exact `Rational` value of `self`, that may not be desirable for usual usage.
33
33
  For instance, (0.1).to_r_exact returns (3602879701896397/36028797018963968) while (0.1).to_r returns (1/10).
34
34
 
35
+ ### `Rational#approx_reduction(dig=8, depth=16, org=self)`
36
+ Returns aprroximately same as `org` `Rational` value with smaller denominator.
37
+ This method search for changing numerator and denominator of `self` by within `1<<dig`.
38
+ `depth` is the maximum recursive depth of this method.
39
+
35
40
  ### `Integer#to_msm(fps=59.94)`
36
41
  Returns `"[minutes]:[seconds].[milliseconds]"` which corresponds to `self` frames.
37
42
  The submilliseconds will be rounded. `fps` is frames per second.
data/lib/kgl/kmath.rb CHANGED
@@ -13,26 +13,70 @@ module Math
13
13
  end
14
14
  end
15
15
 
16
- class Float
17
- def to_r
18
- str = self.to_s
19
- (decimal, power) = str.split(/e/)
20
- (integer, decimal) = decimal.split(/\./)
21
- length = decimal.length
22
- numerator = integer.to_i*10**length+decimal.to_i
23
- denominator = 10**length
24
- power = power.to_i
25
- if power > 0
26
- numerator *= 10**power
16
+ class Rational
17
+ protected def kglsize
18
+ [self.numerator.abs, self.denominator].min
19
+ end
20
+ protected def kgldiff(other)
21
+ (self-other).abs
22
+ end
23
+ def approx_reduction(dig=8, depth=16, org=self)
24
+ return self if depth <= 0
25
+ self.to_f rescue return self
26
+ ret, app = self, self
27
+ if (1<<(dig*2)) < self.kglsize
28
+ 1.upto(1<<dig) do |i|
29
+ [[0, i], [0, -i], [i, 0], [-i, 0]].each do |n, d|
30
+ q = Rational(numerator+n, denominator+d)
31
+ if q.kglsize < ret.kglsize
32
+ if q.kgldiff(org) <= ret.kgldiff(org)
33
+ ret = q
34
+ elsif q.kglsize < app.kglsize
35
+ app = q
36
+ end
37
+ end
38
+ end
39
+ 1.upto(i) do |j|
40
+ [[j, i], [j, -i], [-j, i], [-j, -i]].each do |a, b|
41
+ q = Rational(numerator+a, denominator+b)
42
+ if q.kglsize < ret.kglsize
43
+ if q.kgldiff(org) <= ret.kgldiff(org)
44
+ ret = q
45
+ elsif q.kglsize < app.kglsize
46
+ app = q
47
+ end
48
+ end
49
+ q = Rational(numerator+b, denominator+a)
50
+ if q.kglsize < ret.kglsize
51
+ if q.kgldiff(org) <= ret.kgldiff(org)
52
+ ret = q
53
+ elsif q.kglsize < app.kglsize
54
+ app = q
55
+ end
56
+ end
57
+ end
58
+ end
59
+ end
60
+ end
61
+ if ret.kglsize < self.kglsize
62
+ ret.approx_reduction(dig, depth-1, org)
27
63
  else
28
- denominator *= 10**(-power)
64
+ app.approx_reduction(dig, depth-1, org)
29
65
  end
30
- return Rational(numerator, denominator)
66
+ end
67
+ end
68
+
69
+ class Float
70
+ def to_r(th=8)
71
+ r = self.to_r_exact
72
+ q = r.approx_reduction
73
+ q.to_f == self ? q : r
31
74
  end
32
75
  def to_r_exact
76
+ raise FloatDomainError, self.inspect unless self.finite?
33
77
  s, e = Math.frexp(self)
34
- if e < 53
35
- Rational(Math.ldexp(s, 53).to_i, 1<<(53-e))
78
+ if e < MANT_DIG
79
+ Rational(Math.ldexp(s, MANT_DIG).to_i, 1<<(MANT_DIG-e))
36
80
  else
37
81
  Rational(self.to_i, 1)
38
82
  end
data/lib/kgl/version.rb CHANGED
@@ -1,3 +1,3 @@
1
1
  module Kgl
2
- VERSION = '0.0.4'
2
+ VERSION = '0.0.6'
3
3
  end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: kgl
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.0.4
4
+ version: 0.0.6
5
5
  platform: ruby
6
6
  authors:
7
7
  - KAZOON
@@ -93,7 +93,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
93
93
  - !ruby/object:Gem::Version
94
94
  version: '0'
95
95
  requirements: []
96
- rubygems_version: 4.0.9
96
+ rubygems_version: 4.0.10
97
97
  specification_version: 4
98
98
  summary: A gem for personal use.
99
99
  test_files: []