mirror of
https://git.FreeBSD.org/src.git
synced 2025-01-05 12:56:08 +00:00
Units conversion utility courtesy of NetBSD.
Submitted by: Jeremy Prior Obtained from: NetBSD
This commit is contained in:
parent
712c581c89
commit
a303171509
Notes:
svn2git
2020-12-20 02:59:44 +00:00
svn path=/vendor/NetBSD/dist/; revision=16186
9
usr.bin/units/Makefile
Normal file
9
usr.bin/units/Makefile
Normal 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
18
usr.bin/units/README
Normal 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
33
usr.bin/units/pathnames.h
Normal 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
124
usr.bin/units/units.1
Normal 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
706
usr.bin/units/units.c
Normal 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
610
usr.bin/units/units.lib
Normal 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
|
||||||
|
|
Loading…
Reference in New Issue
Block a user