[HN Gopher] GNU Units
___________________________________________________________________
GNU Units
Author : tosh
Score : 331 points
Date : 2021-01-06 12:59 UTC (10 hours ago)
(HTM) web link (www.gnu.org)
(TXT) w3m dump (www.gnu.org)
| liminal wrote:
| Units should be built into languages! Others have pointed to some
| libraries that make this possible in C++ and Rust; I'm sure it
| exists for other languages too. But this seems still short of
| what's needed: Every number in an application should be of a
| certain type and those types should combine on mathematical
| operations. Often those types already exist within the
| application's type model -- i.e. every class/interface is an
| obvious candidate. Then it would just be a matter of assigning
| those types to numbers. This would yield the ability to express
| things like Users/Client or Requests/second through simple math
| operations on variables and have it all type checked.
| db48x wrote:
| It's a lot harder to do well than it looks, mostly because unit
| systems were invented by humans and have a lot of aggravating
| edge cases and oddities. For example, most units can be
| converted to another unit of the same dimensionality by
| mulitiplication or division (such as length in inches * 2.54 ==
| length in millimeters), but then there's temperature where you
| also need to add or subtract an offset.
|
| It's almost as if humans spent thousands of years inventing
| units without ever once considering how difficult they might be
| to implement in a computer programming language.
| Symbiote wrote:
| Are there any edge cases if we just stick to SI units?
|
| Most of the world doesn't care about the thousand-year units,
| and the bit that does could just convert to them on output.
| db48x wrote:
| Temperature, times, dates, cgs vs mks, dimensionless
| quantities, angles, the list goes on and on.
|
| And that's before you get into the technical details of how
| you store units and conversion factors in memory, how you
| handle precision when mixing large and small units, how you
| interact with unlimited-precision and rational numbers, how
| you use or avoid the type system in your programming
| language, how users of your unit library define their own
| units...
|
| Here's a good write-up of what they're thinking about for
| future versions of C++: http://www.open-
| std.org/jtc1/sc22/wg21/docs/papers/2020/p193.... It's worth
| a read even if you don't write in C++.
|
| And if you bake it into your language, you'd better get it
| all right the first time, because you probably won't be
| able to fix it later.
| fuball63 wrote:
| Ada does this well with its concept of subtypes; so you could
| subtype Int to your unit, and even give it valid ranges. It's
| then typechecked by the compiler.
| dredmorbius wrote:
| A favourite tool, which I also found via Trey Harris's speed-of-
| light email post.
|
| I've written a few quick guides and examples using GNU units:
|
| GNU 'units' utility and energy / resource calculations
|
| https://old.reddit.com/r/dredmorbius/comments/1x9u0f/gnu_uni...
|
| How many Hiroshima bombs in a Ferrari, with mass-energy
| conversion (or how I learned to extend GNU units)
|
| https://old.reddit.com/r/dredmorbius/comments/1yvxde/how_man...
|
| And for assessing specifc alternative energy claims:
|
| Boeing's Biofuel "Breakthrough" -- Less than overwhelming
|
| https://old.reddit.com/r/dredmorbius/comments/1wo2hl/boeings...
| johnisgood wrote:
| GNU Units is a beautiful piece of software. I keep using it for
| everything. You can convert between currencies, too.
|
| If GNU Units cannot do something, I resort to using Maxima[1].
|
| [1] https://maxima.sourceforge.io
| ISL wrote:
| If Units can convert between currencies, how does it source the
| exchange rates? They change on sub-second time scales and
| bid/ask spreads make the notion of a rate somewhat uncertain.
|
| Edit: answering my own question. There are multiple providers,
| some requiring API-key signup, but the answer is far from
| definitive:
| https://www.gnu.org/software/units/manual/html_node/Currency...
| [deleted]
| Ajedi32 wrote:
| I've been using WolframAlpha for this sort of thing. The idea
| of using something fully local and open-source does have some
| appeal, but it's hard to compete with the convenience of Ctrl+T
| "wo" <Tab> <Query> <Enter>.
| pbhjpbhj wrote:
| I used to love Wolfram Alpha but it hasn't worked for me for
| several years and I've been unable to find out why.
|
| Just tested now and it does work on Android FF - yay! But not
| on my desktop (neither Chrome nor Edge). Doesn't work for me
| on Firefox nor Brave either (neither Win10 nor Kubuntu). I
| have randomly assigned IP from major UK provider (which
| provider has also changed). Doesn't work through my work VPN
| either.
|
| I've taken to using Geogebra (online) when I quickly need a
| function plotting.
| TeMPOraL wrote:
| You mean Ctrl+T "wo" <Tab> <Query> <Enter> <Wait 15 to 60
| seconds for the page with your results to load> <Get
| something that's a mighty pain to copy/paste from>.
|
| This experience is why I stopped using W|A few years ago.
| It's awesome, but it's also a pain.
| Ajedi32 wrote:
| Can relate; that's definitely been an issue for me as well.
| Though on the plus side it's nice to be able to open
| multiple tabs, make small tweaks to the formula, and switch
| between them to compare results.
|
| Kinda wish there was an open source browser-based
| WolframAlpha alternative which did more of the computation
| locally so everything wasn't so slow.
| adrianmonk wrote:
| I recommend the "-1" (also called "--one-line") flag for bc.
|
| It takes away the extra (to me) reciprocal conversion factors.
| (Note: it's the number one, not a lowercase "L".)
|
| Without: $ units Currency exchange
| rates from FloatRates (USD base) on 2019-05-31 3460
| units, 109 prefixes, 109 nonlinear units You
| have: inch You want: cm * 2.54 /
| 0.39370079 You have:
|
| With: $ units -1 Currency exchange
| rates from FloatRates (USD base) on 2019-05-31 3460
| units, 109 prefixes, 109 nonlinear units You
| have: inch You want: cm * 2.54 You have:
|
| To me the reciprocals are just clutter. If I want a reciprocal, I
| will just type the two parts of my query in the opposite order.
| I'd even say they're confusing because you have to look at them
| understand why there are two numbers.
|
| (Also on the subject of flags, I'd like one that suppresses the
| first two lines of output but not the prompts like "You have:".)
| scaladev wrote:
| Did you paste that printout from a recent run of units? If so,
| the currency rates are pretty useless. You can configure the
| system to update them daily (or however you like) with
| something like this: $ cat
| /etc/systemd/system/units-currency-update.service [Unit]
| Description=Update units(1) currency rates
| [Service] Type=oneshot Nice=19
| ExecStart=/usr/bin/units_cur $ cat
| /etc/systemd/system/units-currency-update.timer [Unit]
| Description=Update units(1) currency rates [Timer]
| OnCalendar=daily AccuracySec=3h
| RandomizedDelaySec=3h Persistent=true
| [Install] WantedBy=timers.target #
| systemctl daemon-reload # systemctl enable units-
| currency-update.timer
| boogies wrote:
| Or just something like 0 0 * * * nice -n 19
| /usr/bin/units_cur
|
| for *BSD crontabs or both HN users (besides me) who prefer
| systemd-free distros of GNU
| hprotagonist wrote:
| _> Like many similar programs, it can handle multiplicative scale
| changes. It can also handle nonlinear conversions such as
| Fahrenheit to Celsius_
|
| how is C = (5/9)(F-32)
|
| not linear?
| oddeyed wrote:
| In certain contexts (such as linear algebra), linear refers to
| the fact that the mapping must cross the origin.
|
| This follows from the constraint that for a linear map f, f(a +
| b) = f(a) + f(b), which is not true for the farenheit-celsius
| example.
|
| EDIT: See
| https://en.wikipedia.org/wiki/Linear_function#As_a_linear_ma...
| jtanderson wrote:
| Also: a linear function plus a constant is said to be affine!
|
| Reference: https://mathworld.wolfram.com/AffineFunction.html
| phkahler wrote:
| I just learned something. Is it correct to call both of the
| first order? Or is that term really only to be used for the
| underlying polynomials?
| dan-robertson wrote:
| I think of nth order as mostly just applying to
| approximations. But I guess first order would be ok here.
| olikas wrote:
| If f is linear, then f(a)=f(a+0)=f(a)+f(0). So f(0)=0.
| HourglassFR wrote:
| Because 0degC is not 0degF
| [deleted]
| SahAssar wrote:
| As I understood it: C to K would be linear since they are
| always offset by the same amount, but 0degC is not 0degK. C
| to F is not linear since they are not offset by the same
| amount.
| _0ffh wrote:
| It seems to me C to K is affine as well. True, it's
| somewhat special in that the factor is exactly one, but if
| there's an offset it's not linear in the sense of the
| sentence under discussion.
| dhosek wrote:
| That's not how it works. The definition of linear used in
| this context requires f(a+b) = f(a) + f(b) which is not the
| case with the C to K translation which is f(x) = x + 273.15
| Only functions in the form y=mx+0 meet the criteria.
| mcguire wrote:
| Frim jxy's 6th edition man page:
|
| " _Units only does multiplicative scale changes. Thus it can
| convert Kelvin to Rankine, but not Centigrade to Fahrenheit._ "
| wl wrote:
| It's affine. It's not linear because the offset means
| superposition doesn't hold.
| CyberRabbi wrote:
| It's linear in terms of its order but it's not a linear
| transformation, which must satisfy:
| f(c*(a+b)) = c*f(a) + c*f(b)
|
| Where c is a scalar. A and b are abstract objects. Examples
| include vectors, real numbers, and functions themselves.
| jhoechtl wrote:
| It's even in the documentation to Units:
|
| > But Fahrenheit to Celsius is linear, you insist. Not so. A
| transformation T is linear if T(x+y)=T(x)+T(y) and this fails
| for T(x)=ax+b . This transformation is affine, but not linear.
|
| https://www.gnu.org/software/units/manual/html_node/Overview...
| amelius wrote:
| Linear does not mean "graph is a line". It means "graph is a
| line through origin" (in the 2d case).
|
| Somewhat counterintuitive, but that's how it's defined.
| diarrhea wrote:
| The Wikipedia article someone else posted already seems to
| disagree: https://en.wikipedia.org/wiki/Linear_function. This
| confuses me.
| TeMPOraL wrote:
| The article actually agrees.
|
| > _In mathematics, the term linear function refers to two
| distinct but related notions (...) [proceeds to specify
| them using incomprehensible math words]_
|
| GNU Units documentation uses the second notion, common with
| linear algebra (and thus arguably more common in any
| computing) - the notion that calls y=ax a linear function,
| and y=ax+b an _affine_ function.
| tait wrote:
| So, rather than calling it non-linear, which is clearly
| somewhat confusing, perhaps it would be more clear to
| state that it handles affine functions like F to C...?
| zeroimpl wrote:
| Agreed. Why they wasting our time pointing out it's "non-
| linear" when this statement is only true for some
| definitions of linear? Just pick a non-ambiguous word, or
| add an asterisk and footnote.
| TeMPOraL wrote:
| Perhaps. That's what I myself did when adding handling
| for affine unit conversions in a project I worked on.
| bjeds wrote:
| How does GNU Units compare to Frink ( https://frinklang.org/ )?
| maxerickson wrote:
| Units is older, frink is a lot bigger, it's a whole programming
| environment.
|
| Frink started from and extended the units defined by Units, I
| don't know if anything has gone in the other direction.
|
| Later: for simpler calculations an interesting feature frink
| adds is the ability to do interval arithmetic. Terms can be
| specified as ranges that are then carried through the
| calculations to the result.
| samatman wrote:
| The author of Frink takes particular pride in doing unit maths
| _correctly_.
|
| For example, if the conversion between two units is defined by
| statute to be some weird ratio, Frink will use that, and not
| merely the best f64 approximation of that ratio.
|
| As indicated by a sibling comment, Frink also handles interval
| maths, and in general it just has a remarkable amount of
| features, being a fully-fledged programming language.
|
| It's a pity it isn't open-source, the author says he doesn't
| want the aggravation of having to deal with pull requests and
| so on, and just wants to work on his software project on his
| own. Which, ok, that's fair: but at least Lua and SQLite don't
| accept contributions from outside the team, so there's a model
| for releasing open-source software without having to
| collaborate with the general public.
|
| No question that it would increase the size of his inbox
| though, so I get it.
| jillesvangurp wrote:
| Looks like it is comparable to javax.measure
| (https://jcp.org/en/jsr/detail?id=363). I used an
| implementation of that a few years ago:
| https://github.com/unitsofmeasurement/uom-se
|
| It's a complex domain, especially if you get down to having
| more complex units composed of other units and want to do
| conversions between metric and imperial. In our case we were
| dealing with material properties (chemical, physical, magnetic,
| etc.) and different countries and companies using different
| ways to record characteristics for materials.
| [deleted]
| gwbas1c wrote:
| IMO, a port to a browser or mobile app makes a lot of sense.
| annoyingnoob wrote:
| Came to say the same. Free and quality mobile apps without ads
| are sorely lacking.
|
| Obviously there are some stark philosophical differences
| between GNU and the walled gardens of mobile devices. But users
| don't care about that, they just want good software.
| gquiniou wrote:
| Does the GNU projet make its repositories available online ?
|
| I'd like to have a look at the code but all I found is an
| outdated mirror : https://github.com/ryantenney/gnu-units
| notRobot wrote:
| Here you go:
|
| http://savannah.gnu.org/projects/units
|
| All official GNU software is hosted here:
| http://savannah.gnu.org
| wheybags wrote:
| GNU Savannah is where they keep their source IIRC.
| https://savannah.gnu.org/projects/units
|
| Unfortunately it looks like the upstream for this project is
| in... cvs
| kps wrote:
| For comparison, the original: https://minnie.tuhs.org/cgi-
| bin/utree.pl?file=V7/usr/src/cmd...
|
| (Slightly discombobulating to read some of today's lucky 10,000
| treating `units` as a (GNU) novelty when it's been around for
| 40+ years.)
| bodyfour wrote:
| Or if you'd rather see it in git
| https://github.com/dspinellis/unix-history-
| repo/blob/BSD-4-S...
| kumarsw wrote:
| Looks cool. If the poster is affiliated with the project, some
| suggestions:
|
| 1. I don't know what I am looking at with the examples. I think
| that this is an interactive session with the program, but this is
| not clear. 2. It is also unclear how to start the program as the
| executable name is not specified. This and the former point could
| be addressed by including one of those gifs of an interactive
| session that are popular in GitHub readmes these days. Sure, they
| are a bit gimmicky, but still useful. 3. It is not clearly stated
| if this is an executable program or a library. I believe it is
| the former, but this is nowhere in the introduction. 4. Probably
| this is included with a number of package managers. If that is
| the case, instructions for installing via a package manager would
| be helpful, especially since the name is not particularly unique.
| Enginerrrd wrote:
| No please don't use a gif. That's a terrible way to present
| information and leads to accessibility issues in documentation
| where it has no business. Instead, just show a shell prompt and
| the command needed to launch the program.
| philjackson wrote:
| So long as those with disabilities are also accounted for,
| using gifs are a great way to demonstrate usage. I always
| appreciate running across them when I hit a readme.
| selestify wrote:
| Out of curiosity, what makes gifs better than static text
| for you?
| adrianmonk wrote:
| I dislike them, but I see one benefit: they increase
| effective screen real estate by leveraging time as an
| additional dimension.
|
| I guess they also allow you to passively view a sequence
| of stuff instead of having to actively scroll to move
| through the sequence. Maybe that feels easier to some
| people.
| [deleted]
| adrianmonk wrote:
| I see how they're useful, but I'm still not fond of them
| because:
|
| (1) Often, the speed is wrong. Either they play too fast to
| follow along or they play too slowly and time is wasted
| waiting for it to show me the part I care about (or loop
| back around).
|
| It's hard to get the speed just right. And AFAIK browsers
| don't offer controls to adjust the speed, and even if they
| did, it would be tedious.
|
| (2) Personally I find animations (especially rapid or
| looping ones) quite distracting when trying to read the
| rest of the page. My eye just keeps moving to the thing
| that's trying to grab my attention.
|
| I usually try to work around that by scrolling so that the
| animation is out of view. So, I'll live, but it's not a
| good user experience. And again, (some?) browsers seem to
| offer no help, like a setting to always enable animation
| controls (play/pause/etc.) or to loop only once.
| c22 wrote:
| There's a link to the documentation [0] right on the page. The
| documentation is very clear.
|
| People should read their package manager's documentation for
| help using their package manager.
|
| [0] https://www.gnu.org/software/units/manual/units.html
| kumarsw wrote:
| I agree with you, but package names aren't predictable. I
| find that an example of installing a package is helpful even
| for users familiar with use of package managers as it gives
| context and helps readability. Whenever I see `sudo apt-get
| somethingsomething` I immediately know that
| somethingsomething is the package name.
| Symbiote wrote:
| It's an old GNU tool. The package name will be "units"
| everywhere.
| samatman wrote:
| On Homebrew, at least, it's `gnu-units`.
|
| If you try to install just `units`, brew is smart enough
| to suggest it, however.
| nemetroid wrote:
| Application developers typically do not decide package
| names (unless they provide their own package repository),
| distribution maintainers do. Package names may change over
| time, and might be different for different distributions
| (or even between different versions of the same
| distribution), even if they use the same package format.
|
| Of course, application developers may decide anyway to keep
| track of package names for their N favourite distributions
| and display them on their website. But to me it comes
| across as a waste of useful space.
| laumars wrote:
| This is a GNU implementation of an old UNIX tool. It's older
| than Linux, let alone package managers. There's also BSD and
| other implementations available (the BSD version comes pre-
| installed on macOS).
|
| This isn't some new tool that is uncommon in UNIX systems, it's
| something that a lot of OSs ship with their base install and
| have done for several decades.
|
| The reason why that matters is because documentation was very
| different back then. People relied on 'man' pages and physical
| binders with printed instructions. READMEs did exist but they
| were plain text (not even markdown) and that was generally just
| there to explain how to compile the source (the compilation
| would create man pages)
| ignoranceprior wrote:
| > the BSD version comes pre-installed on macOS
|
| As discussed elsewhere in the thread
| (https://news.ycombinator.com/item?id=25659223), it looks
| like macOS uses an early version of GNU Units.
| laumars wrote:
| Ahh yes, before it adopted GPL. I should have spotted that
| because it's very typical of Apple hehe
| [deleted]
| wyldfire wrote:
| Maybe a shell script showing the inputs more explicitly would
| help? echo -e '500 miles\nkm' | gnu-units-
| executable-name
|
| But I'm pretty sure from reading the post that units prompts
| you first for 'you have' (units and/or measurement to convert)
| and then prompts you for 'you want' (units to convert to).
| nousermane wrote:
| Do GNU Units handle units with implicit parameters?
|
| For example, 1500 mAh (milliamp*hours) could be converted to 5.55
| Wh (watt*hours), or 19.98 kJ in SI units, in the context of a
| 3.7-volt battery.
|
| Naive approach fails: $ units "1500
| milliampere*hours at 3.7 volts" "watt*hours" conformability
| error 1.9593687e+09 kg^2 m / s^4 3600 kg
| m^2 / s^2
| johnisgood wrote:
| You have: 1500 mA * hr * 3.7 V You want: kJ
| * 19.98 / 0.05005005 You have: 1500 mA
| * hr * 3.7 V You want: watt * hours * 5.55
| / 0.18018018
| fanf2 wrote:
| You are multiplying mAh, volts, and atmospheres. ("at" is a
| unit not an operator.) You want to just multiply mAh and V like
| You have: 1500 mA hours * 3.7V You want: W hours
| * 5.55 / 0.18018018
| sls wrote:
| You have: 1500 mA * hours * 3.7 V You want: watt * hours
| * 5.55 / 0.18018018
| wscott wrote:
| I typically use google for most unit conversions. How much
| concrete do I need for my driveway? I type this at the top of
| Chrome: 1/4 mile * 8ft * 4in in yd^3
| Cerium wrote:
| My favorite Google unit query: "the speed of light in ghz*in".
| The answer is the interesting and useful 11.8028527.
| Interesting because if you have not studied microwaves, you
| might not even know that as a unit for the speed of light,
| useful because it makes clear the relationship between
| wavelength and antenna length. Divide to cancel frequently and
| you have wavelength.
| mark-r wrote:
| Grace Hopper used to give talks and hand out 11.8 inch pieces
| of wire, calling them nanoseconds.
| https://en.wikipedia.org/wiki/Grace_Hopper#Anecdotes
| singularity2001 wrote:
| I think I'm using it incorrectly:
|
| ./units "3 km in miles" Definition: 122632.01 m^3
| mssdvd wrote:
| Try: units 3km miles
| Symbiote wrote:
| "in" is the abbreviation for inches, and school maths/physics
| class taught us that length x length x length = volume, which
| is exactly what you have: 3 kilometres x 1 inch x 1 mile.
|
| My physics lessons at secondary school must have spent at least
| a week on SI units, base and derived units:
| Force = mass x acceleration N = kg x m*s-2
| (i.e. a Newton is a kilogram-metre-per-second-squared.)
| Pressure = force / area Pa = N / m2
| Pa = kg*m*s-2 / m2 Pa = m-1*kg*s-2 (So
| Pascals are Newtons-per-square-metre, or kilograms-per-metre-
| per-second-squared.)
| sequoia wrote:
| I must be dense but what do the star and the slash mean? It looks
| like "multiply by" and "divide by" but it appears to have results
| of the conversion next to the star... Do the docs explain this
| and I missed it? You have: 1 lbs You
| want: kg * 0.45359237 / 2.2046226 You
| have: 2 lbs You want: kg * 0.90718474 /
| 1.1023113 You have: 2.4 lbs You want: kg
| * 1.0886217 / 0.91859276
| djur wrote:
| It's just showing the inverse. It makes more sense if you don't
| enter a number for the first unit: You have:
| kg/day You want: lb/hr * 0.091859276 /
| 10.886217
| yrro wrote:
| It's in the manual:
|
| https://www.gnu.org/software/units/manual/html_node/Interact...
|
| "The second number gives the conversion in the opposite
| direction."
|
| Try with 'units --verbose' and you get nicer output:
| $ units lb kg lb = 0.45359237 kg lb = (1 /
| 2.2046226) kg
| [deleted]
| oblio wrote:
| > You have: 1|6 cup
|
| Is that a pipe for division?
| fanf2 wrote:
| It has both / for division with the usual precedence and | for
| very tight-binding division, for use in fractions. So 1/6 cup
| parses as 1/(6 cup) but 1|6 cup parses as (1/6) cup.
| kazinator wrote:
| > _nonlinear conversions such as Fahrenheit to Celsius_
|
| The heck? "y = ax + b" is linear; just not homogeneous linear.
|
| https://en.wikipedia.org/wiki/Fahrenheit#Definition_and_conv...
|
| https://en.wikipedia.org/wiki/Homogeneous_function
| contravariant wrote:
| It's not a linear function for what it's worth. It breaks the
| f(x + y) = f(x) + f(y) part of linearity.
|
| It _is_ a linear equation, confusingly enough.
| kazinator wrote:
| That's linear in the sense of "linear operator" or "linear
| map". I've never heard "nonlinear" as the opposite of that
| due to to a constant offset. "Linear map" and "linear
| operator" are used in contexts where homogeneity is a given.
|
| A scaling plus displacement is linear in the sense of "linear
| equation" because, for instance, if you scale a signal and
| add DC offset, there is no distortion; no new harmonics are
| present in the output signal.
|
| ax + by + c is called linear because the plot of points which
| satisfy the equation form a straight line; there is nothing
| confusing about it whatsoever.
|
| Temperature _delta_ conversions between C and F are certainly
| a linear map /operator. If it gets 5degC hotter, and then
| 3degC hotter, making 8degC hotter, that's exactly like 9degF
| hotter plus 5.4degF hotter making 14.4degF hotter.
|
| Here is a test for linearity for a real-valued one-argument
| function which is not confused by an offset:
| x + y f(x) + f(y) f( ------ ) = -----------
| 2 2
|
| Works just fine for degC/degF.
|
| There is another criterion for a linear map that hasn't been
| mentioned, though: f(ax) = af(x).
| adrianmariano wrote:
| GNU units supports normal unit conversion, such as meters
| to feet. These conversions all obey f(ax)=af(x), that is,
| if you have zero meters you have zero feet. If you want to
| convert something that breaks that rule then you have to
| give a definition in the database as a general functional
| form or as a lookup table. And you have to use functional
| syntax to perform the conversion. Some examples in the
| database include dB, wire gauge, shoe size, grit size for
| sandpaper, ring size, musical intervals, and sugar
| concentration. I call units defined using a lookup table or
| general functional form "nonlinear units".
|
| Zero degrees Fahrenheit is of course not equal to 0 K, but
| conversion of absolute temperature is not presented as the
| best example of this class of unit conversion. It's
| highlighted because everybody asks about it. Temperature
| conversion was for years, before I figured out a way to
| support it elegantly, the most requested missing feature.
| Yes, it's a little strange to call affine transformations
| "nonlinear" but there is no special "affine unit" feature
| in the program.
| kazinator wrote:
| Speaking of K, Celsius to K is also "nonlinear" math: you
| add or subtract a constant, around 272-something.
| contravariant wrote:
| Well one way or another it's not a linear function, so
| calling it a non-linear conversion is technically not
| incorrect.
|
| That said I completely agree that it makes _way_ more sense
| to just call it a linear conversion and to pick an example
| that 's truly nonlinear. Not that there are that many non-
| linear units, but something like decibel or beaufort might
| work.
| kazinator wrote:
| Insistence that "linear function" is defined one way is
| not supported by facts:
|
| https://en.wikipedia.org/wiki/Linear_function
|
| A "linear function" refers to a "linear map" only in
| certain contexts.
|
| The word "affine" can be used for a mapping that fails to
| meet the definition of a linear map operator due to
| offsets. That is much better than "nonlinear".
| typhonius wrote:
| My first exposure to GNU Units was when I read the story about
| emails failing if they were to be sent more than 500 miles.
|
| I'm sure it's popped up here before but here's a link for those
| who haven't come across it:
| https://www.ibiblio.org/harris/500milemail.html
| lozf wrote:
| Same here back in the early aughts, but it took me a while to
| really dig in and discover that units also handles times too.
|
| e.g. units "sec $(echo $SECONDS)" "day;hr;min;sec"
| philjackson wrote:
| Useless use of echo there.
| techbio wrote:
| Extraneously strenuous use of "useless" when using
| "redundant" would have done...unless useless has another
| usage.
|
| EDIT: The commenter echoed, duckly.
| lozf wrote:
| noted, thanks
| x0 wrote:
| It's very important to watch out for useless uses of
| echo/cat. What is cat, a few megabytes now? Fine for those
| of us on modern hardware, but you never know what PDP-11
| user is going to copy paste your comment into their
| terminal.
| ttul wrote:
| Not unless you're also trying to demonstrate the magic of
| fork.
| blauditore wrote:
| Fun story, but the numbers don't add up for me:
|
| Wouldn't the signal have to do a full round trip within the
| timeout of 3 ms, meaning it could not go beyond 580 / 2 = 290
| miles?
|
| Additionally, the connection from A to B is usually not a
| straight line, and at that time fiber lines were much less
| widespread. All these factors combines make it unlikely that
| even 200 miles could be reached...
| YesThatTom2 wrote:
| I remember chatting with Trey about this as it happened in
| real time.
|
| I love that every time this link gets posted to HN someone
| says it looks like a hoax.
| saagarjha wrote:
| I love that every time someone says something is a hoax a
| person who was there shows up to correct the record :)
| coffeemaniac wrote:
| This is addressed in the FAQ[1].
|
| > That three millisecond time doesn't make sense as the
| timeout for a connect() call.
|
| > Yes, I know. And it wasn't the timeout, actually. In the
| story, I make it sound like it took all of ten minutes from
| being made aware of the 500-mile email limit and determining
| a 3 ms light-speed issue. In fact, this took several hours,
| and quite a bit of detective work. The point is, eventually I
| came up with that figure, ran units, and gagged on my latte.
| (I'm fairly certain it was a different latte from the one I
| started with.) So what, in particular, is your question about
| the 3 ms figure?
|
| [1] https://www.ibiblio.org/harris/500milemail-faq.html
| mulmen wrote:
| The FAQ [1] addresses both of these questions. See numbers 8
| and 15, respectively.
|
| [1]: https://www.ibiblio.org/harris/500milemail-faq.html
| generalizations wrote:
| Last time this showed up on here, a poster claimed to be the
| consultant who did the upgrade and caused the problem.
| cgranier wrote:
| Same here... And I think it was quoted here a week or so ago
| again. Great story.
| tunnuz wrote:
| Love it!
| wcoenen wrote:
| For the non-unix folk: I regularly use wolframalpha.com for
| similar things.
|
| Example query to estimate how much electricity bitcoin miners can
| afford to use at current prices:
|
| https://www.wolframalpha.com/input/?i=%28%286.25+bitcoin+%2F...
| Symbiote wrote:
| I started using this tool some years ago after I found out the
| CO2 cost of a Google search. I don't need a web query when I
| search "40000lb in tonnes" when reading an American news article,
| for example. units 40000lb tonnes *
| 18.143695
|
| It even includes currencies. "sudo units_cur" will update the
| exchange rate data file, if you need that. units
| 50GBP USD * 68.143948
| Freak_NL wrote:
| > "sudo units_cur" will update the exchange rate data file, if
| you need that.
|
| Oh good tip that. I noticed the package on Ubuntu 20.04 came
| with currency conversion from 2019. Not very useful without
| updating it.
| skissane wrote:
| > It even includes currencies. "sudo units_cur" will update the
| exchange rate data file, if you need that.
|
| Doesn't work for XDR. Of course, who needs XDR? I sure don't.
| But you can get the XDR exchange rate with this command:
|
| curl -d '__EVENTTARGET=lbnTSV' POST -v
| https://www.imf.org/external/np/fin/data/rms_sdrv.aspx
|
| Maybe someone should integrate that into units_cur.
| jxy wrote:
| It's not about GNU.
|
| V6 Unix (circa 1975) had it:
| http://man.cat-v.org/unix-6th/6/units
|
| Your macOS have the BSD version: % units -v
| units version 1.0 Copyright (c) 1993 by Adrian Mariano
| This program may be freely distributed usage: units [-f
| unitsfile] [-q] [-v] [from-unit to-unit]
| boomboomsubban wrote:
| I'm not sure of the total history, but "by Adrian Mariano"
| means macOS uses GNU units. Wiki says they forked a copy before
| the license change.
| jxy wrote:
| You are probably right.
|
| The one in FreeBSD is from NetBSD: https://svnweb.freebsd.org
| /base/head/usr.bin/units/units.c?v...
|
| The NetBSD version is from Adrian Mariano: http://cvsweb.netb
| sd.org/bsdweb.cgi/src/usr.bin/units/units....
|
| The one in Plan9 is in yacc:
| http://9p.io/sources/plan9/sys/src/cmd/units.y
|
| This GitHub repo claims to be V6: https://github.com/memnoth/
| unix-v6/blob/master/source/s2/uni...
| boogies wrote:
| It's about Unix, and GNU's Not happens to be the best
| implementation of it. Which is why macOS copies pieces of it,
| despite needing to use obsolete versions in order to comply
| with Apple's hatred for end-user freedom.
| derefr wrote:
| I've always wondered why units(1) isn't a library. I'd love to
| have access to abstract "united quantities" and "united
| measurements" in my HLL of choice, rather than needing to switch
| to a special-purpose tool (units, Frink) or a statistical-
| analysis language like R just to get them.
|
| Sometimes I need to bust out stoichiometry-like unit-balancing in
| the middle of my code, and I want type enforcement that I'm
| getting the right units in the output! Sometimes I want to do a
| series of floating-point calculations, and I need to put error-
| bars on the result, and it'd be great if those were tracked for
| me in the form of a measurement ADT that tracked sig-figs. Etc.
|
| My only guess for why there's no libunits, is that it'd be a
| obtrusive black-box of operational non-guarantees if it was
| implemented in C, given that what Units does -- if naively
| implemented -- would be heavy on arbitrary memory allocations,
| and basically necessitate garbage collection.
|
| It'd make much more sense for a libunits to exist as a C++-ish
| "template library" that takes an allocator as an argument; but
| that doesn't really help anyone who wants to use any language
| other than C++ (as the template parameters can't be exposed in
| the C wrapper code that other languages FFI to.)
|
| (Before someone asks, you could get a _limited_ kind of united-
| quantities -- ones that can only represent "realistic" units --
| with a static per-qty bitfield representing the compiled-in
| units. But this wouldn't really let you represent arbitrary
| unexpected "unit polynomial" qtys, e.g. m^5s^-3. This might seem
| fine, but sometimes _intermediate_ quantities in formulae look
| like that, even though they work out to something sensible when
| everything is multiplied out.)
|
| Even if there couldn't be a single units library implementation,
| it'd at least make sense for there to be 1. a canonical libunits-
| data release (sort of like tzdata), that individual library impls
| could pull in; and 2. a high-level API spec or reference-impl of
| what a libunits library for a given language-runtime would look
| like (sort of like how every HLL has copied JodaTime's datetime
| design.)
| dktoao wrote:
| There are heaps of libraries for all languages because it is a
| fairly fun and straight forward project. I personally created
| this one because I was frustrated with how slow and clunky the
| existing javascript libraries were:
|
| https://github.com/GhostWrench/pqm
|
| Also, I open sourced just the unit database (in JSON format)
| for anyone interested in making their own version:
|
| https://github.com/GhostWrench/unitdb
| maxnoe wrote:
| > straight forward project.
|
| Assuming this is straightforward is as wrong as with
| calendars / time Systems.
| dktoao wrote:
| What makes you say that? I suppose you could add as much
| complexity as you want with differentiating units from
| different standards and adding uncertainty in the unit
| definitions and on and on. But for 99% percent of users,
| just conversion factors and basic arithmetic operations are
| all that is needed. What application do you have in mind
| where this would fall short? In 15 years as an engineer I
| have not run into one.
| mmphosis wrote:
| What day is it?
|
| _Be conservative in what you send, be liberal in what
| you accept._
|
| leap years, leap seconds, julian dates, pre-gregorian
| dates, years beyond 9999, yyyy-mm-dd vs d/m/y vs month
| day year vs ..., zero padding, 12 hour vs 24 hour, 32 bit
| time stamps, DOS time accurate to every two seconds, why
| does excel need the date time in a specific format, I
| dual boot between Windows10 and Linux and every-time I
| boot up Windows10 the first thing I need to do is adjust
| the date time, pico-second granularity, time zones,
| daylight savings time, ...
|
| Today is Stability (4), Flint (Tijaax * Etznab)
|
| It's a good day to: Spend time in reflection and
| introspection.
| dktoao wrote:
| Don't disagree that datetime libraries that are used to
| control computer networking are immensely complex. Never
| said they weren't. However:
|
| 1) That is not what we are talking about
|
| 2) Sometimes you just need a stopwatch, timing
| applications _can_ be simple
| majewsky wrote:
| What are you talking about? The topic is unit conversion,
| not datetime libraries.
| dktoao wrote:
| Commenting on my own thread because the window to edit has
| passed. What is up with the haters today? I share a useful
| open-source library with everyone that I spent a ton of time
| working on only to get crapped on by the know-it-all crew?
| Did you even click the link and read the github readme? This
| library is tested against NIST data! It also has 100% test
| coverage and support for corner cases like non-linear unit
| conversions like temperature. How does anyone enjoy
| participating in this community?
| SoSoRoCoCo wrote:
| The source isn't that big, I just downloaded 2.21 source and it
| is one directory with about ~45 files, and the majority of
| bytes are for /doc/dvi binaries, only 5 c files and a post
| Yacc'd tab file for parsing the units definitions file.
| Surprisingly simple now that I look at it.
|
| Heck... I was going ask you to write it, but now I'm thinking
| this could be a fun weekend project.
|
| I can see one function in that library: bool
| convert(const char *from, const char *to, double input, double
| *output);
|
| No need to make it more complex for starters. If you want to
| make an .hxx Boost-like class around it, that's outta my
| league!
|
| EDIT: markdown help
|
| EDIT: added a status return instead of val return to check for
| conversion correctness (bool is newer C)
| tom_mellior wrote:
| > (...how the heck do I make a literal asterisk in HN
| markdown?)
|
| Spaces on both sides: const char * from
|
| But also you are supposed to mark up code by indenting with
| four spaces, and then everything will be treated as verbatim
| text: const char *from
| epilys wrote:
| There's also uom for Rust https://github.com/iliekturtles/uom
| which also provides types for type level operations
| okl wrote:
| You means something like this? http://www.dmitry-
| kazakov.de/ada/units.htm
| derefr wrote:
| Very much so! But I don't think I can link Ada libraries into
| my Ruby or Elixir codebase :)
| dragonwriter wrote:
| > I don't think I can link Ada libraries into my Ruby or
| Elixir codebase
|
| Ruby has (among others, I'm certain):
| https://github.com/olbrich/ruby-units
| cmrdporcupine wrote:
| I've seen a few before, and a quick search yielded a bunch for
| me, right off the bat. By no means exhaustive:
|
| Julia: https://github.com/PainterQubits/Unitful.jl
|
| Python: https://pint.readthedocs.io/en/0.6/
|
| C++: https://github.com/nholthaus/units
|
| etc.
|
| And yes, it has always struck me as strange that
| date/time/calendar utilities are standard as canonical
| functionality shipped with language distributions, but units
| are not.
| scott_s wrote:
| Boost also has a C++ library: https://www.boost.org/doc/libs/
| 1_65_0/doc/html/boost_units/E...
| benibela wrote:
| I have been using qalc for that
|
| How does it compare? $ qalc > furlongs
| per fortnight furlong / fortnight = 1 fur / fortnight
| > to m/s 1 fur / fortnight = approx. 0,0001663095238
| m / s > 17 yards + 2 feet + 5 inches (17 *
| yard) + (2 * foot) + (5 * inch) = 17 yd + 2 ft + 5 in >
| to meter 17 yd + 2 ft + 5 in = 16,2814 m >
| JNRowe wrote:
| For use cases like that it is incredibly similar if you give
| the --verbose flag: $ units --verbose
| [header] You have: furlongs per fortnight You
| want: m/s furlongs per fortnight =
| 0.00016630952 m/s furlongs per fortnight = (1 /
| 6012.8848) m/s You have: 17 yards + 2 feet + 5 inches
| You want: meter 17 yards + 2 feet + 5 inches =
| 16.2814 meter 17 yards + 2 feet + 5 inches = (1
| / 0.06141978) meter
|
| Personally, I find qalc via qalculate-gtk more useful for
| exploratory sessions but I still use units an awful lot.
| FnuGk wrote:
| You have: 1 kelvin You want: degcelsius * 1
| / 1
|
| This does not seem right
| dagw wrote:
| It's right in the sense that the units are the same size. IE if
| something increases 10 deg K it also increases 10 deg C. But
| it's obvious to humans that that isn't what you where asking.
|
| Compare: You have: 1 degF You want:
| degcelsius * 0.55555556 / 1.8
| tialaramex wrote:
| Nitpick: There are no "deg K", because it is an absolute
| system it doesn't have degrees.
|
| Notice you also don't need degrees metre, degrees watt or
| degrees newton, because those are absolute units they are
| metres, watts and newtons. It is Celsius (and Fahrenheit)
| which are weird because they aren't absolute but instead have
| this arbitrary zero point.
| TurkTurkleton wrote:
| It is. The unit Kelvin is equal to the degree Celsius. If you
| want to convert temperatures, you need to use tempK and tempC:
| You have: tempK(1) You want: tempC
| -272.15
| boogies wrote:
| https://www.gnu.org/software/units/manual/units.html#Tempera...
|
| > Conversions between temperatures are different from linear
| conversions between temperature increments--see the example
| below. The absolute temperature conversions are handled by
| units starting with 'temp', and you must use functional
| notation. The temperature-increment conversions are done using
| units starting with 'deg' and they do not require functional
| notation.
| [deleted]
| LordHeini wrote:
| Makes sense because temperatures don't have a linear
| conversion.
|
| From the man page: Nonlinear units are represented using
| functional notation. They make possible nonlinear unit
| conversions such as temperature. You have:
| tempK(1) You want: tempC -272.15
|
| Edit: seems i am not alone :D
| visviva wrote:
| I absolutely adore this program. It works exactly like I expect,
| every time. Sometimes I'll just think about what a nice tool it
| is, even when I'm not using it.
| m463 wrote:
| I use units all the time on macos.
|
| I don't know how it derives/compares to the gnu version
| $ units -v units version 1.0 Copyright (c) 1993 by
| Adrian Mariano This program may be freely
| distributed
|
| It doesn't do temperature (which would make it more useful)
| BenjiWiebe wrote:
| I love being able to convert from millilightseconds to miles, and
| vice versa. You can figure minimum latency for a given distance
| or maximum distance for a given latency.
| JadeNB wrote:
| Is this a covert reference to the 500-mile e-mail?
| MawKKe wrote:
| FYI: use tab completion in the 'units' REPL to show a list of
| available definitions. You won't find them in the 'units'
| manpage, as they are defined in an external datafile (on my
| machine this file is /usr/share/units/definitions.units)
| wscott wrote:
| My hp48 calculator had unit conversions built-in. You could add
| units to any number and then conversions are done automatically
| when you do math: (1_ft + 1_in) / 20_s + 5_mi/h
|
| if the units don't match then the operation was an error: 1_ft +
| 1_gal => error
|
| As other people have mentioned I really wish spreadsheets had
| this built-in where units are like formats for a cell. Ii
| controls about how you want things displayed and will prevent you
| from making conversion mistakes or doing illegal operations.
| groks wrote:
| Emacs has org-mode, and org-mode has tables with formulas which
| can invoke calc-mode. calc-mode also has units:
|
| https://www.gnu.org/software/emacs/manual/html_node/calc/Uni...
| ajsnigrutin wrote:
| > You have: furlongs per fortnight
|
| We need to see this ^ more often in real life!
| IfOnlyYouKnew wrote:
| My go-to test for such systems is converting miles per gallon to
| liters per 100 km. Can anybody give it a try?
|
| Google did it well for the longest time, then stopped at some
| point. Now it works again.
|
| Just tried it on iOS and it works now. Don't quite remember when
| I last tried, but I believe it's fairly recent.
| Rygian wrote:
| $ units "6 l/100 km" mpg reciprocal conversion
| * 39.202431 / 0.025508622
| bentcorner wrote:
| units "30 miles per gallon" "liters per 100km"
| reciprocal conversion * 7.8404861 /
| 0.12754311
| Symbiote wrote:
| What I particularly like is the use of the locale:
| LANG=en_GB.UTF-8 units "30 miles per gallon" "liters per
| 100km" reciprocal conversion *
| 9.4160312 / 0.10620186
| LANG=en_US.UTF-8 units "30 miles per gallon" "liters per
| 100km" reciprocal conversion *
| 7.8404861 / 0.12754311
|
| (Although it is incomplete, as it only uses Imperial gallons
| for "gallon" for en_GB, although there are probably more
| English locales that use(d) the Imperial gallon than the US
| gallon.)
| [deleted]
| [deleted]
| nemetroid wrote:
| For Python, I've had good experience with the Pint library[1].
| It's helped avoid a whole class of bugs.
|
| 1: https://pint.readthedocs.io/en/stable/
| darkstarsys wrote:
| I wish someone would make a spreadsheet that tracks units like
| this.
| alanbernstein wrote:
| Not sure what you want in a spreadsheet, but the data is stored
| in text files. See
| https://www.gnu.org/software/units/manual/html_node/Units-Da...
| netrus wrote:
| Not sure what GP is thinking of, but type checking for Excel
| would be really nice:
|
| ERR: A1 is USD/month, B1 is USD/user, so you cannot calculate
| A1+B1!
| protomyth wrote:
| Agriculture would probably love a spreadsheet that understood
| units of measure and kept results as fractions.
|
| Gotta love that a bushel of Yellow Corn is a different weight
| than a bushel of Oats.
| mark-r wrote:
| All the grains are different. I had to hard code a table of
| those conversions for an application I worked on.
| tsujp wrote:
| I keep using different tools to do conversions so now I can unify
| that all into Units and get my speed in furlongs per fortnight as
| the ancient prophecies foretold.
|
| Rejoice!
|
| (but for real this is top I'm replacing multiple other tools with
| Units)
| Faaak wrote:
| A simple example I used recently in order to guesstimate how much
| energy is needed to heat 300liters of water by 5K:
| You have: 5K * 300kg * water_specificheat You want: kWh
| * 1.7433333
|
| really easy to use.
|
| How much power could you obtain with a small water turbine if you
| had 10m of head and 1l/s ? Easy ! You have: 10m *
| 1kg/s * gravity You want: W * 98.0665
| zwog wrote:
| Thanks, I did not know that units is able to work with
| constants. I always used Insect[0] for this.
|
| 0: https://github.com/sharkdp/insect
| FlyMoreRockets wrote:
| I do these kind of calculations all of the time and never
| realize units had this level of functionality. Wow, thanks
| Faaak!
| [deleted]
| amelius wrote:
| Why isn't this released as a library (as opposed to a program)?
| rubenbe wrote:
| You might also be interested in boost::units.
|
| It implements units using a ton of templates and "compile-time
| metaprogramming". [0]
|
| The nice thing is that it has no runtime overhead as all
| templates are "compiled away". The disadvantage is that when
| you make a mistake against units, it results in a "template
| compiler error explosion".
|
| [0]https://www.boost.org/doc/libs/1_65_0/doc/html/boost_units.h
| ...
| macintux wrote:
| Per another thread it sounds like Frink is what you want.
|
| https://frinklang.org/
| enriquto wrote:
| A program is easier to use. You do not need to link to it, just
| run it! Do you have trouble running programs?
| devenblake wrote:
| In the README in the GNU units source code (2.21):
| 203: Ideas the future (may or may not happen): 204:
| 205: * Bundle up the units conversion stuff into a library.
|
| At the end of units.c, too: 6280: /* NOTES:
| 6281: 6282: mymalloc, growbuffer and tryallunits are the
| only places with print 6283: statements that should (?)
| be removed to make a library. How can 6284: error
| reporting in these functions (memory allocation errors) be
| 6285: handled cleanly for a library implementation?
| 6286: 6287: Way to report the reduced form of the two
| operands of a sum when 6288: they are not conformable.
| 6289: 6290: Way to report the required domain when
| getting an domain error. 6291: 6292: */
|
| My prowling of the source code is probably uninformed because
| I'm not a C expert by any means but it seems like you could
| include units.h and use many of the useful functions in another
| program.
| LeonM wrote:
| The documentation seems a bit incomplete, not what I'm used to
| with GNU. There seems to be no list of all units supported.
|
| I tried converting torque "100 ft lbf" to standard ISO notation
| (Nm). Let's see: units "100 ft lbs" "Nm" >
| Unknown unit 'Nm' units "100 ft lbs" "nm" >
| conformability error units "100 ft lbs" "newton meter"
| > * 135.58
|
| How am I supposed to know that 'newton' must be written in full
| (though 'ft' and 'lbs' can be abbreviated)? Searching for
| 'newton' in the manpage yields 0 results.
| kps wrote:
| The list of all units supported is, for the GNU version,
| /usr/share/units/definitions.units
| messe wrote:
| It should be "N m", even standard ISO notation requires a small
| space between the two.
| db48x wrote:
| The supported units aren't listed in the man page, because
| they're defined in a data file. Your site might have customized
| that file, meaning the man page would be incomplete.
| enriquto wrote:
| I love it, everything is there! You have:
| kilometers per hour You want: attoparsecs per
| microfortnight * 10.889018
| cmenge wrote:
| That's even better than the furlongs per fortnight example,
| which gave me a good laugh already :)
| dredmorbius wrote:
| For what's not, you can add additional definitions.
|
| I found myself wanting to calculate Little Boy blast yields
| sufficiently often that I added a hiroshimabomb unit of energy.
|
| Similarly, various areal units such as countries and
| states/provinces.
| edoceo wrote:
| How many Australian football fields in 1.3 Canada's?
| danaliv wrote:
| Oh thank goodness, I can stop using Google for this. (Aside: Is
| anyone else annoyed that Google doesn't understand what a
| hectopascal is? It interprets hPa as Pa, which is obnoxious.
| Every time I convert to or from hPa I have to do it twice: once
| in hPa and then again in millibars.)
| YesThatTom2 wrote:
| The units command has been part of Unix since the 1970s. GNU
| Units is a clone with many improvements and has been around
| since the 1980s.
|
| You kids gotta learn your damn history!
| danaliv wrote:
| In my defense, I've been using Unix since the early '90s (was
| taught Scheme and C on a DEC ULTRIX, and then got my hands on
| a Turbo NeXTstation). This is a rare gap in my knowledge. ;-)
| YesThatTom2 wrote:
| I forgive you.
___________________________________________________________________
(page generated 2021-01-06 23:00 UTC)