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 +4 -4
- data/CHANGELOG.md +7 -1
- data/CODE_OF_CONDUCT.md +0 -0
- data/README.md +5 -0
- data/lib/kgl/kmath.rb +59 -15
- data/lib/kgl/version.rb +1 -1
- metadata +2 -2
checksums.yaml
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
---
|
|
2
2
|
SHA256:
|
|
3
|
-
metadata.gz:
|
|
4
|
-
data.tar.gz:
|
|
3
|
+
metadata.gz: 89523b5350ef65694c439eca64804c5c89e2f450cd1b2fcb2fca9eaa466df07b
|
|
4
|
+
data.tar.gz: 3c104f76f6ccf3b2283b22162b04ad164076953d9c174e5f54156e96c55de2c0
|
|
5
5
|
SHA512:
|
|
6
|
-
metadata.gz:
|
|
7
|
-
data.tar.gz:
|
|
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
|
|
17
|
-
def
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
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
|
-
|
|
64
|
+
app.approx_reduction(dig, depth-1, org)
|
|
29
65
|
end
|
|
30
|
-
|
|
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 <
|
|
35
|
-
Rational(Math.ldexp(s,
|
|
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
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
|
+
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.
|
|
96
|
+
rubygems_version: 4.0.10
|
|
97
97
|
specification_version: 4
|
|
98
98
|
summary: A gem for personal use.
|
|
99
99
|
test_files: []
|