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.
@@ -1,121 +1,125 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  class VectorNumber
4
- # Various mathematical operations that are also conversions.
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
- alias magnitude abs
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
- # 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
20
+ alias magnitude abs
35
21
 
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
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
- # 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
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
- # 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
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
- # Return a new vector with every coefficient rounded using their +#round+.
88
- #
89
- # @example
90
- # VectorNumber[-4.5i, "i"].round(half: :up) # => (-5i + 1⋅'i')
91
- # VectorNumber[-4.5i, "i"].round(half: :even) # => (-4i + 1⋅'i')
92
- # VectorNumber[-5.5i, "i"].round(half: :even) # => (-6i + 1⋅'i')
93
- # VectorNumber[-5.5i, "i"].round(half: :down) # => (-5i + 1⋅'i')
94
- # VectorNumber[-5.35i, "i"].round(1) # => (-5.4i + 1⋅'i')
95
- # VectorNumber[-5.35i, "i"].round(-1) # => (-10i)
96
- #
97
- # @param digits [Integer]
98
- # @param half [Symbol, nil] one of +:up+, +:down+ or +:even+,
99
- # see +Float#round+ for meaning
100
- # @return [VectorNumber]
101
- #
102
- # @see Float#round
103
- #
104
- # @since 0.2.2
105
- def round(digits = 0, half: :up)
106
- if defined?(BigDecimal)
107
- bd_mode =
108
- case half
109
- when :down then :half_down
110
- when :even then :half_even
111
- else :half_up
112
- end
113
- new { _1.is_a?(BigDecimal) ? _1.round(digits, bd_mode) : _1.round(digits, half: half) }
114
- # :nocov:
115
- else
116
- new { _1.round(digits, half: half) }
117
- end
118
- # :nocov:
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