Units conversion utility courtesy of NetBSD.

Submitted by:	Jeremy Prior
Obtained from:	NetBSD
This commit is contained in:
Alexander Langer 1996-06-08 03:43:43 +00:00
parent 712c581c89
commit a303171509
Notes: svn2git 2020-12-20 02:59:44 +00:00
svn path=/vendor/NetBSD/dist/; revision=16186
6 changed files with 1500 additions and 0 deletions

9
usr.bin/units/Makefile Normal file
View File

@ -0,0 +1,9 @@
# $Id: Makefile,v 1.2 1996/04/06 06:00:58 thorpej Exp $
PROG= units
beforeinstall:
install -c -o ${BINOWN} -g ${BINGRP} -m 444 \
${.CURDIR}/units.lib ${DESTDIR}/usr/share/misc
.include <bsd.prog.mk>

18
usr.bin/units/README Normal file
View File

@ -0,0 +1,18 @@
# $Id: README,v 1.2 1996/04/06 06:00:59 thorpej Exp $
This is a program which I wrote as a clone of the UNIX 'units'
command. I threw it together in a couple days, but it seems to work,
with some restrictions. I have tested it under DOS with Borland C and
Ultrix 4.2, and SunOS 4.1.
This program differs from the unix units program in the following
ways:
it can gracefully handle exponents larger than 9 in output
it uses 'e' to denote exponentiation in numbers
prefixes are listed in the units file
it tries both -s and -es plurals
it allows use of * for multiply and ^ for exponentiation in the input
the output format is somewhat different
Adrian Mariano (adrian@cam.cornell.edu or mariano@geom.umn.edu)

33
usr.bin/units/pathnames.h Normal file
View File

@ -0,0 +1,33 @@
/* $Id: pathnames.h,v 1.3 1996/04/06 06:01:00 thorpej Exp $ */
/*
* Copyright (c) 1993 Christopher G. Demetriou
* All rights reserved.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions
* are met:
* 1. Redistributions of source code must retain the above copyright
* notice, this list of conditions and the following disclaimer.
* 2. Redistributions in binary form must reproduce the above copyright
* notice, this list of conditions and the following disclaimer in the
* documentation and/or other materials provided with the distribution.
* 3. All advertising materials mentioning features or use of this software
* must display the following acknowledgement:
* This product includes software developed by Christopher G. Demetriou.
* 4. The name of the author may not be used to endorse or promote products
* derived from this software without specific prior written permission
*
* THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
* IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
* OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
* IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
* NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
* THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
* THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*/
#define _PATH_UNITSLIB "/usr/share/misc/units.lib"

124
usr.bin/units/units.1 Normal file
View File

@ -0,0 +1,124 @@
.\" $Id: units.1,v 1.6 1996/04/06 06:01:02 thorpej Exp $
.TH UNITS 1 "14 July 1993"
.SH NAME
units - conversion program
.SH SYNTAX
.B units
[-f filename] [-qv] [from-unit to-unit]
.SH SUMMARY
.TP 4
.B -f filename
Specifies the name of the units data file to load.
.LP
.TP 4
.B -q
Suppresses prompting of the user for units and the display of statistics
about the number of units loaded.
.LP
.TP 4
.B -v
Prints the version number.
.LP
.TP 4
.B from-unit to-unit
Allows a single unit conversion to be done directly from the command
line. No prompting will occur. The units program will print out
only the result of this single conversion.
.SH DESCRIPTION
The units program converts quantities expression in various scales to
their equivalents in other scales. The units program can only
handle multiplicative scale changes. It cannot convert Centigrade
to Fahrenheit, for example. It works interactively by prompting
the user for input:
.nf
You have: meters
You want: feet
* 3.2808399
/ 0.3048
You have: cm^3
You want: gallons
* 0.00026417205
/ 3785.4118
.fi
Powers of units can be specified using the '^' character as shown in
the example, or by simple concatenation: 'cm3' is equivalent to 'cm^3'.
Multiplication of units can be specified by using spaces, a dash or
an asterisk. Division of units is indicated by the slash ('/').
Note that multiplication has a higher precedence than division,
so 'm/s/s' is the same as 'm/s^2' or 'm/s s'.
If the user enters incompatible unit types, the units program will
print a message indicating that the units are not conformable and
it will display the reduced form for each unit:
.nf
You have: ergs/hour
You want: fathoms kg^2 / day
conformability error
2.7777778e-11 kg m^2 / sec^3
2.1166667e-05 kg^2 m / sec
.fi
.LP
The conversion information is read from a units data file. The default
file includes definitions for most familiar units, abbreviations and
metric prefixes. Some constants of nature included are:
.in +4m
.ta
.ta 9m +
.nf
pi ratio of circumference to diameter
c speed of light
e charge on an electron
g acceleration of gravity
force same as g
mole Avogadro's number
water pressure per unit height of water
mercury pressure per unit height of mercury
au astronomical unit
.fi
.in -4m
\'Pound' is a unit of mass. Compound names are run together
so 'poundforce' is a unit of force. British units that differ from their
US counterparts are prefixed with 'br', and currency is prefixed with
its country name: 'belgiumfranc', 'britainpound'. When searching for
a unit, if the specified string does not appear exactly as a unit
name, then the units program will try to remove a trailing 's' or
a trailing 'es' and check again for a match.
.LP
All of these definitions can be read in the standard units file, or you
can supply your own file. A unit is specified on a single line by
giving its name and an equivalence. One should be careful to define
new units in terms of old ones so that a reduction leads to the
primitive units which are marked with '!' characters.
The units program will not detect infinite loops that could be caused
by careless unit definitions.
.LP
Prefixes are defined in the same was as standard units, but with
a trailing dash at the end of the prefix name.
.SH BUGS
.LP
The effect of including a '/' in a prefix is surprising.
.LP
Exponents entered by the user can be only one digit.
You can work around this by multiplying several terms.
.LP
The user must use | to indicate division of numbers and / to
indicate division of symbols. This distinction should not
be necessary.
.LP
The program contains various arbitrary limits on the length
of the units converted and on the length of the data file.
.LP
The program should use a hash table to store units so that
it doesn't take so long to load the units list and check
for duplication.
.SH FILES
/usr/share/misc/units.lib - the standard units library
.SH AUTHOR
Adrian Mariano (adrian@cam.cornell.edu or mariano@geom.umn.edu)

