summaryrefslogtreecommitdiff
path: root/src/main/java/sevenUnits/unit/LinearUnitValue.java
diff options
context:
space:
mode:
Diffstat (limited to 'src/main/java/sevenUnits/unit/LinearUnitValue.java')
-rw-r--r--src/main/java/sevenUnits/unit/LinearUnitValue.java94
1 files changed, 53 insertions, 41 deletions
diff --git a/src/main/java/sevenUnits/unit/LinearUnitValue.java b/src/main/java/sevenUnits/unit/LinearUnitValue.java
index 678c59c..e4cc820 100644
--- a/src/main/java/sevenUnits/unit/LinearUnitValue.java
+++ b/src/main/java/sevenUnits/unit/LinearUnitValue.java
@@ -36,8 +36,9 @@ import sevenUnits.utils.UncertainDouble;
* @since 2020-07-26
*/
public final class LinearUnitValue {
+ /** The value 1 as a LinearUnitValue. */
public static final LinearUnitValue ONE = getExact(Metric.ONE, 1);
-
+
/**
* Gets an exact {@code LinearUnitValue}
*
@@ -52,12 +53,12 @@ public final class LinearUnitValue {
Objects.requireNonNull(unit, "unit must not be null"),
UncertainDouble.of(value, 0));
}
-
+
/**
* Gets an uncertain {@code LinearUnitValue}
*
- * @param unit unit to express with
- * @param value value to express
+ * @param unit unit to express with
+ * @param value value to express
* @return uncertain {@code LinearUnitValue} instance
* @since 2020-07-26
*/
@@ -67,11 +68,11 @@ public final class LinearUnitValue {
Objects.requireNonNull(unit, "unit must not be null"),
Objects.requireNonNull(value, "value may not be null"));
}
-
+
private final LinearUnit unit;
-
+
private final UncertainDouble value;
-
+
/**
* @param unit unit to express as
* @param value value to express
@@ -81,7 +82,7 @@ public final class LinearUnitValue {
this.unit = unit;
this.value = value;
}
-
+
/**
* @return this value as a {@code UnitValue}. All uncertainty information is
* removed from the returned value.
@@ -90,7 +91,7 @@ public final class LinearUnitValue {
public final UnitValue asUnitValue() {
return UnitValue.of(this.unit, this.value.value());
}
-
+
/**
* @param other a {@code LinearUnit}
* @return true iff this value can be represented with {@code other}.
@@ -99,7 +100,7 @@ public final class LinearUnitValue {
public final boolean canConvertTo(final LinearUnit other) {
return this.unit.canConvertTo(other);
}
-
+
/**
* Returns a LinearUnitValue that represents the same value expressed in a
* different unit
@@ -111,12 +112,13 @@ public final class LinearUnitValue {
public final LinearUnitValue convertTo(final LinearUnit other) {
return LinearUnitValue.of(other, this.unit.convertTo(other, this.value));
}
-
+
/**
* Convert a LinearUnitValue to a sum of multiple units, where all but the
* last have exact integer values.
*
* @param others units to convert to
+ * @return terms of the sum
* @throws IllegalArgumentException if no units are provided or units
* provided have incompatible bases
* @since 2024-08-15
@@ -130,7 +132,7 @@ public final class LinearUnitValue {
throw new IllegalArgumentException(
"All provided units must have the same base as the value.");
}
-
+
LinearUnitValue remaining = this;
final List<LinearUnitValue> values = new ArrayList<>(others.size());
for (final LinearUnit unit : others.subList(0, others.size() - 1)) {
@@ -140,13 +142,13 @@ public final class LinearUnitValue {
values.add(value);
remaining = remaining.minus(value);
}
-
+
final LinearUnitValue lastValue = remaining
.convertTo(others.get(others.size() - 1));
values.add(lastValue);
return values;
}
-
+
/**
* Divides this value by a scalar
*
@@ -157,7 +159,7 @@ public final class LinearUnitValue {
public LinearUnitValue dividedBy(final double divisor) {
return LinearUnitValue.of(this.unit, this.value.dividedByExact(divisor));
}
-
+
/**
* Divides this value by another value
*
@@ -169,7 +171,7 @@ public final class LinearUnitValue {
return LinearUnitValue.of(this.unit.dividedBy(divisor.unit),
this.value.dividedBy(divisor.value));
}
-
+
/**
* Returns true if this and obj represent the same value, regardless of
* whether or not they are expressed in the same unit. So (1000 m).equals(1
@@ -187,14 +189,17 @@ public final class LinearUnitValue {
&& this.unit.convertToBase(this.value)
.equals(other.unit.convertToBase(other.value));
}
-
+
/**
* Returns true if this and obj represent the same value, regardless of
* whether or not they are expressed in the same unit. So (1000 m).equals(1
* km) returns true.
- * <p>
- * If avoidFPErrors is true, this method will attempt to avoid floating-point
- * errors, at the cost of not always being transitive.
+ *
+ * @param obj object to test equality with
+ * @param avoidFPErrors if true, this method will attempt to avoid
+ * floating-point errors, at the cost of not always
+ * being transitive.
+ * @return true iff this and obj are equal
*
* @since 2020-07-28
*/
@@ -208,7 +213,7 @@ public final class LinearUnitValue {
&& DecimalComparison.equals(this.unit.convertToBase(this.value),
other.unit.convertToBase(other.value));
}
-
+
/**
* @param other another {@code LinearUnitValue}
* @return true iff this and other are within each other's uncertainty range
@@ -222,10 +227,10 @@ public final class LinearUnitValue {
final LinearUnit base = LinearUnit.valueOf(this.unit.getBase(), 1);
final LinearUnitValue thisBase = this.convertTo(base);
final LinearUnitValue otherBase = other.convertTo(base);
-
+
return thisBase.value.equivalent(otherBase.value);
}
-
+
/**
* @return the unit
* @since 2020-09-29
@@ -233,7 +238,7 @@ public final class LinearUnitValue {
public final LinearUnit getUnit() {
return this.unit;
}
-
+
/**
* @return the value
* @since 2020-09-29
@@ -241,7 +246,7 @@ public final class LinearUnitValue {
public final UncertainDouble getValue() {
return this.value;
}
-
+
/**
* @return the exact value
* @since 2020-09-07
@@ -249,13 +254,13 @@ public final class LinearUnitValue {
public final double getValueExact() {
return this.value.value();
}
-
+
@Override
public int hashCode() {
return Objects.hash(this.unit.getBase(),
this.unit.convertToBase(this.getValue()));
}
-
+
/**
* Returns the difference of this value and another, expressed in this
* value's unit
@@ -268,17 +273,17 @@ public final class LinearUnitValue {
*/
public LinearUnitValue minus(final LinearUnitValue subtrahend) {
Objects.requireNonNull(subtrahend, "subtrahend may not be null");
-
+
if (!this.canConvertTo(subtrahend.unit))
throw new IllegalArgumentException(String.format(
"Incompatible units for subtraction \"%s\" and \"%s\".",
this.unit, subtrahend.unit));
-
+
final LinearUnitValue otherConverted = subtrahend.convertTo(this.unit);
return LinearUnitValue.of(this.unit,
this.value.minus(otherConverted.value));
}
-
+
/**
* Returns the sum of this value and another, expressed in this value's unit
*
@@ -290,17 +295,17 @@ public final class LinearUnitValue {
*/
public LinearUnitValue plus(final LinearUnitValue addend) {
Objects.requireNonNull(addend, "addend may not be null");
-
+
if (!this.canConvertTo(addend.unit))
throw new IllegalArgumentException(String.format(
"Incompatible units for addition \"%s\" and \"%s\".", this.unit,
addend.unit));
-
+
final LinearUnitValue otherConverted = addend.convertTo(this.unit);
return LinearUnitValue.of(this.unit,
this.value.plus(otherConverted.value));
}
-
+
/**
* Multiplies this value by a scalar
*
@@ -311,7 +316,7 @@ public final class LinearUnitValue {
public LinearUnitValue times(final double multiplier) {
return LinearUnitValue.of(this.unit, this.value.timesExact(multiplier));
}
-
+
/**
* Multiplies this value by another value
*
@@ -323,7 +328,7 @@ public final class LinearUnitValue {
return LinearUnitValue.of(this.unit.times(multiplier.unit),
this.value.times(multiplier.value));
}
-
+
/**
* Raises a value to an exponent
*
@@ -335,9 +340,12 @@ public final class LinearUnitValue {
return LinearUnitValue.of(this.unit.toExponent(exponent),
this.value.toExponentExact(exponent));
}
-
+
/**
* Raises this value to an exponent, rounding all dimensions to integers.
+ *
+ * @param exponent exponent to raise this value to
+ * @return result of exponentation
*
* @since 2024-08-22
* @see ObjectProduct#toExponentRounded
@@ -346,12 +354,12 @@ public final class LinearUnitValue {
return LinearUnitValue.of(this.unit.toExponentRounded(exponent),
this.value.toExponentExact(exponent));
}
-
+
@Override
public String toString() {
return this.toString(!this.value.isExact(), RoundingMode.HALF_EVEN);
}
-
+
/**
* Returns a string representing the object. <br>
* If the attached unit has a name or symbol, the string looks like "12 km".
@@ -362,6 +370,10 @@ public final class LinearUnitValue {
* <p>
* Non-exact values are rounded intelligently based on their uncertainty.
*
+ * @param showUncertainty whether to show the value's uncertainty
+ * @param roundingMode how to round numbers in this string
+ * @return string representing this value
+ *
* @since 2020-07-26
*/
public String toString(final boolean showUncertainty,
@@ -369,9 +381,9 @@ public final class LinearUnitValue {
final Optional<String> primaryName = this.unit.getPrimaryName();
final Optional<String> symbol = this.unit.getSymbol();
final String chosenName = symbol.orElse(primaryName.orElse(null));
-
+
final UncertainDouble baseValue = this.unit.convertToBase(this.value);
-
+
// get rounded strings
// if showUncertainty is true, add brackets around the string
final String valueString = (showUncertainty ? "(" : "")
@@ -380,7 +392,7 @@ public final class LinearUnitValue {
final String baseValueString = (showUncertainty ? "(" : "")
+ baseValue.toString(showUncertainty, roundingMode)
+ (showUncertainty ? ")" : "");
-
+
// create string
if (chosenName == null)
return String.format("%s unnamed unit (= %s %s)", valueString,