From 3a3b5f3c898112a691ed6bfe9e656ccf42207a2b Mon Sep 17 00:00:00 2001 From: Matt McCutchen Date: Sun, 9 Sep 2007 17:29:06 -0400 Subject: [PATCH] Various fixes and enhancements: - Pure numbers are now exact by default. - Fix mishandling of sig-figs for negative numbers. - Add MROOTINT, MEXP, and MLN functions. - Add a sixth basic unit (mol) and some more derived units. - Add a minimal README. - Add a demo spreadsheet. --- README | 12 +++++++ measurements-demo.ods | Bin 0 -> 11108 bytes .../measurements/Measurement.java | 12 ++++--- .../measurements/MeasurementMath.java | 30 ++++++++++++++++++ .../measurements/MeasurementsAddIn.java | 21 ++++++++++++ src/net/mattmccutchen/measurements/Unit.java | 26 +++++++++------ .../measurements/XMeasurementsAddIn.idl | 3 ++ .../measurements/TestMeasurement.java | 1 + 8 files changed, 92 insertions(+), 13 deletions(-) create mode 100644 README create mode 100644 measurements-demo.ods diff --git a/README b/README new file mode 100644 index 0000000..5d2e723 --- /dev/null +++ b/README @@ -0,0 +1,12 @@ +This is Measurements, an OpenOffice.org Calc add-in that provides +functions for tracking units of measure and significant figures. + +See: http://mattmccutchen.net/measurements/ + +Legal +----- +I, Matt McCutchen, the sole author of the original Measurements add-in, waive my +copyright to it, placing it in the public domain. The add-in comes with +absolutely no warranty. + +-- Matt McCutchen diff --git a/measurements-demo.ods b/measurements-demo.ods new file mode 100644 index 0000000000000000000000000000000000000000..165e3c8681c6a61f4b6abed708c952faf4b1aaab GIT binary patch literal 11108 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 new FunctionInfo("mpowint", "mpowint", "Raises a measurement to an integer power.", Arrays.asList(new ArgumentInfo("base", "Base"), new ArgumentInfo("exp", "Exponent"))), + new FunctionInfo("mrootint", "mrootint", "Takes an integer square root of a measurement. Does not allow fractional powers of units in the result.", + Arrays.asList(new ArgumentInfo("base", "Base"), + new ArgumentInfo("exp", "Exponent"))), new FunctionInfo("mpow", "mpow", "Raises one measurement to the power of another. Both must be pure numbers.", Arrays.asList(new ArgumentInfo("base", "Base"), new ArgumentInfo("exp", "Exponent"))), + new FunctionInfo("mexp", "mexp", "Raises e (2.718...) to the power of a measurement.", + Arrays.asList(new ArgumentInfo("m", "Measurement"))), + new FunctionInfo("mln", "mln", "Takes the natural logarithm of a measurement. " + + "The measurement must be a pure number, so you may have to rewrite a difference of logarithms as a logarithm of a quotient.", + Arrays.asList(new ArgumentInfo("m", "Measurement"))), new FunctionInfo("mcmp", "mcmp", "Returns the difference between two measurements, expressed in units of the sum of their uncertainties. " + "You can compare measurements very flexibly by checking the result against a tolerance.", @@ -100,10 +108,23 @@ public class MeasurementsAddIn extends AddInBase return Measurement.format(MeasurementMath.powint( Measurement.parseCode(a), b), true); } + public String mrootint(String a, String bstr) { + int b = Integer.parseInt(bstr); + return Measurement.format(MeasurementMath.rootint( + Measurement.parseCode(a), b), true); + } public String mpow(String a, String b) { return Measurement.format(MeasurementMath.pow( Measurement.parseCode(a), Measurement.parseCode(b)), true); } + public String mexp(String m) { + return Measurement.format(MeasurementMath.exp( + Measurement.parseCode(m)), true); + } + public String mln(String m) { + return Measurement.format(MeasurementMath.ln( + Measurement.parseCode(m)), true); + } public double mcmp(String a, String b) { return MeasurementMath.cmp( Measurement.parseCode(a), Measurement.parseCode(b)); diff --git a/src/net/mattmccutchen/measurements/Unit.java b/src/net/mattmccutchen/measurements/Unit.java index 25d33ac..4becce2 100644 --- a/src/net/mattmccutchen/measurements/Unit.java +++ b/src/net/mattmccutchen/measurements/Unit.java @@ -3,21 +3,28 @@ package net.mattmccutchen.measurements; import java.util.*; public class Unit { - public static final Unit SECOND = new Unit("s" , 1.0, 1, 0, 0, 0, 0); - public static final Unit METER = new Unit("m" , 1.0, 0, 1, 0, 0, 0); - public static final Unit GRAM = new Unit("g" , 1.0, 0, 0, 1, 0, 0); - public static final Unit COULOMB = new Unit("coul", 1.0, 0, 0, 0, 1, 0); - public static final Unit KELVIN = new Unit("K" , 1.0, 0, 0, 0, 0, 1); + public static final Unit SECOND = new Unit("s" , 1.0, 1, 0, 0, 0, 0, 0); + public static final Unit METER = new Unit("m" , 1.0, 0, 1, 0, 0, 0, 0); + public static final Unit GRAM = new Unit("g" , 1.0, 0, 0, 1, 0, 0, 0); + public static final Unit COULOMB = new Unit("coul", 1.0, 0, 0, 0, 1, 0, 0); + public static final Unit KELVIN = new Unit("K" , 1.0, 0, 0, 0, 0, 1, 0); + public static final Unit MOLE = new Unit("mol" , 1.0, 0, 0, 0, 0, 0, 1); public static final Unit[] basicUnits = new Unit[] { - SECOND, METER, GRAM, COULOMB, KELVIN, + SECOND, METER, GRAM, COULOMB, KELVIN, MOLE, }; // Don't mutate - public static final Unit LITER = new Unit("L", 1e-3, 0, 3, 0, 0, 0); - public static final Unit PERCENT = new Unit("%", 1e-2, 0, 0, 0, 0, 0); + public static final Unit PERCENT = new Unit("%", 1e-2, 0, 0, 0, 0, 0, 0); + public static final Unit NEWTON = new Unit("N", 1e+3,-2, 1, 1, 0, 0, 0); + public static final Unit JOULE = new Unit("J", 1e+3,-2, 2, 1, 0, 0, 0); + public static final Unit WATT = new Unit("W", 1e+3,-3, 2, 1, 0, 0, 0); + public static final Unit VOLT = new Unit("V", 1e+3,-2, 2, 1,-1, 0, 0); + public static final Unit AMP = new Unit("A", 1.0 ,-1, 0, 0, 1, 0, 0); + public static final Unit LITER = new Unit("L", 1e-3, 0, 3, 0, 0, 0, 0); public static final Unit[] allUnits = new Unit[] { - PERCENT, SECOND, METER, GRAM, COULOMB, KELVIN, LITER, + SECOND, METER, GRAM, COULOMB, KELVIN, MOLE, + PERCENT, NEWTON, JOULE, WATT, VOLT, AMP, LITER, }; // Don't mutate public final String symbol; @@ -60,6 +67,7 @@ public class Unit { prefixes.put('E', 1e+18); prefixes.put('Z', 1e+21); prefixes.put('Y', 1e+24); + prefixes.put('c', 1e-02); prefixes.put('m', 1e-03); prefixes.put('u', 1e-06); // micro -> u: oh well prefixes.put('n', 1e-09); diff --git a/src/net/mattmccutchen/measurements/XMeasurementsAddIn.idl b/src/net/mattmccutchen/measurements/XMeasurementsAddIn.idl index 0a6bc80..fcb6904 100644 --- a/src/net/mattmccutchen/measurements/XMeasurementsAddIn.idl +++ b/src/net/mattmccutchen/measurements/XMeasurementsAddIn.idl @@ -14,7 +14,10 @@ module net { string mmul([in] string a, [in] string b); string mdiv([in] string a, [in] string b); string mpowint([in] string a, [in] string b); + string mrootint([in] string a, [in] string b); string mpow([in] string a, [in] string b); + string mexp([in] string a); + string mln([in] string a); double mcmp([in] string a, [in] string b); string mcleanstr([in] string m); diff --git a/test/net/mattmccutchen/measurements/TestMeasurement.java b/test/net/mattmccutchen/measurements/TestMeasurement.java index 3745dde..4f120a2 100644 --- a/test/net/mattmccutchen/measurements/TestMeasurement.java +++ b/test/net/mattmccutchen/measurements/TestMeasurement.java @@ -23,5 +23,6 @@ public class TestMeasurement { System.out.println(ma.mmul("50.00 mL", "1.000 mg mL^-1")); System.out.println(ma.mstras("50.00 mL", "L")); System.out.println(ma.mstras("50.00 mL", "YL")); + System.out.println(ma.mln(".365 ")); } } -- 2.34.1