706
usr.bin/units/units.c Normal file
View File

@ -0,0 +1,706 @@
/* $Id: units.c,v 1.6 1996/04/06 06:01:03 thorpej Exp $ */
/*
* units.c Copyright (c) 1993 by Adrian Mariano (adrian@cam.cornell.edu)
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions
* are met:
* 1. Redistributions of source code must retain the above copyright
* notice, this list of conditions and the following disclaimer.
* 2. The name of the author may not be used to endorse or promote products
* derived from this software without specific prior written permission.
* Disclaimer: This software is provided by the author "as is". The author
* shall not be liable for any damages caused in any way by this software.
*
* I would appreciate (though I do not require) receiving a copy of any
* improvements you might make to this program.
*/
#include <ctype.h>
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include "pathnames.h"
#define VERSION "1.0"
#ifndef UNITSFILE
#define UNITSFILE _PATH_UNITSLIB
#endif
#define MAXUNITS 1000
#define MAXPREFIXES 50
#define MAXSUBUNITS 500
#define PRIMITIVECHAR '!'
char *powerstring = "^";
struct {
char *uname;
char *uval;
} unittable[MAXUNITS];
struct unittype {
char *numerator[MAXSUBUNITS];
char *denominator[MAXSUBUNITS];
double factor;
};
struct {
char *prefixname;
char *prefixval;
} prefixtable[MAXPREFIXES];
char *NULLUNIT = "";
int unitcount;
int prefixcount;
char *
dupstr(char *str)
{
char *ret;
ret = malloc(strlen(str) + 1);
if (!ret) {
fprintf(stderr, "Memory allocation error\n");
exit(3);
}
strcpy(ret, str);
return (ret);
}
void
readerror(int linenum)
{
fprintf(stderr, "Error in units file '%s' line %d\n", UNITSFILE,
linenum);
}
void
readunits(char *userfile)
{
FILE *unitfile;
char line[80], *lineptr;
int len, linenum, i;
unitcount = 0;
linenum = 0;
if (userfile) {
unitfile = fopen(userfile, "rt");
if (!unitfile) {
fprintf(stderr, "Unable to open units file '%s'\n",
userfile);
exit(1);
}
}
else {
unitfile = fopen(UNITSFILE, "rt");
if (!unitfile) {
char *direc, *env;
char filename[1000];
char separator[2];
env = getenv("PATH");
if (env) {
if (strchr(env, ';'))
strcpy(separator, ";");
else
strcpy(separator, ":");
direc = strtok(env, separator);
while (direc) {
strcpy(filename, "");
strncat(filename, direc, 999);
strncat(filename, "/",
999 - strlen(filename));
strncat(filename, UNITSFILE,
999 - strlen(filename));
unitfile = fopen(filename, "rt");
if (unitfile)
break;
direc = strtok(NULL, separator);
}
}
if (!unitfile) {
fprintf(stderr, "Can't find units file '%s'\n",
UNITSFILE);
exit(1);
}
}
}
while (!feof(unitfile)) {
if (!fgets(line, 79, unitfile))
break;
linenum++;
lineptr = line;
if (*lineptr == '/')
continue;
lineptr += strspn(lineptr, " \n\t");
len = strcspn(lineptr, " \n\t");
lineptr[len] = 0;
if (!strlen(lineptr))
continue;
if (lineptr[strlen(lineptr) - 1] == '-') { /* it's a prefix */
if (prefixcount == MAXPREFIXES) {
fprintf(stderr, "Memory for prefixes exceeded in line %d\n",
linenum);
continue;
}
lineptr[strlen(lineptr) - 1] = 0;
prefixtable[prefixcount].prefixname = dupstr(lineptr);
for (i = 0; i < prefixcount; i++)
if (!strcmp(prefixtable[i].prefixname, lineptr)) {
fprintf(stderr, "Redefinition of prefix '%s' on line %d ignored\n",
lineptr, linenum);
continue;
}
lineptr += len + 1;
if (!strlen(lineptr)) {
readerror(linenum);
continue;
}
lineptr += strspn(lineptr, " \n\t");
len = strcspn(lineptr, "\n\t");
lineptr[len] = 0;
prefixtable[prefixcount++].prefixval = dupstr(lineptr);
}
else { /* it's not a prefix */
if (unitcount == MAXUNITS) {
fprintf(stderr, "Memory for units exceeded in line %d\n",
linenum);
continue;
}
unittable[unitcount].uname = dupstr(lineptr);
for (i = 0; i < unitcount; i++)
if (!strcmp(unittable[i].uname, lineptr)) {
fprintf(stderr, "Redefinition of unit '%s' on line %d ignored\n",
lineptr, linenum);
continue;
}
lineptr += len + 1;
lineptr += strspn(lineptr, " \n\t");
if (!strlen(lineptr)) {
readerror(linenum);
continue;
}
len = strcspn(lineptr, "\n\t");
lineptr[len] = 0;
unittable[unitcount++].uval = dupstr(lineptr);
}
}
fclose(unitfile);
}
void
initializeunit(struct unittype * theunit)
{
theunit->factor = 1.0;
theunit->numerator[0] = theunit->denominator[0] = NULL;
}
int
addsubunit(char *product[], char *toadd)
{
char **ptr;
for (ptr = product; *ptr && *ptr != NULLUNIT; ptr++);
if (ptr >= product + MAXSUBUNITS) {
fprintf(stderr, "Memory overflow in unit reduction\n");
return 1;
}
if (!*ptr)
*(ptr + 1) = 0;
*ptr = dupstr(toadd);
return 0;
}
void
showunit(struct unittype * theunit)
{
char **ptr;
int printedslash;
int counter = 1;
printf("\t%.8g", theunit->factor);
for (ptr = theunit->numerator; *ptr; ptr++) {
if (ptr > theunit->numerator && **ptr &&
!strcmp(*ptr, *(ptr - 1)))
counter++;
else {
if (counter > 1)
printf("%s%d", powerstring, counter);
if (**ptr)
printf(" %s", *ptr);
counter = 1;
}
}
if (counter > 1)
printf("%s%d", powerstring, counter);
counter = 1;
printedslash = 0;
for (ptr = theunit->denominator; *ptr; ptr++) {
if (ptr > theunit->denominator && **ptr &&
!strcmp(*ptr, *(ptr - 1)))
counter++;
else {
if (counter > 1)
printf("%s%d", powerstring, counter);
if (**ptr) {
if (!printedslash)
printf(" /");
printedslash = 1;
printf(" %s", *ptr);
}
counter = 1;
}
}
if (counter > 1)
printf("%s%d", powerstring, counter);
printf("\n");
}
void
zeroerror()
{
fprintf(stderr, "Unit reduces to zero\n");
}
/*
Adds the specified string to the unit.
Flip is 0 for adding normally, 1 for adding reciprocal.
Returns 0 for successful addition, nonzero on error.
*/
int
addunit(struct unittype * theunit, char *toadd, int flip)
{
char *scratch, *savescr;
char *item;
char *divider, *slash;
int doingtop;
savescr = scratch = dupstr(toadd);
for (slash = scratch + 1; *slash; slash++)
if (*slash == '-' &&
(tolower(*(slash - 1)) != 'e' ||
!strchr(".0123456789", *(slash + 1))))
*slash = ' ';
slash = strchr(scratch, '/');
if (slash)
*slash = 0;
doingtop = 1;
do {
item = strtok(scratch, " *\t\n/");
while (item) {
if (strchr("0123456789.", *item)) { /* item is a number */
double num;
divider = strchr(item, '|');
if (divider) {
*divider = 0;
num = atof(item);
if (!num) {
zeroerror();
return 1;
}
if (doingtop ^ flip)
theunit->factor *= num;
else
theunit->factor /= num;
num = atof(divider + 1);
if (!num) {
zeroerror();
return 1;
}
if (doingtop ^ flip)
theunit->factor /= num;
else
theunit->factor *= num;
}
else {
num = atof(item);
if (!num) {
zeroerror();
return 1;
}
if (doingtop ^ flip)
theunit->factor *= num;
else
theunit->factor /= num;
}
}
else { /* item is not a number */
int repeat = 1;
if (strchr("23456789",
item[strlen(item) - 1])) {
repeat = item[strlen(item) - 1] - '0';
item[strlen(item) - 1] = 0;
}
for (; repeat; repeat--)
if (addsubunit(doingtop ^ flip ? theunit->numerator : theunit->denominator, item))
return 1;
}
item = strtok(NULL, " *\t/\n");
}
doingtop--;
if (slash) {
scratch = slash + 1;
}
else
doingtop--;
} while (doingtop >= 0);
free(savescr);
return 0;
}
int
compare(const void *item1, const void *item2)
{
return strcmp(*(char **) item1, *(char **) item2);
}
void
sortunit(struct unittype * theunit)
{
char **ptr;
int count;
for (count = 0, ptr = theunit->numerator; *ptr; ptr++, count++);
qsort(theunit->numerator, count, sizeof(char *), compare);
for (count = 0, ptr = theunit->denominator; *ptr; ptr++, count++);
qsort(theunit->denominator, count, sizeof(char *), compare);
}
void
cancelunit(struct unittype * theunit)
{
char **den, **num;
int comp;
den = theunit->denominator;
num = theunit->numerator;
while (*num && *den) {
comp = strcmp(*den, *num);
if (!comp) {
/* if (*den!=NULLUNIT) free(*den);
if (*num!=NULLUNIT) free(*num);*/
*den++ = NULLUNIT;
*num++ = NULLUNIT;
}
else if (comp < 0)
den++;
else
num++;
}
}
/*
Looks up the definition for the specified unit.
Returns a pointer to the definition or a null pointer
if the specified unit does not appear in the units table.
*/
static char buffer[100]; /* buffer for lookupunit answers with
prefixes */
char *
lookupunit(char *unit)
{
int i;
char *copy;
for (i = 0; i < unitcount; i++) {
if (!strcmp(unittable[i].uname, unit))
return unittable[i].uval;
}
if (unit[strlen(unit) - 1] == '^') {
copy = dupstr(unit);
copy[strlen(copy) - 1] = 0;
for (i = 0; i < unitcount; i++) {
if (!strcmp(unittable[i].uname, copy)) {
strcpy(buffer, copy);
free(copy);
return buffer;
}
}
free(copy);
}
if (unit[strlen(unit) - 1] == 's') {
copy = dupstr(unit);
copy[strlen(copy) - 1] = 0;
for (i = 0; i < unitcount; i++) {
if (!strcmp(unittable[i].uname, copy)) {
strcpy(buffer, copy);
free(copy);
return buffer;
}
}
if (copy[strlen(copy) - 1] == 'e') {
copy[strlen(copy) - 1] = 0;
for (i = 0; i < unitcount; i++) {
if (!strcmp(unittable[i].uname, copy)) {
strcpy(buffer, copy);
free(copy);
return buffer;
}
}
}
free(copy);
}
for (i = 0; i < prefixcount; i++) {
if (!strncmp(prefixtable[i].prefixname, unit,
strlen(prefixtable[i].prefixname))) {
unit += strlen(prefixtable[i].prefixname);
if (!strlen(unit) || lookupunit(unit)) {
strcpy(buffer, prefixtable[i].prefixval);
strcat(buffer, " ");
strcat(buffer, unit);
return buffer;
}
}
}
return 0;
}
/*
reduces a product of symbolic units to primitive units.
The three low bits are used to return flags:
bit 0 (1) set on if reductions were performed without error.
bit 1 (2) set on if no reductions are performed.
bit 2 (4) set on if an unknown unit is discovered.
*/
#define ERROR 4
int
reduceproduct(struct unittype * theunit, int flip)
{
char *toadd;
char **product;
int didsomething = 2;
if (flip)
product = theunit->denominator;
else
product = theunit->numerator;
for (; *product; product++) {
for (;;) {
if (!strlen(*product))
break;
toadd = lookupunit(*product);
if (!toadd) {
printf("unknown unit '%s'\n", *product);
return ERROR;
}
if (strchr(toadd, PRIMITIVECHAR))
break;
didsomething = 1;
if (*product != NULLUNIT) {
free(*product);
*product = NULLUNIT;
}
if (addunit(theunit, toadd, flip))
return ERROR;
}
}
return didsomething;
}
/*
Reduces numerator and denominator of the specified unit.
Returns 0 on success, or 1 on unknown unit error.
*/
int
reduceunit(struct unittype * theunit)
{
int ret;
ret = 1;
while (ret & 1) {
ret = reduceproduct(theunit, 0) | reduceproduct(theunit, 1);
if (ret & 4)
return 1;
}
return 0;
}
int
compareproducts(char **one, char **two)
{
while (*one || *two) {
if (!*one && *two != NULLUNIT)
return 1;
if (!*two && *one != NULLUNIT)
return 1;
if (*one == NULLUNIT)
one++;
else if (*two == NULLUNIT)
two++;
else if (strcmp(*one, *two))
return 1;
else
one++, two++;
}
return 0;
}
/* Return zero if units are compatible, nonzero otherwise */
int
compareunits(struct unittype * first, struct unittype * second)
{
return
compareproducts(first->numerator, second->numerator) ||
compareproducts(first->denominator, second->denominator);
}
int
completereduce(struct unittype * unit)
{
if (reduceunit(unit))
return 1;
sortunit(unit);
cancelunit(unit);
return 0;
}
void
showanswer(struct unittype * have, struct unittype * want)
{
if (compareunits(have, want)) {
printf("conformability error\n");
showunit(have);
showunit(want);
}
else
printf("\t* %.8g\n\t/ %.8g\n", have->factor / want->factor,
want->factor / have->factor);
}
void
usage()
{
fprintf(stderr, "\nunits [-f unitsfile] [-q] [-v] [from-unit to-unit]\n");
fprintf(stderr, "\n -f specify units file\n");
fprintf(stderr, " -q supress prompting (quiet)\n");
fprintf(stderr, " -v print version number\n");
exit(3);
}
int
main(int argc, char **argv)
{
struct unittype have, want;
char havestr[81], wantstr[81];
int optchar;
char *userfile = 0;
int quiet = 0;
extern char *optarg;
extern int optind;
while ((optchar = getopt(argc, argv, "vqf:")) != -1) {
switch (optchar) {
case 'f':
userfile = optarg;
break;
case 'q':
quiet = 1;
break;
case 'v':
fprintf(stderr, "\n units version %s Copyright (c) 1993 by Adrian Mariano\n",
VERSION);
fprintf(stderr, " This program may be freely distributed\n");
usage();
default:
usage();
break;
}
}
if (optind != argc - 2 && optind != argc)
usage();
readunits(userfile);
if (optind == argc - 2) {
strcpy(havestr, argv[optind]);
strcpy(wantstr, argv[optind + 1]);
initializeunit(&have);
addunit(&have, havestr, 0);
completereduce(&have);
initializeunit(&want);
addunit(&want, wantstr, 0);
completereduce(&want);
showanswer(&have, &want);
}
else {
if (!quiet)
printf("%d units, %d prefixes\n\n", unitcount,
prefixcount);
for (;;) {
do {
initializeunit(&have);
if (!quiet)
printf("You have: ");
if (!fgets(havestr, 80, stdin)) {
if (!quiet);
putchar('\n');
exit(0);
}
} while (addunit(&have, havestr, 0) ||
completereduce(&have));
do {
initializeunit(&want);
if (!quiet)
printf("You want: ");
if (!fgets(wantstr, 80, stdin)) {
if (!quiet)
putchar('\n');
exit(0);
}
} while (addunit(&want, wantstr, 0) ||
completereduce(&want));
showanswer(&have, &want);
}
}
}

