vector_number 0.4.3 → 0.6.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/README.md +47 -22
- data/doc/vector_space.svg +94 -0
- data/lib/vector_number/comparing.rb +103 -107
- data/lib/vector_number/converting.rb +137 -147
- data/lib/vector_number/enumerating.rb +94 -108
- data/lib/vector_number/math_converting.rb +113 -109
- data/lib/vector_number/mathing.rb +305 -312
- data/lib/vector_number/numeric_refinements.rb +7 -0
- data/lib/vector_number/querying.rb +136 -136
- data/lib/vector_number/special_unit.rb +36 -0
- data/lib/vector_number/stringifying.rb +89 -80
- data/lib/vector_number/version.rb +1 -1
- data/lib/vector_number.rb +155 -126
- data/sig/vector_number.rbs +141 -168
- metadata +14 -11
|
@@ -1,121 +1,125 @@
|
|
|
1
1
|
# frozen_string_literal: true
|
|
2
2
|
|
|
3
3
|
class VectorNumber
|
|
4
|
-
#
|
|
5
|
-
module MathConverting
|
|
6
|
-
# Calculate the absolute value of the vector, i.e. its length.
|
|
7
|
-
#
|
|
8
|
-
# @example
|
|
9
|
-
# VectorNumber[5.3].abs # => 5.3
|
|
10
|
-
# VectorNumber[-5.3i].magnitude # => 5.3
|
|
11
|
-
# VectorNumber[-5.3i, "i"].abs # => 5.3935146240647205
|
|
12
|
-
#
|
|
13
|
-
# @return [Float]
|
|
14
|
-
#
|
|
15
|
-
# @since 0.2.2
|
|
16
|
-
def abs
|
|
17
|
-
Math.sqrt(abs2)
|
|
18
|
-
end
|
|
4
|
+
# @group Mathematical operations
|
|
19
5
|
|
|
20
|
-
|
|
6
|
+
# Calculate the absolute value of the vector (its length).
|
|
7
|
+
#
|
|
8
|
+
# @example
|
|
9
|
+
# VectorNumber[5.3].abs # => 5.3
|
|
10
|
+
# VectorNumber[-5.3i].magnitude # => 5.3
|
|
11
|
+
# VectorNumber[-5.3i, "i"].abs # => 5.3935146240647205
|
|
12
|
+
#
|
|
13
|
+
# @return [Float]
|
|
14
|
+
#
|
|
15
|
+
# @since 0.2.2
|
|
16
|
+
def abs
|
|
17
|
+
Math.sqrt(abs2)
|
|
18
|
+
end
|
|
21
19
|
|
|
22
|
-
|
|
23
|
-
#
|
|
24
|
-
# @example
|
|
25
|
-
# VectorNumber[5.3].abs2 # => 5.3
|
|
26
|
-
# VectorNumber[-5.3i].abs2 # => 5.3
|
|
27
|
-
# VectorNumber[-5.3i, "i"].abs2 # => 29.09
|
|
28
|
-
#
|
|
29
|
-
# @return [Float]
|
|
30
|
-
#
|
|
31
|
-
# @since 0.2.2
|
|
32
|
-
def abs2
|
|
33
|
-
coefficients.sum(&:abs2)
|
|
34
|
-
end
|
|
20
|
+
alias magnitude abs
|
|
35
21
|
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
def truncate(digits = 0)
|
|
50
|
-
new { _1.truncate(digits) }
|
|
51
|
-
end
|
|
22
|
+
# Calculate the square of absolute value.
|
|
23
|
+
#
|
|
24
|
+
# @example
|
|
25
|
+
# VectorNumber[5.3].abs2 # => 5.3
|
|
26
|
+
# VectorNumber[-5.3i].abs2 # => 5.3
|
|
27
|
+
# VectorNumber[-5.3i, "i"].abs2 # => 29.09
|
|
28
|
+
#
|
|
29
|
+
# @return [Float]
|
|
30
|
+
#
|
|
31
|
+
# @since 0.2.2
|
|
32
|
+
def abs2
|
|
33
|
+
coefficients.sum(&:abs2)
|
|
34
|
+
end
|
|
52
35
|
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
36
|
+
# Return a new vector with every coefficient truncated using their +#truncate+.
|
|
37
|
+
#
|
|
38
|
+
# @example
|
|
39
|
+
# VectorNumber[5.39].truncate # => (5)
|
|
40
|
+
# VectorNumber[-5.35i].truncate # => (-5i)
|
|
41
|
+
# VectorNumber[-5.35i, "i"].truncate # => (-5i + 1⋅"i")
|
|
42
|
+
# VectorNumber[-5.35i, "i"].truncate(1) # => (-5.3i + 1⋅"i")
|
|
43
|
+
# VectorNumber[-5.35i, "i"].truncate(-1) # => (0)
|
|
44
|
+
#
|
|
45
|
+
# @param digits [Integer]
|
|
46
|
+
# @return [VectorNumber]
|
|
47
|
+
#
|
|
48
|
+
# @since 0.2.1
|
|
49
|
+
def truncate(digits = 0)
|
|
50
|
+
new { _1.truncate(digits) }
|
|
51
|
+
end
|
|
69
52
|
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
53
|
+
# Return a new vector with every coefficient rounded using their +#ceil+.
|
|
54
|
+
#
|
|
55
|
+
# @example
|
|
56
|
+
# VectorNumber[5.39].ceil # => (6)
|
|
57
|
+
# VectorNumber[-5.35i].ceil # => (-5i)
|
|
58
|
+
# VectorNumber[-5.35i, "i"].ceil # => (-5i + 1⋅"i")
|
|
59
|
+
# VectorNumber[-5.35i, "i"].ceil(1) # => (-5.3i + 1⋅"i")
|
|
60
|
+
# VectorNumber[-5.35i, "i"].ceil(-1) # => (10⋅"i")
|
|
61
|
+
#
|
|
62
|
+
# @param digits [Integer]
|
|
63
|
+
# @return [VectorNumber]
|
|
64
|
+
#
|
|
65
|
+
# @since 0.2.2
|
|
66
|
+
def ceil(digits = 0)
|
|
67
|
+
new { _1.ceil(digits) }
|
|
68
|
+
end
|
|
69
|
+
|
|
70
|
+
# Return a new vector with every coefficient rounded using their +#floor+.
|
|
71
|
+
#
|
|
72
|
+
# @example
|
|
73
|
+
# VectorNumber[5.39].floor # => (5)
|
|
74
|
+
# VectorNumber[-5.35i].floor # => (-6i)
|
|
75
|
+
# VectorNumber[-5.35i, "i"].floor # => (-6i + 1⋅"i")
|
|
76
|
+
# VectorNumber[-5.35i, "i"].floor(1) # => (-5.4i + 1⋅"i")
|
|
77
|
+
# VectorNumber[-5.35i, "i"].floor(-1) # => (-10i)
|
|
78
|
+
#
|
|
79
|
+
# @param digits [Integer]
|
|
80
|
+
# @return [VectorNumber]
|
|
81
|
+
#
|
|
82
|
+
# @since 0.2.2
|
|
83
|
+
def floor(digits = 0)
|
|
84
|
+
new { _1.floor(digits) }
|
|
85
|
+
end
|
|
86
86
|
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
|
|
87
|
+
# Return a new vector with every coefficient rounded using their +#round+.
|
|
88
|
+
#
|
|
89
|
+
# In the case of +BigDecimal+ coefficients, the +half+ parameter is converted
|
|
90
|
+
# to the corresponding +BigDecimal+ rounding mode
|
|
91
|
+
# (one of +:half_up+, +:half_down+, or +:half_even+).
|
|
92
|
+
# Other modes can not be specified.
|
|
93
|
+
#
|
|
94
|
+
# @example
|
|
95
|
+
# VectorNumber[-4.5i, "i"].round(half: :up) # => (-5i + 1⋅"i")
|
|
96
|
+
# VectorNumber[-4.5i, "i"].round(half: :even) # => (-4i + 1⋅"i")
|
|
97
|
+
# VectorNumber[-5.5i, "i"].round(half: :even) # => (-6i + 1⋅"i")
|
|
98
|
+
# VectorNumber[-5.5i, "i"].round(half: :down) # => (-5i + 1⋅"i")
|
|
99
|
+
# VectorNumber[-5.35i, "i"].round(1) # => (-5.4i + 1⋅"i")
|
|
100
|
+
# VectorNumber[-5.35i, "i"].round(-1) # => (-10i)
|
|
101
|
+
#
|
|
102
|
+
# @param digits [Integer]
|
|
103
|
+
# @param half [Symbol, nil] one of +:up+, +:down+ or +:even+,
|
|
104
|
+
# see +Float#round+ for meaning
|
|
105
|
+
# @return [VectorNumber]
|
|
106
|
+
#
|
|
107
|
+
# @see Float#round
|
|
108
|
+
#
|
|
109
|
+
# @since 0.2.2
|
|
110
|
+
def round(digits = 0, half: :up)
|
|
111
|
+
if defined?(BigDecimal)
|
|
112
|
+
bd_mode =
|
|
113
|
+
case half
|
|
114
|
+
when :down then :half_down
|
|
115
|
+
when :even then :half_even
|
|
116
|
+
else :half_up
|
|
117
|
+
end
|
|
118
|
+
new { _1.is_a?(BigDecimal) ? _1.round(digits, bd_mode) : _1.round(digits, half: half) }
|
|
119
|
+
# :nocov:
|
|
120
|
+
else
|
|
121
|
+
new { _1.round(digits, half: half) }
|
|
119
122
|
end
|
|
123
|
+
# :nocov:
|
|
120
124
|
end
|
|
121
125
|
end
|