numru-units 1.7.0

Sign up to get free protection for your applications and to get access to all the features.
data/ChangeLog ADDED
@@ -0,0 +1,111 @@
1
+ Thu Aug 4 2011 T Horinouchi
2
+ * version 1.7 released ((cvs) tag: numru-units-1_7)
3
+ * LICENSE.txt: added (BSD 2-clause)
4
+ * doc/units.rd, doc/units.html: updated (added entry to dcunits.txt)
5
+ Wed Aug 3 2011 T Horinouchi
6
+ * mulnode.rb: to_s changed to explicitly handle a Float
7
+ whose value is an integer.
8
+ * Makefile: adopet to the change in the "tail" command
9
+ (tail +2 --> tail -n +2).
10
+ Mon Mar 15 2010 T Horinouchi
11
+ * version 1.6 released ((cvs) tag: numru-units-1_6)
12
+ Fri May 23 2008 T Horinouchi
13
+ * dcunits.txt: added the following units: percent [S], % [S],
14
+ permil [S], centigrade [P], millibar [P]
15
+ * rules.rb: changed not to accept empty unit_spec
16
+ * lex.rb:
17
+ * method do_parse2: to treat empty string units '' as '1'
18
+ (to return NumberNode.new(1) instead of ErrorNode.new(''))
19
+ Fri Feb 8 2008 T Koshiro
20
+ * lex.rb: next_token: at least one space or tab character is required
21
+ before/after 'per', 'after', 'from', 'since', 'ref'
22
+ Wed Aug 24 2005 T Horinouchi
23
+ * version 1.5 released ((cvs) tag: numru-units-1_5)
24
+ Wed Jun 8 2005 T Horinouchi
25
+ * lex.rb:
26
+ * debug in RE_SECOND
27
+ * debug in time zone parser (many bugs)
28
+ * improvement in time parser RE_TIME to support hhmm type
29
+ in addition to [h]h:[m]m
30
+ * timenode.rb:
31
+ * TimeNode#utcsod : debug in time zone treatment
32
+ (IT WAS A FATAL BUG!!)
33
+ * TimeNode#to_s : debug in the expression of seconds (not to
34
+ take the floor of seconds).
35
+ Wed May 25 2005 T Horinouchi
36
+ * version 1.4 released ((cvs) tag: numru-units-1_4)
37
+ * lex.rb: debug in RE_HOUR. It did not handle hours after 20 properly.
38
+ Mon Nov 29 2004 T Horinouchi
39
+ * timenode.rb: class XDate: added to_date (for intenal usage), and
40
+ modified +(ohter) and -(ohter) methods to use it as long as possible.
41
+ This is to widen the coverage of time -- up to now, only very
42
+ recent years (such as AD19xx-20xx) are accpeted, since the
43
+ Time intrincic class is always used.
44
+ Tue Nov 9 2004 T Horinouchi
45
+ * lex.rb: Units#convert2: changed warning messaging to show backtrace
46
+ Sun Aug 10 2004 T Horinouchi
47
+ * lex.rb: lex.rb Units#convert, Units#==: debug not to change
48
+ (reduce5) self and input units.
49
+ Sun Aug 8 2004 T Horinouchi
50
+ * version 1.3 released
51
+ * mulnode.rb: improved Multi#sort: to eliminate Number[1] if
52
+ length >= 2. Then, Units.new('1m').reduce5.to_s gives 'm';
53
+ it used to give '1 m'.
54
+ * numbernode.rb: defined == (to compare by values -- implicitly
55
+ used in the new Multi#sort)
56
+ * dcunits.txt: added some units from udunits: Pascal, deg[KF],
57
+ deg_[CFK], degree[CFK], [Cc]elcius, angular_(degree|minute|secont),
58
+ [Ff]ahrenheit, farad, gravity, conventional_mercury, mercury,
59
+ Hg, hg, Julian_year, common_year, tesla
60
+ * lex.rb: debug === (aliased to ==. The change on May 4 was enbug).
61
+ debug =~: to handle other classes (return false)
62
+ Tue May 4 2004 T Horinouchi
63
+ * pownode.rb: PowNode#to_s: if the expopnent is 1, omit it.
64
+ * lex.rb: debug === (to allow a difference of a factor and/or offset)
65
+ Sun May 2 2004 T Horinouchi
66
+ * dcunits.txt: added degree_east/degrees_east etc.
67
+ Sun Mar 21 2004 T Horinouchi
68
+ * version 1.2 released ((cvs) tag: numru-units-1_2)
69
+ Fri Mar 19 2004 T Horinouchi
70
+ * mulnode.rb: MutiNode#value: to return 1 if @children.size == 0
71
+ * dcunits.txt: added degC
72
+ * lex.rb: convert2: warn if $VERBOSE --> warn regardress $VERBOSE
73
+ Mon Mar 1 2004 T Horinouchi
74
+ * version 1.1 released ((cvs) tag: numru-units-1_1)
75
+ Mon Mar 1 2004 E Toyoda
76
+ * test.rb: revised due to the change of reduce4; updated
77
+ * timenode.rb debugged (Unexpected generation of Float by Date#-
78
+ is avoided using Date-like wrapper to Time.)
79
+ * node.rb: unalias (such as "kilometer" -> "10^3 m") will not
80
+ occur at reduce4. (plurals still recognized in reduce4)
81
+ * namenode.rb,numbernode.rb: unused methods "nameable?" removed
82
+ * makeutab.rb: Bugfix: units like "second" or "metre" were not
83
+ unaliased to its primary name (such as "s" or "m") due to
84
+ improper parsing of dcunits.txt.
85
+ Sun Feb 29 2004 E Toyoda (Commited by T Horinouchi)
86
+ * makeutab.rb: debug plural treatment (/y$/ -> /[^aeou]y$/)
87
+ Fri Feb 27 2004 T Horinouchi
88
+ * src/lex.rb: added Units#convert2 (similar to Units#convert but
89
+ more suitable for UNumeric constraction).
90
+ debug in =~
91
+ * test.rb: added a test of =~
92
+ Thu Feb 26 2004 T Horinouchi
93
+ * src/lex.rb: added Units#factor_and_offset
94
+ * doc/units.rd: updated
95
+ Wed Feb 25 2004 T Horinouchi
96
+ * src/Makefile: add -l option to racc -- not to convert line #s
97
+ for better readability of exception messages
98
+ * Makefile: (very minor) cp --> cp -p
99
+ Tue Feb 24 2004 T Horinouchi
100
+ * version 1.0 released
101
+ * packaging for distribution
102
+ * put Units into the NumRu module ( --> class NumRu::Units )
103
+ * cvs version control started (CVSROOT=
104
+ dennou-k.gfd-dennou.org:/GFD_Dennou_Club/ftp/arch/ruby/cvsroot
105
+ project name: numru-units)
106
+ Fri Feb 6 2004 TOYODA Eizi (log written by T Horinouchi 2004/03/24)
107
+ * revised
108
+ Fri Nov 7 2003 TOYODA Eizi (log written by T Horinouchi 2004/03/24)
109
+ * revized
110
+ Fri Oct 24 2003(or before) TOYODA Eizi(log written by T Horinouchi 2004/03/24)
111
+ * created
data/LICENSE.txt ADDED
@@ -0,0 +1,34 @@
1
+ NumRu::Units is copyrighted free software by Takeshi Horinouchi and
2
+ GFD Dennou Club (http://www.gfd-dennou.org/).
3
+
4
+ Copyright 2011 (C) Takeshi Horinouchi and GFD Dennou Club
5
+ (http://www.gfd-dennou.org/) All rights reserved.
6
+
7
+ Redistribution and use in source and binary forms, with or without
8
+ modification, are permitted provided that the following conditions are
9
+ met:
10
+
11
+ 1. Redistributions of source code must retain the above copyright
12
+ notice, this list of conditions and the following disclaimer.
13
+
14
+ 2. Redistributions in binary form must reproduce the above copyright
15
+ notice, this list of conditions and the following disclaimer in
16
+ the documentation and/or other materials provided with the
17
+ distribution.
18
+
19
+ THIS SOFTWARE IS PROVIDED BY GFD DENNOU CLUB AND CONTRIBUTORS ``AS IS''
20
+ AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,
21
+ THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
22
+ PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL GFD DENNOU CLUB OR
23
+ CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
24
+ EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
25
+ PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
26
+ PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
27
+ LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
28
+ NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
29
+ SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
30
+
31
+ The views and conclusions contained in the software and documentation
32
+ are those of the authors and should not be interpreted as representing
33
+ official policies, either expressed or implied, of Takeshi Horinouchi
34
+ and GFD Dennou Club.
data/Makefile ADDED
@@ -0,0 +1,14 @@
1
+ all:
2
+ @(cd src && make && cp -p units.rb ../lib/numru/)
3
+ @(cd doc && make)
4
+
5
+ install:
6
+ ruby install.rb
7
+
8
+ test:
9
+ @(cd src && make test)
10
+
11
+ distclean: clean
12
+
13
+ clean:
14
+ @rm -f `find . -name "*~" -print`
data/Rakefile ADDED
@@ -0,0 +1,39 @@
1
+ require 'rake/gempackagetask'
2
+
3
+ NAME = 'numru-units'
4
+ VER = '1.7.0'
5
+
6
+ PKG_FILES = FileList[
7
+ '**',
8
+ 'lib/**/*',
9
+ 'doc/**/*',
10
+ 'src/**/*'
11
+ ]
12
+
13
+ spec = Gem::Specification.new do |s|
14
+ s.name = NAME
15
+ s.version = VER
16
+ s.authors = ["Eizi Toyoda","Takeshi Horinouchi"]
17
+ s.email = ['eriko@gfd-dennou.org']
18
+ s.homepage = 'http://www.gfd-dennou.org/arch/ruby/products/numru-units/'
19
+ s.licenses = ["Takeshi Horinouchi", "GFD Dennou Club"]
20
+ s.platform = Gem::Platform::RUBY
21
+ s.summary = %q{Class to handle units of physical quantities}
22
+ s.description = %q{This is a class to handle units of physical quantities. It covers most functionality of UNIDATA's UDUNITS Library, however, with a more sophisticated handling of string expressions. See the documentation for more infomation.}
23
+
24
+ s.files = PKG_FILES.to_a
25
+ s.require_paths = ['lib']
26
+ #s.test_files = Dir.glob("test/*")
27
+ #s.has_rdoc = true
28
+ s.required_ruby_version = Gem::Requirement.new(">= 1.6")
29
+ #s.add_runtime_dependency(%q<narray>, [">= 0"])
30
+ #s.add_runtime_dependency(%q<narray_miss>, [">= 0"])
31
+ #s.extra_rdoc_files = ['README']
32
+
33
+ #s.extensions << "install.rb"
34
+ end
35
+
36
+ Rake::GemPackageTask.new(spec) do |pkg|
37
+ pkg.gem_spec = spec
38
+ pkg.need_tar = true
39
+ end
data/doc/Makefile ADDED
@@ -0,0 +1,5 @@
1
+ all: units.html
2
+
3
+ units.html: units.rd
4
+ rd2 units.rd | sed -e 's/<dt>/<dt><h4>/' -e 's/<\/dt>/<\/h4><\/dt>/' \
5
+ > units.html
data/doc/units.html ADDED
@@ -0,0 +1,241 @@
1
+ <?xml version="1.0" ?>
2
+ <!DOCTYPE html
3
+ PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
4
+ "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
5
+ <html xmlns="http://www.w3.org/1999/xhtml">
6
+ <head>
7
+ <title>units.rd</title>
8
+ </head>
9
+ <body>
10
+ <h1><a name="label-0" id="label-0">class NumRu::Units</a></h1><!-- RDLabel: "class NumRu::Units" -->
11
+ <ul>
12
+ <li><a href="#label-1">Overview</a></li>
13
+ <li><a href="#label-2">Installation</a></li>
14
+ <li><a href="#label-3">Usage Examples</a></li>
15
+ <li><a href="#label-4">Class Methods</a></li>
16
+ <li><a href="#label-8">Instance Methods</a></li>
17
+ <li><a href="http://ruby.gfd-dennou.org/products/numru-units/doc/dcunits.txt">Supported units</a> (Plural form allowed if the second field is "P")</li>
18
+ </ul>
19
+ <h2><a name="label-1" id="label-1">Overview</a></h2><!-- RDLabel: "Overview" -->
20
+ <p>A class of units of physical quantities.</p>
21
+ <p>This class covers most functionality of UNIDATA's
22
+ <a href="http://www.unidata.ucar.edu/packages/udunits/">UDUNITS Library</a>,
23
+ however, with a more sophisticated handling of string expressions. </p>
24
+ <p>UDUNITS always decomposes units into the four base units and discards
25
+ the original string expressions. Therefore, 'hPa' always becomes
26
+ '100 kg.m-1.sec-1', and 'day' always becomes '86400 sec'. On the other
27
+ hand, this library tries to keep the original expressions as much as
28
+ possible by default, while allowing partial to complete decompositions
29
+ if needed.</p>
30
+ <h2><a name="label-2" id="label-2">Installation</a></h2><!-- RDLabel: "Installation" -->
31
+ <p>Move to the top directly of this library (where you find
32
+ the file install.rb). Then, type in the following:</p>
33
+ <pre>% ruby install.rb</pre>
34
+ <h2><a name="label-3" id="label-3">Usage Examples</a></h2><!-- RDLabel: "Usage Examples" -->
35
+ <p>Here is an example using the "irb" interactive shell ("%" is the
36
+ command prompt, and "&gt;&gt;" is the irb prompt -- Type in those after it
37
+ to test. "=&gt;" shows the result.):</p>
38
+ <pre>% irb --simple-prompt
39
+ &gt;&gt; require "numru/units"
40
+ =&gt; true
41
+ &gt;&gt; un1 = NumRu::Units.new('kg.m2/s')
42
+ =&gt; Units{kg.m2/s}
43
+ &gt;&gt; un2 = NumRu::Units.new('g.m')
44
+ =&gt; Units{g.m}
45
+ &gt;&gt; un3 = un1 / un2
46
+ =&gt; Units[Multi[Pow[Name[g], Number[-1]], Name[kg], Pow[Name[m], Number[1]], Pow[Name[s], Number[-1]]]]
47
+ &gt;&gt; un1.to_s
48
+ =&gt; "kg.m2/s"
49
+ &gt;&gt; un2.to_s
50
+ =&gt; "g.m"
51
+ &gt;&gt; un3.to_s
52
+ =&gt; "g-1 kg.m1 s-1"
53
+ &gt;&gt; un3.reduce5
54
+ =&gt; Units[Multi[Number[1000], Pow[Name[m], Number[1]], Pow[Name[s], Number[-1]]]]
55
+ &gt;&gt; un3.to_s
56
+ =&gt; "1000 m1 s-1"</pre>
57
+ <p>Note the difference between the results of un3.to_s
58
+ before and after un3.reduce5,
59
+ where the former retains the literal expression
60
+ of each atomic unit, while the latter does the maximum reduction.
61
+ You can change the default behavior by using the class method
62
+ reduce_level=:</p>
63
+ <pre>&gt;&gt; NumRu::Units.reduce_level = 5
64
+ =&gt; :reduce5
65
+ &gt;&gt; un3.to_s
66
+ =&gt; "1000 m1 s-1"</pre>
67
+ <p>Note that you can eliminate the prefix NumRu:: by "including"
68
+ it:</p>
69
+ <pre>&gt;&gt; require "numru/units"
70
+ =&gt; true
71
+ &gt;&gt; include NumRu
72
+ =&gt; Object
73
+ &gt;&gt; un1 = Units.new('kg.m2/s')
74
+ =&gt; Units{kg.m2/s}
75
+ &gt;&gt; Units.reduce_level = 5
76
+ =&gt; :reduce5</pre>
77
+ <h2><a name="label-4" id="label-4">Class Methods</a></h2><!-- RDLabel: "Class Methods" -->
78
+ <p>In what follows, the prefix NumRu:: is omitted for conciseness.
79
+ See <a href="#label-3">Usage Examples</a> on this issue.</p>
80
+ <dl>
81
+ <dt><h4><a name="label-5" id="label-5"><code>Units.new(<var>string</var>)</code></a></h4></dt><!-- RDLabel: "Units.new" -->
82
+ <dd>
83
+ <p>Constructor.</p>
84
+ <p>ARGUMENTS</p>
85
+ <ul>
86
+ <li>string (String): string expression of the units.
87
+ [factor] units; [factor] time units [since ...] (see EXAMPLES below)</li>
88
+ </ul>
89
+ <p>RETURN VALUE</p>
90
+ <ul>
91
+ <li>a Units</li>
92
+ </ul>
93
+ <p>EXAMPLE</p>
94
+ <pre>units = Units.new('kg.m2/s')
95
+ units = Units.new('100 m')
96
+ units = Units.new('g/kg')
97
+ units = Units.new('hour since 2003-10-01 00:00:0 +0:00')
98
+ units = Units.new('hour since 2003-10-01') # same as above
99
+ units = Units.new('minutes since 2003-10-01 03:15:22.5 -6:00')</pre></dd>
100
+ <dt><h4><a name="label-6" id="label-6"><code>Units[string]</code></a></h4></dt><!-- RDLabel: "Units[string]" -->
101
+ <dd>
102
+ Same as <a href="#label-5">Units.new</a></dd>
103
+ <dt><h4><a name="label-7" id="label-7"><code>Units.reduce_level=(<var>n</var>)</code></a></h4></dt><!-- RDLabel: "Units.reduce_level=" -->
104
+ <dd>
105
+ <p>Set the reduction level before <a href="#label-9">to_s</a> is applied.</p>
106
+ <p>ARGUMENTS</p>
107
+ <ul>
108
+ <li>n (Integer): the reduction level. The default value is 4.
109
+ Use 5 if you want a full reduction. Levels lower than 4
110
+ will not be needed.</li>
111
+ </ul></dd>
112
+ </dl>
113
+ <h2><a name="label-8" id="label-8">Instance Methods</a></h2><!-- RDLabel: "Instance Methods" -->
114
+ <dl>
115
+ <dt><h4><a name="label-9" id="label-9"><code>to_s</code></a></h4></dt><!-- RDLabel: "to_s" -->
116
+ <dd>
117
+ Returns a string expression of the units.</dd>
118
+ <dt><h4><a name="label-10" id="label-10"><code>*(<var>other</var>)</code></a></h4></dt><!-- RDLabel: "*" -->
119
+ <dd>
120
+ <p>Multiplies self with another units.
121
+ Applies <a href="#label-16">reduce4</a> to format the string expression of the result.</p>
122
+ <p>ARGUMENTS</p>
123
+ <ul>
124
+ <li>other [Units]: the other units</li>
125
+ </ul>
126
+ <p>RETURN VALUE</p>
127
+ <ul>
128
+ <li>a Units</li>
129
+ </ul></dd>
130
+ <dt><h4><a name="label-11" id="label-11"><code>/(<var>other</var>)</code></a></h4></dt><!-- RDLabel: "/" -->
131
+ <dd>
132
+ <p>Divides self with another units.
133
+ Applies <a href="#label-16">reduce4</a> to format the string expression of the result.</p>
134
+ <p>ARGUMENTS</p>
135
+ <ul>
136
+ <li>other [Units]: the other units</li>
137
+ </ul>
138
+ <p>RETURN VALUE</p>
139
+ <ul>
140
+ <li>a Units</li>
141
+ </ul></dd>
142
+ <dt><h4><a name="label-12" id="label-12"><code>**(<var>pow</var>)</code></a></h4></dt><!-- RDLabel: "**" -->
143
+ <dd>
144
+ <p>Power.
145
+ Applies <a href="#label-16">reduce4</a> to format the string expression of the result.</p>
146
+ <p>ARGUMENTS</p>
147
+ <ul>
148
+ <li>pow [Numeric -- Integer, Rational, or Float]</li>
149
+ </ul>
150
+ <p>RETURN VALUE</p>
151
+ <ul>
152
+ <li>a Units</li>
153
+ </ul></dd>
154
+ <dt><h4><a name="label-13" id="label-13"><code>==(<var>other</var>)</code></a></h4></dt><!-- RDLabel: "==" -->
155
+ <dd>
156
+ Whether the two units are the same.
157
+ ('m/s' and 'm.s-1' are the same, for instance.)</dd>
158
+ <dt><h4><a name="label-14" id="label-14"><code>===(<var>other</var>)</code></a></h4></dt><!-- RDLabel: "===" -->
159
+ <dd>
160
+ Same as <a href="#label-13">==</a>.</dd>
161
+ <dt><h4><a name="label-15" id="label-15"><code>=~(<var>other</var>)</code></a></h4></dt><!-- RDLabel: "=~" -->
162
+ <dd>
163
+ Whether the two units are compatible (i.e., with the same dimensionality).
164
+ ('m/s' and '10 m.s-1' are compatible, for instance.)</dd>
165
+ <dt><h4><a name="label-16" id="label-16"><code>reduce4</code></a></h4></dt><!-- RDLabel: "reduce4" -->
166
+ <dd>
167
+ <p>Moderately reduces the string expression of the units (destructive method).
168
+ This method preserves string expression of atomic units.
169
+ See also <a href="#label-17">reduce5</a>.</p>
170
+ <p>RETURN VALUE</p>
171
+ <ul>
172
+ <li>self</li>
173
+ </ul>
174
+ <p>EXAMPLE</p>
175
+ <pre>Untis.new('hour/hour').reduce4.to_s
176
+ # =&gt; "1"
177
+ Units.new('mm/m').reduce4.to_s
178
+ # =&gt; "mm.m-1"</pre></dd>
179
+ <dt><h4><a name="label-17" id="label-17"><code>reduce5</code></a></h4></dt><!-- RDLabel: "reduce5" -->
180
+ <dd>
181
+ <p>Aggressively reduces the string expression of the units (destructive method).
182
+ See also <a href="#label-16">reduce4</a>.</p>
183
+ <p>RETURN VALUE</p>
184
+ <ul>
185
+ <li>self</li>
186
+ </ul>
187
+ <p>EXAMPLE</p>
188
+ <pre>Units.new('hour/hour').reduce4.to_s
189
+ # =&gt; "1"
190
+ Units.new('mm/m').reduce5.to_s
191
+ # =&gt; "0.001"</pre></dd>
192
+ <dt><h4><a name="label-18" id="label-18"><code>convert(<var>numeric</var>, <var>to_units</var>)</code></a></h4></dt><!-- RDLabel: "convert" -->
193
+ <dd>
194
+ <p>Converts a numeric of the current units (=self) to <var>to_units</var>.</p>
195
+ <p>ARGUMENTS</p>
196
+ <ul>
197
+ <li>numeric [Numeric]: the numeric to convert</li>
198
+ <li>to_units [Units]: the units converted into</li>
199
+ </ul>
200
+ <p>RETURN VALUE</p>
201
+ <ul>
202
+ <li>a Numeric</li>
203
+ </ul>
204
+ <p>EXCEPTIONS</p>
205
+ <ul>
206
+ <li><var>self</var> and <var>to_units</var> are incompatible.</li>
207
+ </ul></dd>
208
+ <dt><h4><a name="label-19" id="label-19"><code>convert2(<var>val</var>, <var>to_units</var>)</code></a></h4></dt><!-- RDLabel: "convert2" -->
209
+ <dd>
210
+ <p>Like <a href="#label-18">convert</a>, but (1) accpets any Numeric-like objects, and (2)
211
+ does not raise an exception even if the two units are incompatible --
212
+ in this case, simply returns <var>val</var> (warned).</p>
213
+ <p>ARGUMENTS</p>
214
+ <ul>
215
+ <li>val [a Numeric-like class, for which * and + are defined]:
216
+ the value to convert</li>
217
+ <li>to_units [Units]: the units converted into</li>
218
+ </ul>
219
+ <p>RETURN VALUE</p>
220
+ <ul>
221
+ <li>an object with the same class as <var>val</var>.</li>
222
+ </ul></dd>
223
+ <dt><h4><a name="label-20" id="label-20"><code>factor_and_offset(<var>to_units</var>)</code></a></h4></dt><!-- RDLabel: "factor_and_offset" -->
224
+ <dd>
225
+ <p>Returns the factor and offset to convert from <var>self</var> to <var>to_units</var>.
226
+ The conversion is done as scale_factor * operand + add_offset.</p>
227
+ <p>ARGUMENTS</p>
228
+ <ul>
229
+ <li>to_units [Units]: the units to be converted into</li>
230
+ </ul>
231
+ <p>RETURN VALUE</p>
232
+ <ul>
233
+ <li>[ scale_factor, add_offset ] (a 2-element Array, where both are Numeric)</li>
234
+ </ul>
235
+ <p>EXAMPLE</p>
236
+ <pre>scale_factor, add_offset = from_units.factor_and_offset(to_units)
237
+ to = scale_factor * from + add_offset</pre></dd>
238
+ </dl>
239
+
240
+ </body>
241
+ </html>