610
usr.bin/units/units.lib Normal file
View File

@ -0,0 +1,610 @@
/ $Id: units.lib,v 1.3 1996/04/06 06:01:04 thorpej Exp $
/ primitive units
m !a!
kg !b!
sec !c!
coul !d!
candela !e!
dollar !f!
bit !h!
erlang !i!
K !j!
/ prefixes
yotta- 1e24
zetta- 1e21
exa- 1e18
peta- 1e15
tera- 1e12
giga- 1e9
mega- 1e6
myria- 1e4
kilo- 1e3
hecto- 1e2
deka- 1e1
deci- 1e-1
centi- 1e-2
milli- 1e-3
micro- 1e-6
nano- 1e-9
pico- 1e-12
femto- 1e-15
atto- 1e-18
zopto- 1e-21
yocto- 1e-24
semi- .5
demi- .5
Y- yotta
Z- zetta
E- exa
P- peta
T- tera
G- giga
M- mega
k- kilo
h- hecto
da- deka
d- deci
c- centi
m- milli
p- pico
f- femto
a- atto
z- zopto
y- yocto
/ constants
fuzz 1
pi 3.14159265358979323846
c 2.99792458e+8 m/sec fuzz
g 9.80665 m/sec2
au 1.49597871e+11 m fuzz
mole 6.022169e+23 fuzz
e 1.6021917e-19 coul fuzz
energy c2
force g
mercury 1.33322e+5 kg/m2-sec2
hg mercury
/ dimensionless
radian .5 / pi
degree 1|180 pi-radian
circle 2 pi-radian
turn 2 pi-radian
revolution turn
rev turn
grade .9 degree
arcdeg 1 degree
arcmin 1|60 arcdeg
ccs 1|36 erlang
arcsec 1|60 arcmin
steradian radian2
sphere 4 pi-steradian
sr steradian
/ Time
second sec
s sec
minute 60 sec
min minute
hour 60 min
hr hour
day 24 hr
da day
week 7 day
year 365.24219879 day fuzz
yr year
month 1|12 year
ms millisec
us microsec
/ Mass
gram millikg
gm gram
mg milligram
metricton kilokg
/ Avoirdupois
lb .45359237 kg
pound lb
lbf lb g
ounce 1|16 lb
oz ounce
dram 1|16 oz
dr dram
grain 1|7000 lb
gr grain
shortton 2000 lb
ton shortton
longton 2240 lb
/ Apothecary
scruple 20 grain
apdram 60 grain
apounce 480 grain
appound 5760 grain
troypound appound
/ Length
meter m
cm centimeter
mm millimeter
km kilometer
nm nanometer
micron micrometer
angstrom decinanometer
inch 2.54 cm
in inch
foot 12 in
feet foot
ft foot
yard 3 ft
yd yard
rod 5.5 yd
rd rod
mile 5280 ft
mi mile
british 1200|3937 m/ft
nmile 1852 m
acre 4840 yd2
cc cm3
liter kilocc
ml milliliter
/ US Liquid
gallon 231 in3
imperial 1.20095
gal gallon
quart 1|4 gal
qt quart
pint 1|2 qt
pt pint
floz 1|16 pt
fldr 1|8 floz
/ US Dry
dry 268.8025 in3/gallon fuzz
peck 8 dry-quart
pk peck
bushel 4 peck
bu bushel
chaldron 36 bushel
/ British
brgallon 277.420 in3 fuzz
brquart 1|4 brgallon
brpint 1|2 brquart
brfloz 1|20 brpint
brpeck 554.84 in3 fuzz
brbushel 4 brpeck
/ Energy Work
newton kg-m/sec2
nt newton
N newton
joule nt-m
cal 4.1868 joule
/ Electrical
coulomb coul
C coul
ampere coul/sec
amp ampere
watt joule/sec
volt watt/amp
ohm volt/amp
mho /ohm
farad coul/volt
henry sec2/farad
weber volt-sec
/ Light
cd candela
lumen cd sr
lux cd sr/m2
/ Wall Street Journal, July 2, 1993
$ dollar
argentinapeso $
australiadollar .66 $
austriaschilling .83 $
bahraindinar 2.6522 $
belgiumfranc .028 $
brazilcruzeiro .000019 $
britainpound 1.49 $
canadadollar .77 $
czechkoruna .034 $
chilepeso .0025 $
chinarenminbi .174856 $
colombiapeso .001495 $
denmarkkrone .15 $
ecuadorsucre .000539 $
finlandmarkka .17 $
francefranc .17 $
germanymark .58 $
greatbritainpound britainpound
greecedrachma .0043 $
hongkongdollar .13 $
hungaryforint .011 $
indiarupee .03211 $
indonesiarupiah .0004782 $
irelandpunt 1.43 $
israelshekel .3642 $
italylira .00064 $
japanyen .0093 $
jordandinar 1.4682 $
kuwaitdinar 3.3173 $
lebanonpound .000578 $
malaysiaringgit .338 $
maltalira 2.6042 $
mexicopeso .3205128 $
netherlandguilder .52 $
newzealanddollar .539 $
norwaykrone .139 $
pakistanrupee .037 $
perunewsol .5065 $
philippinespeso .03738 $
polandzloty .000059 $
portugalescudo .00617 $
saudiarabiariyal .26702 $
singaporedollar .6157 $
slovakkoruna .034 $
southamericarand .21 $
southkoreawon .001 $
spainpeseta .007 $
swedenkrona .13 $
switzerlandfranc .66 $
taiwandollar .038285 $
thailandbaht .03962 $
turkeylira .0000929 $
unitedarabdirham .2723 $
uruguaynewpeso .246852 $
venezuelabolivar .011 $
mark germanymark
bolivar venezuelabolivar
peseta spainpeseta
rand southafricarand
escudo portugalescudo
sol perusol
guilder netherlandsguilder
hollandguilder netherlandsguilder
peso mexicopeso
yen japanyen
lira italylira
rupee indiarupee
drachma greecedrachma
franc francefranc
markka finlandmarkka
sucre ecuadorsucre
poundsterling britainpound
cruzeiro brazilcruzeiro
/ computer
baud bit/sec
byte 8 bit
block 512 byte
kbyte 1024 byte
megabyte 1024 kbyte
gigabyte 1024 megabyte
meg megabyte
/ Trivia
% 1|100
admiraltyknot 6080 ft/hr
apostilb cd/pi-m2
are 1e+2 m2
arpentcan 27.52 mi
arpentlin 191.835 ft
astronomicalunit au
atmosphere 1.01325e+5 nt/m2
atm atmosphere
atomicmassunit 1.66044e-27 kg fuzz
amu atomicmassunit
bag 94 lb
bakersdozen 13
bar 1e+5 nt/m2
barie 1e-1 nt/m2
barleycorn 1|3 in
barn 1e-28 m2
barrel 42 gal
barye 1e-1 nt/m2
bev 1e+9 e-volt
biot 10 amp
blondel cd/pi-m2
boardfoot 144 in3
bolt 40 yd
bottommeasure 1|40 in
britishthermalunit 1.05506e+3 joule fuzz
btu britishthermalunit
refrigeration 12000 btu/ton-hour
buck dollar
cable 720 ft
caliber 1e-2 in
calorie cal
carat 205 mg
caratgold 1|24
cent centidollar
cental 100 lb
centesimalminute 1e-2 grade
centesimalsecond 1e-4 grade
century 100 year
cfs ft3/sec
chain 66 ft
circularinch 1|4 pi-in2
circularmil 1e-6|4 pi-in2
clusec 1e-8 mm-hg m3/s
coomb 4 bu
cord 128 ft3
cordfoot cord
crith 9.06e-2 gm
cubit 18 in
cup 1|2 pt
curie 3.7e+10 /sec
dalton amu
decade 10 yr
dipotre /m
displacementton 35 ft3
doppelzentner 100 kg
dozen 12
drop .03 cm3
dyne cm-gm/sec2
electronvolt e-volt
ell 45 in
engineerschain 100 ft
engineerslink 100|100 ft
equivalentfootcandle lumen/pi-ft2
equivalentlux lumen/pi-m2
equivalentphot cd/pi-cm2
erg cm2-gm/sec2
ev e-volt
faraday 9.652e+4 coul
fathom 6 ft
fermi 1e-15 m
fifth 4|5 qt
fin 5 dollar
finger 7|8 in
firkin 9 gal
footcandle lumen/ft2
footlambert cd/pi-ft2
fortnight 14 da
franklin 3.33564e-10 coul
frigorie kilocal
furlong 220 yd
galileo 1e-2 m/sec2
gamma 1e-9 weber/m2
gauss 1e-4 weber/m2
geodeticfoot british-ft
geographicalmile 1852 m
gilbert 7.95775e-1 amp
gill 1|4 pt
gross 144
gunterschain 22 yd
hand 4 in
hectare 1e+4 m2
hefnercandle .92 cd
hertz /sec
Hz hertz
hogshead 2 barrel
hd hogshead
homestead 1|4 mi2
horsepower 550 ft-lb-g/sec
hp horsepower
hyl gm force sec2/m
hz /sec
imaginarycubicfoot 1.4 ft3
jeroboam 4|5 gal
karat 1|24
kcal kilocal
kcalorie kilocal
kev 1e+3 e-volt
key kg
khz 1e+3 /sec
kilderkin 18 gal
knot nmile/hr
lambert cd/pi-cm2
langley cal/cm2
last 80 bu
league 3 mi
lightyear c-yr
line 1|12 in
link 66|100 ft
longhundredweight 112 lb
longquarter 28 lb
lusec 1e-6 mm-hg m3/s
mach 331.46 m/sec
magnum 2 qt
marineleague 3 nmile
maxwell 1e-8 weber
metriccarat 200 mg
mgd megagal/day
mh millihenry
mhz 1e+6 /sec
mil 1e-3 in
millenium 1000 year
minersinch 1.5 ft3/min
minim 1|60 fldr
mo month
mpg mile/gal
mph mile/hr
nail 1|16 yd
nauticalmile nmile
nit cd/m2
noggin 1|8 qt
nox 1e-3 lux
ns nanosec
oersted 2.5e+2 pi-amp/m
oe oersted
pace 36 in
palm 3 in
parasang 3.5 mi
parsec au-radian/arcsec
pascal nt/m2
pc parsec
pennyweight 1|20 oz
pwt pennyweight
percent %
perch rd
pf picofarad
phot lumen/cm2
pica 1|6 in
pieze 1e+3 nt/m2
pipe 4 barrel
point 1|72 in
poise gm/cm-sec
pole rd
poundal ft-lb/sec2
pdl poundal
proof 1|200
psi lb-g/in2
quarter 9 in
quartersection 1|4 mi2
quintal 100 kg
quire 25
rad 100 erg/gm
ream 500
registerton 100 ft3
rehoboam 156 floz
rhe 10 m2/nt-sec
rontgen 2.58e-4 curie/kg
rood 1.21e+3 yd
rope 20 ft
rutherford 1e+6 /sec
rydberg 1.36054e+1 ev
sabin 1 ft2
sack 3 bu
seam 8 bu
section mi2
shippington 40 ft3
shorthundredweight 100 lb
shortquarter 25 lb
siemens /ohm
sigma microsec
skein 120 yd
skot 1e-3 apostilb
slug lb-g-sec2/ft
span 9 in
spat 4 pi sr
spindle 14400 yd
square 100 ft2
stere m3
sthene 1e+3 nt
stilb cd/cm2
stoke 1e-4 m2/sec
stone 14 lb
strike 2 bu
surveyfoot british-ft
surveyyard 3 surveyfoot
surveyorschain 66 ft
surveyorslink 66|100 ft
tablespoon 4 fldr
teaspoon 4|3 fldr
tesla weber/m2
therm 1e+5 btu
thermie 1e+6 cal
timberfoot ft3
tnt 4.6e+6 m2/sec2
tonne 1e+6 gm
torr mm hg
township 36 mi2
tun 8 barrel
water gram g / cc
wey 40 bu
weymass 252 lb
Xunit 1.00202e-13 m
k 1.38047e-16 erg/degC
degC K
kelvin K
brewster 1e-12 m2/newton
degF 5|9 degC
degreesrankine degF
degrankine degreesrankine
degreerankine degF
degreaumur 10|8 degC
drachm 60 grain
poncelet 100 kg m g / sec
denier .05|450 gram / m
tex .001 gram / m
englishell 45 inch
scottishell 37.2 inch
flemishell 27 inch
planck 6.626e-34 joule-sec
hbar 1.055e-34 joule-sec
electronmass 9.1095e-31 kg
protonmass 1.6726e-27 kg
neutronmass 1.6606e-27 kg
V volt
eV e V
bohrradius hbar2-C2/8.988e9 N m2-e2-electronmass
becquerel 1|3.7e10 curie
fresnel 1e12 hertz
statcoul 1|2.99792458e9 coul
statamp 1|2.99792458e9 amp
statvolt 2.99792458e2 volt
statcoulomb statcoul
statampere statamp
debye 3.336e-30 coul-m
pulsatance 2 pi/sec
rpm rev/minute
rps rev/sec
kilohm kiloohm
megohm megaohm
siderealyear 365.256360417 day
siderealday 23.934469444 hour
siderealhour 1|24 sidereal day
lunarmonth 29.5305555 day
synodicmonth lunarmonth
siderealmonth 27.32152777 day
tropicalyear year
solaryear year
lunaryear 12 lunarmonth
cran 37.5 brgallon
kip 1000 lbf
frenchfoot 16|15 ft
frenchfeet frenchfoot
toise 6 frenchfeet
sievert 8.4 rontgen
candle 1.02 candela
militarypace 2.5 feet
metre meter
litre liter
gramme gram
iudiptheria 62.8 microgram
iupenicillin .6 microgram
iuinsulin 41.67 microgram
cottonyarncount 2520 ft/pound
linenyarncount 900 ft/pound
worstedyarncount 1680 ft/pound
metricyarncount meter/gram
jewlerspoint 2 milligram