phys-units 0.9.2 → 0.9.3
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 +16 -14
- data/lib/phys/units/errors.rb +1 -6
- data/lib/phys/units/jp.rb +169 -0
- data/lib/phys/units/load_units.rb +2 -3
- data/lib/phys/units/mixin.rb +6 -0
- data/lib/phys/units/parse.rb +4 -4
- data/lib/phys/units/parse.y +6 -6
- data/lib/phys/units/quantity.rb +119 -95
- data/lib/phys/units/quanty.rb +10 -0
- data/lib/phys/units/unit.rb +280 -83
- data/lib/phys/units/unit_class.rb +29 -11
- data/lib/phys/units/utils.rb +3 -2
- data/lib/phys/units/version.rb +1 -1
- data/misc/mkjpspec.rb +149 -0
- data/misc/mkunitspec.rb +60 -0
- data/misc/readme.jp.md +6 -0
- data/spec/{units_dat_spec.rb → all_units_spec.rb} +0 -0
- data/spec/jp_units_spec.rb +256 -0
- data/spec/quantity_spec.rb +51 -9
- data/spec/unit_spec.rb +2 -2
- metadata +11 -4
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: c123870463b0713958805751bbcef484dc35d1dc
|
4
|
+
data.tar.gz: 8a7bd323be840936ea2b3535b8a5bf6e312f5b4d
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: efbbc5b61cb7a9eebf65f0e2420073365750321f502b24aeecc45afa9cc42f01b6a895f126383e4a3cf49e3cf8178a230602c3fed460a6d7ebcda678e756083a
|
7
|
+
data.tar.gz: f1657606f20fadf5ff43744261b334322538ede36f93d89921f9afd7cbc68af5de040a67b2ccb0d56fda09e5a08afce03c9250fdcd27bc76052bbe4a46002bcf
|
data/README.md
CHANGED
@@ -1,6 +1,6 @@
|
|
1
1
|
# Phys-Units
|
2
2
|
|
3
|
-
GNU Units-compatible library for Ruby.
|
3
|
+
GNU Units-compatible library for Ruby.
|
4
4
|
Former name is [Quanty](http://narray.rubyforge.org/quanty/quanty-en.html),
|
5
5
|
the first Ruby units library released in 2001.
|
6
6
|
|
@@ -8,15 +8,16 @@ the first Ruby units library released in 2001.
|
|
8
8
|
is the primary class of Phys-Units library, to be manipulated by users.
|
9
9
|
It contains:
|
10
10
|
|
11
|
-
* *Value*
|
12
|
-
|
11
|
+
* *Value*
|
12
|
+
must be a class instance having arithmetic methods,
|
13
13
|
but it is not necessary to be a Numeric.
|
14
|
-
This is a duck typing way.
|
15
|
-
* *Unit*
|
16
|
-
|
17
|
-
obtained by parsing
|
14
|
+
This is a duck typing way.
|
15
|
+
* *Unit*
|
16
|
+
is an instance of Phys::Unit class
|
17
|
+
obtained by parsing *expr* string.
|
18
18
|
|
19
|
-
See
|
19
|
+
See [Phys::Quantity Documentation](http://rubydoc.info/gems/phys-units/frames/Phys/Quantity)
|
20
|
+
for more details.
|
20
21
|
|
21
22
|
## Installation
|
22
23
|
|
@@ -47,15 +48,16 @@ by the following features:
|
|
47
48
|
|
48
49
|
* Compatible with GNU Units except nonlinear units.
|
49
50
|
* Provides 2331 units, 85 prefixes, including UTF-8 unit names.
|
50
|
-
*
|
51
|
-
|
52
|
-
* No addition or modification to Ruby standard classes
|
51
|
+
* Defines Units by reading GNU Units text data,
|
52
|
+
unlike other libraries which define Units in Ruby code.
|
53
|
+
* No addition or modification to Ruby standard classes,
|
53
54
|
avoiding conflict with other libraries.
|
54
55
|
* Calculation of values is through Ruby Numeric arithmetic methods.
|
55
|
-
|
56
|
-
* Conversion factors are held in Rational even
|
57
|
-
|
56
|
+
Phys-Units does not care it.
|
57
|
+
* Conversion factors are internally held in Rational form even
|
58
|
+
defined as the decimal form such as `1.0e10'.
|
58
59
|
* PI number has a dimension.
|
60
|
+
* Japanese Units are available by require 'phys/units/jp'.
|
59
61
|
|
60
62
|
## Platforms tested
|
61
63
|
|
data/lib/phys/units/errors.rb
CHANGED
@@ -0,0 +1,169 @@
|
|
1
|
+
# -*- coding: utf-8 -*-
|
2
|
+
require "phys/units"
|
3
|
+
|
4
|
+
Phys::Unit.import_units <<EOL
|
5
|
+
!utf8
|
6
|
+
# Japanese Number units
|
7
|
+
一- 1
|
8
|
+
二- 2
|
9
|
+
三- 3
|
10
|
+
四- 4
|
11
|
+
五- 5
|
12
|
+
六- 6
|
13
|
+
七- 7
|
14
|
+
八- 8
|
15
|
+
九- 9
|
16
|
+
十- 10
|
17
|
+
百- 10^2
|
18
|
+
千- 10^3
|
19
|
+
万- 10^4
|
20
|
+
億- 10^8
|
21
|
+
兆- 10^12
|
22
|
+
京- 10^16
|
23
|
+
垓- 10^20
|
24
|
+
秭- 10^24
|
25
|
+
秭- 10^24
|
26
|
+
穰- 10^28
|
27
|
+
溝- 10^32
|
28
|
+
澗- 10^36
|
29
|
+
正- 10^40
|
30
|
+
載- 10^44
|
31
|
+
極- 10^48
|
32
|
+
恒河沙- 10^52
|
33
|
+
阿僧祇- 10^56
|
34
|
+
那由他- 10^60
|
35
|
+
不可思議- 10^64
|
36
|
+
無量大数- 10^68
|
37
|
+
#
|
38
|
+
一 1
|
39
|
+
二 2
|
40
|
+
三 3
|
41
|
+
四 4
|
42
|
+
五 5
|
43
|
+
六 6
|
44
|
+
七 7
|
45
|
+
八 8
|
46
|
+
九 9
|
47
|
+
十 10
|
48
|
+
百 10^2
|
49
|
+
千 10^3
|
50
|
+
万 10^4
|
51
|
+
億 10^8
|
52
|
+
兆 10^12
|
53
|
+
京 10^16
|
54
|
+
垓 10^20
|
55
|
+
秭 10^24
|
56
|
+
秭 10^24
|
57
|
+
穰 10^28
|
58
|
+
溝 10^32
|
59
|
+
澗 10^36
|
60
|
+
正 10^40
|
61
|
+
載 10^44
|
62
|
+
極 10^48
|
63
|
+
恒河沙 10^52
|
64
|
+
阿僧祇 10^56
|
65
|
+
那由他 10^60
|
66
|
+
不可思議 10^64
|
67
|
+
無量大数 10^68
|
68
|
+
#
|
69
|
+
割- 1|10
|
70
|
+
分- 1|100
|
71
|
+
厘- 1|1000
|
72
|
+
釐- 1|1000
|
73
|
+
毛- 1|10^4
|
74
|
+
毫- 1|10^4
|
75
|
+
糸- 1|10^4
|
76
|
+
絲- 1|10^4
|
77
|
+
忽- 1|10^5
|
78
|
+
微- 1|10^6
|
79
|
+
繊- 1|10^7
|
80
|
+
沙- 1|10^8
|
81
|
+
塵- 1|10^9
|
82
|
+
埃- 1|10^10
|
83
|
+
渺- 1|10^11
|
84
|
+
漠- 1|10^12
|
85
|
+
模糊- 1|10^13
|
86
|
+
逡巡- 1|10^14
|
87
|
+
須臾- 1|10^15
|
88
|
+
瞬息- 1|10^16
|
89
|
+
弾指- 1|10^17
|
90
|
+
刹那- 1|10^18
|
91
|
+
六徳- 1|10^19
|
92
|
+
虚空- 1|10^20
|
93
|
+
清浄- 1|10^21
|
94
|
+
阿頼耶- 1|10^22
|
95
|
+
阿摩羅- 1|10^23
|
96
|
+
涅槃寂静- 1|10^24
|
97
|
+
#
|
98
|
+
割 1|10
|
99
|
+
分 1|100
|
100
|
+
厘 1|1000
|
101
|
+
釐 1|1000
|
102
|
+
毛 1|10^4
|
103
|
+
毫 1|10^4
|
104
|
+
糸 1|10^4
|
105
|
+
絲 1|10^4
|
106
|
+
忽 1|10^5
|
107
|
+
微 1|10^6
|
108
|
+
繊 1|10^7
|
109
|
+
沙 1|10^8
|
110
|
+
塵 1|10^9
|
111
|
+
埃 1|10^10
|
112
|
+
渺 1|10^11
|
113
|
+
漠 1|10^12
|
114
|
+
模糊 1|10^13
|
115
|
+
逡巡 1|10^14
|
116
|
+
須臾 1|10^15
|
117
|
+
瞬息 1|10^16
|
118
|
+
弾指 1|10^17
|
119
|
+
刹那 1|10^18
|
120
|
+
六徳 1|10^19
|
121
|
+
虚空 1|10^20
|
122
|
+
清浄 1|10^21
|
123
|
+
阿頼耶 1|10^22
|
124
|
+
阿摩羅 1|10^23
|
125
|
+
涅槃寂静 1|10^24
|
126
|
+
#
|
127
|
+
# Traditional Japanese units (shakkanhou)
|
128
|
+
#
|
129
|
+
# Japanese Length Measures
|
130
|
+
尺 shaku # = 10/33 m ≒ 0.3030303 m
|
131
|
+
寸 1|10 尺
|
132
|
+
里 36 町 # ≒ 3927.272727 m
|
133
|
+
町 60 間 # ≒ 109.090909 m
|
134
|
+
間 6 尺 # ≒ 1.818182 m
|
135
|
+
丈 10 尺 # ≒ 3.030303 m
|
136
|
+
曲尺 尺
|
137
|
+
鯨尺 kujirajaku # 10|8 shaku
|
138
|
+
#
|
139
|
+
# Japanese Area Measures
|
140
|
+
坪 tsubo # = 400/121 m^2 ≒ 3.305785 m^2
|
141
|
+
畝 30 坪 # ≒ 99.173554 m^2
|
142
|
+
反 10 畝 # ≒ 991.7355 m^2
|
143
|
+
段 反
|
144
|
+
#歩 坪
|
145
|
+
#町 10 反 # ≒ 9917.355 m^2
|
146
|
+
#合 1|10 坪 # ≒ 0.3305785 m^2
|
147
|
+
#勺 1|100 坪
|
148
|
+
#
|
149
|
+
# Japanese architecture is based on a "standard" size of tatami mat.
|
150
|
+
江戸間 edoma # (5.8*2.9) shaku^2
|
151
|
+
京間 kyouma # (6.3*3.15) shaku^2
|
152
|
+
中京間 chuukyouma # (6*3) shaku^2
|
153
|
+
畳 tatami
|
154
|
+
#
|
155
|
+
# Japanese Volume Measures
|
156
|
+
升 shou # 10合 = 2401/1331 l ≒ 1.803906837 l
|
157
|
+
斗 10 升 # ≒ 18.039068 l
|
158
|
+
石 10 斗 # ≒ 180.390684 l
|
159
|
+
合 1|10 升 # 10 勺 ≒ 0.180390684 l
|
160
|
+
勺 1|10 合
|
161
|
+
#
|
162
|
+
# Japanese Weight Measures
|
163
|
+
貫 1000 匁 # = 100両 = 3.75 kg
|
164
|
+
斤 160 匁 # = 600 g
|
165
|
+
両 10 匁 # = 37.5 g
|
166
|
+
匁 momme # = 3.75 g
|
167
|
+
#
|
168
|
+
!endutf8
|
169
|
+
EOL
|
@@ -4526,7 +4526,7 @@ pfund 500 g
|
|
4526
4526
|
#
|
4527
4527
|
# If you would like to help expand this section and understand
|
4528
4528
|
# cyrillic transliteration, let me know. These measures are meant to
|
4529
|
-
# reflect common usage, e.g. in translated literature.
|
4529
|
+
# reflect common usage, e.g. in translated literature.
|
4530
4530
|
#
|
4531
4531
|
|
4532
4532
|
dessiatine 2400 sazhen^2 # Land measure
|
@@ -5294,10 +5294,9 @@ EOL
|
|
5294
5294
|
|
5295
5295
|
module Phys
|
5296
5296
|
# define pi
|
5297
|
-
|
5297
|
+
BaseUnit.define("pi","!dimensionless",Math::PI)
|
5298
5298
|
|
5299
5299
|
# define tempC and tempK
|
5300
|
-
#Phys::OffsetUnit.import_temperature
|
5301
5300
|
zero_degc = Unit["stdtemp"].conversion_factor
|
5302
5301
|
OffsetUnit.define( "tempC", Unit["K"], zero_degc )
|
5303
5302
|
OffsetUnit.define( "tempF", Unit["K"]*Rational(5,9), zero_degc-32*Rational(5,9) )
|
data/lib/phys/units/mixin.rb
CHANGED
@@ -1,5 +1,11 @@
|
|
1
1
|
require "phys/units"
|
2
2
|
|
3
|
+
# ActiveSupport-like mix-in to Numeric.
|
4
|
+
# This is activated by:
|
5
|
+
# require 'phys/units/mixin'
|
6
|
+
#
|
7
|
+
# However, this kind of global change will cause unexpected problems.
|
8
|
+
|
3
9
|
class Numeric
|
4
10
|
alias method_missing_orig method_missing
|
5
11
|
def method_missing(method, *args, &block)
|
data/lib/phys/units/parse.rb
CHANGED
@@ -450,13 +450,13 @@ end
|
|
450
450
|
###### racc/parser.rb end
|
451
451
|
|
452
452
|
|
453
|
-
# -*- coding: utf-8 -*-
|
454
453
|
# parse.y, parse.rb
|
455
454
|
#
|
456
455
|
# by Masahiro Tanaka <masa16.tanaka@gmail.com>
|
457
456
|
#
|
458
457
|
module Phys
|
459
458
|
class Unit
|
459
|
+
# @visibility private
|
460
460
|
class Parse < Racc::Parser
|
461
461
|
|
462
462
|
module_eval(<<'...end parse.y/module_eval...', 'parse.y', 63)
|
@@ -480,10 +480,10 @@ module_eval(<<'...end parse.y/module_eval...', 'parse.y', 63)
|
|
480
480
|
end
|
481
481
|
|
482
482
|
def parse( str )
|
483
|
-
return Unit.new(
|
483
|
+
return Unit.new(1) if str.empty?
|
484
484
|
@q = []
|
485
485
|
|
486
|
-
c = Unit.
|
486
|
+
c = Unit.unit_exclude_chars
|
487
487
|
|
488
488
|
while str.size > 0 do
|
489
489
|
case str
|
@@ -677,7 +677,7 @@ Racc_debug_parser = false
|
|
677
677
|
|
678
678
|
module_eval(<<'.,.,', 'parse.y', 23)
|
679
679
|
def _reduce_2(val, _values, result)
|
680
|
-
result = Unit.
|
680
|
+
result = Unit.inverse(val[1])
|
681
681
|
result
|
682
682
|
end
|
683
683
|
.,.,
|
data/lib/phys/units/parse.y
CHANGED
@@ -21,7 +21,7 @@ class Parse
|
|
21
21
|
rule
|
22
22
|
|
23
23
|
target: expr
|
24
|
-
| DIV list { result = Unit.
|
24
|
+
| DIV list { result = Unit.inverse(val[1]) }
|
25
25
|
;
|
26
26
|
|
27
27
|
expr: list
|
@@ -30,10 +30,10 @@ rule
|
|
30
30
|
| expr '-' expr { result = val[0] - val[2] }
|
31
31
|
| expr '*' expr { result = val[0] * val[2] }
|
32
32
|
| expr DIV expr { result = val[0] / val[2] }
|
33
|
-
;
|
33
|
+
;
|
34
34
|
|
35
35
|
numexpr: NUMBER
|
36
|
-
| numexpr '|' numexpr { result = Unit.rdiv(val[0],val[2]) }
|
36
|
+
| numexpr '|' numexpr { result = Unit.rdiv(val[0],val[2]) }
|
37
37
|
;
|
38
38
|
|
39
39
|
pexpr: '(' expr ')' { result = val[1] }
|
@@ -52,13 +52,13 @@ end
|
|
52
52
|
|
53
53
|
---- header ----
|
54
54
|
|
55
|
-
# -*- coding: utf-8 -*-
|
56
55
|
# parse.y, parse.rb
|
57
56
|
#
|
58
57
|
# by Masahiro Tanaka <masa16.tanaka@gmail.com>
|
59
58
|
#
|
60
59
|
module Phys
|
61
60
|
class Unit
|
61
|
+
# @visibility private
|
62
62
|
---- inner ----
|
63
63
|
|
64
64
|
def build_num(ov,ud,pw)
|
@@ -80,10 +80,10 @@ class Unit
|
|
80
80
|
end
|
81
81
|
|
82
82
|
def parse( str )
|
83
|
-
return Unit.new(
|
83
|
+
return Unit.new(1) if str.empty?
|
84
84
|
@q = []
|
85
85
|
|
86
|
-
c = Unit.
|
86
|
+
c = Unit.unit_exclude_chars
|
87
87
|
|
88
88
|
while str.size > 0 do
|
89
89
|
case str
|
data/lib/phys/units/quantity.rb
CHANGED
@@ -10,9 +10,9 @@
|
|
10
10
|
module Phys
|
11
11
|
|
12
12
|
# alias to Phys::Quantity.new
|
13
|
-
def Quantity(*a)
|
14
|
-
|
15
|
-
end
|
13
|
+
#def Quantity(*a)
|
14
|
+
# Quantity.new(*a)
|
15
|
+
#end
|
16
16
|
|
17
17
|
# Phys::Quantity is a class to represent physical quantities
|
18
18
|
# with unit of measure.
|
@@ -20,7 +20,7 @@ module Phys
|
|
20
20
|
# * *Value* of the quantity.
|
21
21
|
# +value+ must be a class instance having arithmetic methods,
|
22
22
|
# but it is not necessary to be a Numeric.
|
23
|
-
# This is a duck typing way.
|
23
|
+
# This is a duck typing way.
|
24
24
|
# * *Unit* of the quantity.
|
25
25
|
# +unit+ is a instance of Phys::Unit class
|
26
26
|
# obtained by parsing a +expr+ string.
|
@@ -43,7 +43,7 @@ module Phys
|
|
43
43
|
# @param [String] expr a string of unit expression.
|
44
44
|
# If +expr+ is not supplied, it becomes dimeinsionless.
|
45
45
|
# @return [Phys::Quantity]
|
46
|
-
# @raise [Phys::
|
46
|
+
# @raise [Phys::UnitError] if unit conversion is failed.
|
47
47
|
def [](value,expr=nil)
|
48
48
|
self.new(value,expr)
|
49
49
|
end
|
@@ -55,10 +55,10 @@ module Phys
|
|
55
55
|
# @param [String] expr a string of unit expression.
|
56
56
|
# If +expr+ is not supplied, it becomes dimeinsionless.
|
57
57
|
# @param [Phys::Unit] unit (optional)
|
58
|
-
# @raise [Phys::
|
58
|
+
# @raise [Phys::UnitError] if unit conversion is failed.
|
59
59
|
#
|
60
60
|
def initialize(value,expr=nil,unit=nil)
|
61
|
-
@
|
61
|
+
@value = value
|
62
62
|
expr = expr.to_s if Symbol===expr
|
63
63
|
@expr = (expr=='') ? nil : expr
|
64
64
|
@unit = unit
|
@@ -69,20 +69,24 @@ module Phys
|
|
69
69
|
end
|
70
70
|
end
|
71
71
|
|
72
|
-
#
|
73
|
-
|
74
|
-
|
72
|
+
# Value of the quantity.
|
73
|
+
# Instance of classes with same arithmetic methods as Numric.
|
74
|
+
# @return [Object]
|
75
|
+
attr_reader :value
|
76
|
+
alias val value
|
75
77
|
|
76
|
-
#
|
78
|
+
# Unit expression. Given as the second parameter of the Quantity constructor.
|
79
|
+
# @return [String]
|
77
80
|
attr_reader :expr
|
78
81
|
|
79
|
-
#
|
82
|
+
# Unit of the quantity. Instance of Phys::Unit class.
|
83
|
+
# @return [Phys::Unit]
|
80
84
|
attr_reader :unit
|
81
85
|
|
82
86
|
# Conversion to a quantity in another unit.
|
83
87
|
# @param [String] expr unit expression.
|
84
88
|
# @return [Phys::Quantity] quantity in the unit of +expr+.
|
85
|
-
# @raise [Phys::
|
89
|
+
# @raise [Phys::UnitError] if unit conversion is failed.
|
86
90
|
#
|
87
91
|
def want(expr)
|
88
92
|
unit = Unit.parse(expr)
|
@@ -99,10 +103,10 @@ module Phys
|
|
99
103
|
# both params must be dimensionless.
|
100
104
|
# @param [Object] other
|
101
105
|
# @return [Phys::Quantity] a quantity in the unit of +self+.
|
102
|
-
# @raise [Phys::
|
106
|
+
# @raise [Phys::UnitError] if unit conversion is failed.
|
103
107
|
#
|
104
108
|
def +(other)
|
105
|
-
val = @
|
109
|
+
val = @value + @unit.convert_scale(other)
|
106
110
|
self.class.new( val, @expr, @unit )
|
107
111
|
end
|
108
112
|
|
@@ -114,125 +118,145 @@ module Phys
|
|
114
118
|
# both params must be dimensionless.
|
115
119
|
# @param [Object] other
|
116
120
|
# @return [Phys::Quantity] a quantity in the unit of +self+.
|
117
|
-
# @raise [Phys::
|
121
|
+
# @raise [Phys::UnitError] if unit conversion is failed.
|
118
122
|
#
|
119
123
|
def -(other)
|
120
|
-
val = @
|
124
|
+
val = @value - @unit.convert_scale(other)
|
121
125
|
self.class.new( val, @expr, @unit )
|
122
126
|
end
|
123
127
|
|
124
|
-
#
|
128
|
+
# Absolute. Returns a quantity in the same unit of +self+.
|
129
|
+
# @return [Phys::Quantity]
|
125
130
|
def abs
|
126
|
-
self.class.new( @
|
131
|
+
self.class.new( @value.abs, @expr, @unit )
|
127
132
|
end
|
128
133
|
|
129
|
-
#
|
134
|
+
# Square. Returns a quantity in squared unit of +self+.
|
135
|
+
# @return [Phys::Quantity]
|
130
136
|
def abs2
|
131
137
|
self**2
|
132
138
|
end
|
133
139
|
|
134
|
-
#
|
140
|
+
# Ceil. Returns a quantity with the smallest Integer value greater
|
141
|
+
# than or equal to +self+ value, in the same unit of +self+.
|
142
|
+
# @return [Phys::Quantity]
|
135
143
|
def ceil
|
136
|
-
self.class.new( @
|
144
|
+
self.class.new( @value.ceil, @expr, @unit )
|
137
145
|
end
|
138
146
|
|
139
|
-
#
|
140
|
-
|
141
|
-
|
147
|
+
# Round. Rounds +self+ value to a given precision in decimal digits
|
148
|
+
# (default 0 digits).
|
149
|
+
# Returns a quantity with the rounded value in the same unit of +self+.
|
150
|
+
# @return [Phys::Quantity]
|
151
|
+
def round(ndigits=nil)
|
152
|
+
val = ndigits ? @value.round(ndigits) : @value.round
|
153
|
+
self.class.new( val, @expr, @unit )
|
142
154
|
end
|
143
155
|
|
144
|
-
#
|
156
|
+
# Floor. Returns a quantity with the largest integer value
|
157
|
+
# less than or equal to +self+ value, in the same unit of +self+.
|
158
|
+
# @return [Phys::Quantity]
|
145
159
|
def floor
|
146
|
-
self.class.new( @
|
160
|
+
self.class.new( @value.floor, @expr, @unit )
|
147
161
|
end
|
148
162
|
|
149
|
-
#
|
163
|
+
# Truncate. Returns a quantity with the value truncated to an integer,
|
164
|
+
# in the same unit of +self+.
|
165
|
+
# @return [Phys::Quantity]
|
150
166
|
def truncate
|
151
|
-
self.class.new( @
|
167
|
+
self.class.new( @value.truncate, @expr, @unit )
|
152
168
|
end
|
153
169
|
|
154
|
-
# Unary Plus.
|
155
|
-
# @return [Phys::Quantity]
|
170
|
+
# Unary Plus. Returns +self+.
|
171
|
+
# @return [Phys::Quantity]
|
156
172
|
def +@
|
157
|
-
self.class.new( @
|
173
|
+
self.class.new( @value, @expr, @unit )
|
158
174
|
end
|
159
175
|
|
160
|
-
# Unary Minus.
|
161
|
-
#
|
176
|
+
# Unary Minus. Returns a quantity with negative value
|
177
|
+
# in the same unit of +self+.
|
178
|
+
# @return [Phys::Quantity]
|
162
179
|
def -@
|
163
|
-
self.class.new( -@
|
180
|
+
self.class.new( -@value, @expr, @unit )
|
164
181
|
end
|
165
182
|
|
166
183
|
# Comparison of quantities.
|
167
184
|
# Before the comparison, it converts +other+ to the unit of +self+.
|
168
185
|
# @param [Phys::Quantity] other
|
169
186
|
# @return [Integer]
|
170
|
-
# @raise [Phys::
|
187
|
+
# @raise [Phys::UnitError] if unit conversion is failed.
|
171
188
|
def <=> (other)
|
172
|
-
@
|
189
|
+
@value <=> @unit.convert(other)
|
173
190
|
end
|
174
191
|
|
175
|
-
#
|
192
|
+
# Equality. Returns +true+ if +self+ has the same value as +other+.
|
176
193
|
# Before the comparison, it converts +other+ to the unit of +self+.
|
177
194
|
# @param [Phys::Quantity] other
|
178
195
|
# @return [Boolean]
|
179
|
-
|
180
|
-
|
181
|
-
|
196
|
+
def == (other)
|
197
|
+
if Quantity===other
|
198
|
+
@unit.conformable?(other.unit) &&
|
199
|
+
@value == @unit.convert(other)
|
200
|
+
elsif @unit.dimensionless?
|
201
|
+
@unit.convert_value_to_base_unit(@value) == other
|
202
|
+
else
|
203
|
+
false
|
204
|
+
end
|
182
205
|
end
|
183
206
|
|
184
207
|
# Comparison. Returns +true+ if +self+ is greather-than or equal-to +other+.
|
185
208
|
# Before the comparison, it converts +other+ to the unit of +self+.
|
186
209
|
# @param [Phys::Quantity] other
|
187
210
|
# @return [Boolean]
|
188
|
-
# @raise [Phys::
|
189
|
-
def
|
190
|
-
@
|
211
|
+
# @raise [Phys::UnitError] if unit conversion is failed.
|
212
|
+
def >= (other)
|
213
|
+
@value >= @unit.convert(other)
|
191
214
|
end
|
192
215
|
|
193
216
|
# Comparison. Returns +true+ if +self+ is less-than or equal-to +other+.
|
194
217
|
# Before the comparison, it converts +other+ to the unit of +self+.
|
195
218
|
# @param [Phys::Quantity] other
|
196
219
|
# @return [Boolean]
|
197
|
-
# @raise [Phys::
|
198
|
-
def
|
199
|
-
@
|
220
|
+
# @raise [Phys::UnitError] if unit conversion is failed.
|
221
|
+
def <= (other)
|
222
|
+
@value <= @unit.convert(other)
|
200
223
|
end
|
201
224
|
|
202
225
|
# Comparison. Returns +true+ if +self+ is less than +other+.
|
203
226
|
# Before the comparison, it converts +other+ to the unit of +self+.
|
204
227
|
# @param [Phys::Quantity] other
|
205
228
|
# @return [Boolean]
|
206
|
-
# @raise [Phys::
|
207
|
-
def
|
208
|
-
@
|
229
|
+
# @raise [Phys::UnitError] if unit conversion is failed.
|
230
|
+
def < (other)
|
231
|
+
@value < @unit.convert(other)
|
209
232
|
end
|
210
233
|
|
211
234
|
# Comparison. Returns +true+ if +self+ is greater than +other+.
|
212
235
|
# Before the comparison, it converts +other+ to the unit of +self+.
|
213
236
|
# @param [Phys::Quantity] other
|
214
237
|
# @return [Boolean]
|
215
|
-
# @raise [Phys::
|
216
|
-
def
|
217
|
-
@
|
238
|
+
# @raise [Phys::UnitError] if unit conversion is failed.
|
239
|
+
def > (other)
|
240
|
+
@value > @unit.convert(other)
|
218
241
|
end
|
219
242
|
|
220
|
-
# Closeness. Returns +true+ if +self+ and +other+ is
|
221
|
-
#
|
243
|
+
# Closeness. Returns +true+ if difference between +self+ and +other+ is
|
244
|
+
# smaller than +epsilon+ times sum of their absolute values.
|
222
245
|
# Before the comparison, it converts +other+ to the unit of +self+.
|
223
246
|
# @param [Phys::Quantity] other
|
224
247
|
# @param [Numeric] epsilon
|
225
248
|
# @return [Boolean]
|
226
|
-
# @raise [Phys::
|
249
|
+
# @raise [Phys::UnitError] if unit conversion is failed.
|
227
250
|
def close_to(other,epsilon=Float::EPSILON)
|
228
251
|
other_value = @unit.convert(other)
|
229
|
-
|
252
|
+
abs_sum = @value.abs+other_value.abs
|
253
|
+
abs_sum==0 || (@value-other_value).abs/abs_sum <= epsilon
|
230
254
|
end
|
231
255
|
|
232
|
-
#
|
256
|
+
# Exponentiation.
|
233
257
|
# @param [Numeric] n
|
234
258
|
# @return [Phys::Quantity] a quantity in the +n+ -powered unit of +self+.
|
235
|
-
# @raise [Phys::
|
259
|
+
# @raise [Phys::UnitError] if unit conversion is failed.
|
236
260
|
def **(n)
|
237
261
|
if @expr.nil?
|
238
262
|
expr = nil
|
@@ -241,11 +265,11 @@ module Phys
|
|
241
265
|
else
|
242
266
|
expr = '('+@expr+')^'+n.to_s+''
|
243
267
|
end
|
244
|
-
self.class.new( @
|
268
|
+
self.class.new( @value**n, expr, @unit**n )
|
245
269
|
end
|
246
270
|
|
247
271
|
# (internally used method)
|
248
|
-
# @private
|
272
|
+
# @visibility private
|
249
273
|
# @return [String]
|
250
274
|
def enclose_expr #:nodoc: used internally
|
251
275
|
return nil if @expr.nil?
|
@@ -255,9 +279,9 @@ module Phys
|
|
255
279
|
@expr
|
256
280
|
end
|
257
281
|
end
|
258
|
-
|
282
|
+
|
259
283
|
# (internally used method)
|
260
|
-
# @private
|
284
|
+
# @visibility private
|
261
285
|
# @return [String]
|
262
286
|
def enclose_expr_div #:nodoc: used internally
|
263
287
|
return nil if @expr.nil?
|
@@ -271,54 +295,54 @@ module Phys
|
|
271
295
|
# Multiplication.
|
272
296
|
# If the +other+ param is *not* Phys::Quantity,
|
273
297
|
# +other+ is regarded as a dimensionless value.
|
298
|
+
# The values and units are multiplied respectively.
|
274
299
|
# @param [Object] other
|
275
300
|
# @return [Phys::Quantity] a quantity
|
276
|
-
#
|
277
|
-
# @raise [Phys::UnitOperationError] if unit is not operable.
|
301
|
+
# @raise [Phys::UnitError] if unit is not operable.
|
278
302
|
#
|
279
303
|
def *(other)
|
280
304
|
if Quantity===other
|
281
305
|
a = [self.enclose_expr, other.enclose_expr]
|
282
306
|
a.delete(nil)
|
283
|
-
self.class.new( @
|
307
|
+
self.class.new( @value*other.value, a.join(' '), @unit*other.unit )
|
284
308
|
else
|
285
|
-
self.class.new( @
|
309
|
+
self.class.new( @value*other, @expr, @unit )
|
286
310
|
end
|
287
311
|
end
|
288
312
|
|
289
313
|
# Division.
|
290
314
|
# If the +other+ param is *not* Phys::Quantity,
|
291
315
|
# +other+ is regarded as a dimensionless value.
|
316
|
+
# The values and units are divided respectively.
|
292
317
|
# @param [Object] other
|
293
318
|
# @return [Phys::Quantity] a quantity
|
294
|
-
#
|
295
|
-
# @raise [Phys::UnitOperationError] if unit is not operable.
|
319
|
+
# @raise [Phys::UnitError] if unit is not operable.
|
296
320
|
#
|
297
321
|
def /(other)
|
298
322
|
if Quantity===other
|
299
323
|
a = [self.enclose_expr, other.enclose_expr_div]
|
300
324
|
a.delete(nil)
|
301
|
-
self.class.new( @
|
325
|
+
self.class.new( @value/other.value, a.join, @unit/other.unit )
|
302
326
|
else
|
303
|
-
self.class.new( @
|
327
|
+
self.class.new( @value/other, @expr, @unit )
|
304
328
|
end
|
305
329
|
end
|
306
330
|
|
307
331
|
# Division more correctly.
|
308
332
|
# If the +other+ param is *not* Phys::Quantity,
|
309
333
|
# +other+ is regarded as a dimensionless value.
|
334
|
+
# The values and units are divided respectively.
|
310
335
|
# @param [Object] other
|
311
336
|
# @return [Phys::Quantity] a quantity
|
312
|
-
#
|
313
|
-
# @raise [Phys::UnitOperationError] if unit is not operable.
|
337
|
+
# @raise [Phys::UnitError] if unit is not operable.
|
314
338
|
#
|
315
339
|
def quo(other)
|
316
340
|
if Quantity===other
|
317
341
|
a = [self.enclose_expr, other.enclose_expr_div]
|
318
342
|
a.delete(nil)
|
319
|
-
self.class.new( @
|
343
|
+
self.class.new( @value.quo(other.value), a.join, @unit/other.unit )
|
320
344
|
else
|
321
|
-
self.class.new( @
|
345
|
+
self.class.new( @value.quo(other), @expr, @unit )
|
322
346
|
end
|
323
347
|
end
|
324
348
|
alias fdiv quo
|
@@ -332,13 +356,13 @@ module Phys
|
|
332
356
|
# and returns +div+ of Phys::Quantity.
|
333
357
|
# @param [Object] other
|
334
358
|
# @return [Object] div
|
335
|
-
# @raise [Phys::
|
359
|
+
# @raise [Phys::UnitError] if unit conversion is failed.
|
336
360
|
#
|
337
361
|
def div(other)
|
338
362
|
if Quantity===other
|
339
|
-
@
|
363
|
+
@value.div( @unit.convert(other) )
|
340
364
|
else
|
341
|
-
self.class.new( @
|
365
|
+
self.class.new( @value.div(other), @expr, @unit )
|
342
366
|
end
|
343
367
|
end
|
344
368
|
|
@@ -351,13 +375,13 @@ module Phys
|
|
351
375
|
# and returns +remainder+ of Phys::Quantity.
|
352
376
|
# @param [Object] other
|
353
377
|
# @return [Object] remainder
|
354
|
-
# @raise [Phys::
|
378
|
+
# @raise [Phys::UnitError] if unit conversion is failed.
|
355
379
|
#
|
356
380
|
def remainder(other) #:nodoc: used internally
|
357
381
|
if Quantity===other
|
358
|
-
@
|
382
|
+
@value.remainder( @unit.convert(other) )
|
359
383
|
else
|
360
|
-
self.class.new( @
|
384
|
+
self.class.new( @value.remainder(other), @expr, @unit )
|
361
385
|
end
|
362
386
|
end
|
363
387
|
|
@@ -370,13 +394,13 @@ module Phys
|
|
370
394
|
# and returns +modulo+ of Phys::Quantity.
|
371
395
|
# @param [Object] other
|
372
396
|
# @return [Object] modulo
|
373
|
-
# @raise [Phys::
|
397
|
+
# @raise [Phys::UnitError] if unit conversion is failed.
|
374
398
|
#
|
375
399
|
def %(other)
|
376
400
|
if Quantity===other
|
377
|
-
@
|
401
|
+
@value % @unit.convert(other)
|
378
402
|
else
|
379
|
-
self.class.new( @
|
403
|
+
self.class.new( @value % other, @expr, @unit )
|
380
404
|
end
|
381
405
|
end
|
382
406
|
alias modulo %
|
@@ -390,13 +414,13 @@ module Phys
|
|
390
414
|
# and returns +divmod+ of Phys::Quantity.
|
391
415
|
# @param [Object] other
|
392
416
|
# @return [Array] result of +divmod+, an array of [quotient, modulo].
|
393
|
-
# @raise [Phys::
|
417
|
+
# @raise [Phys::UnitError] if unit conversion is failed.
|
394
418
|
#
|
395
419
|
def divmod(other)
|
396
420
|
if Quantity===other
|
397
|
-
@
|
421
|
+
@value.divmod( @unit.convert(other) )
|
398
422
|
else
|
399
|
-
d,m = @
|
423
|
+
d,m = @value.divmod(other)
|
400
424
|
[ self.class.new( d, @expr, @unit ),
|
401
425
|
self.class.new( m, @expr, @unit ) ]
|
402
426
|
end
|
@@ -410,7 +434,7 @@ module Phys
|
|
410
434
|
# Conversion to base unit.
|
411
435
|
# Returns the quantity converted to a base unit.
|
412
436
|
# @return [Phys::Quantity] a quantity in the base unit.
|
413
|
-
# @raise [Phys::
|
437
|
+
# @raise [Phys::UnitError] if unit conversion is failed.
|
414
438
|
def to_base_unit
|
415
439
|
unit = @unit.base_unit
|
416
440
|
val = unit.convert(self)
|
@@ -422,15 +446,15 @@ module Phys
|
|
422
446
|
|
423
447
|
# Conversion to Numeric.
|
424
448
|
# @return [Numeric]
|
425
|
-
# @raise [Phys::
|
449
|
+
# @raise [Phys::UnitError] if the unit is *not* dimensionless.
|
426
450
|
def to_numeric
|
427
|
-
@unit.
|
451
|
+
@unit.to_numeric * @value
|
428
452
|
end
|
429
453
|
alias to_num to_numeric
|
430
454
|
|
431
455
|
# Conversion to Float.
|
432
456
|
# @return [Float]
|
433
|
-
# @raise [Phys::
|
457
|
+
# @raise [Phys::UnitError] if the unit is *not* dimensionless.
|
434
458
|
def to_f
|
435
459
|
to_numeric.to_f
|
436
460
|
end
|
@@ -438,7 +462,7 @@ module Phys
|
|
438
462
|
|
439
463
|
# Conversion to Integer.
|
440
464
|
# @return [Integer]
|
441
|
-
# @raise [Phys::
|
465
|
+
# @raise [Phys::UnitError] if the unit is *not* dimensionless.
|
442
466
|
def to_i
|
443
467
|
to_numeric.to_i
|
444
468
|
end
|
@@ -447,7 +471,7 @@ module Phys
|
|
447
471
|
|
448
472
|
# Conversion to Rational.
|
449
473
|
# @return [Rational]
|
450
|
-
# @raise [Phys::
|
474
|
+
# @raise [Phys::UnitError] if the unit is *not* dimensionless.
|
451
475
|
def to_r
|
452
476
|
to_numeric.to_r
|
453
477
|
end
|
@@ -461,7 +485,7 @@ module Phys
|
|
461
485
|
else
|
462
486
|
expr = ""
|
463
487
|
end
|
464
|
-
self.class.to_s+"["+Unit::Utils.num_inspect(@
|
488
|
+
self.class.to_s+"["+Unit::Utils.num_inspect(@value)+expr+"]"
|
465
489
|
end
|
466
490
|
|
467
491
|
# Inspect String.
|
@@ -472,7 +496,7 @@ module Phys
|
|
472
496
|
else
|
473
497
|
expr = ""
|
474
498
|
end
|
475
|
-
|
499
|
+
self.class.to_s+"["+Unit::Utils.num_inspect(@value)+expr+"] "+@unit.inspect
|
476
500
|
end
|
477
501
|
end
|
478
502
|
end
|