diff --git a/cdm/core/src/main/java/ucar/nc2/util/Misc.java b/cdm/core/src/main/java/ucar/nc2/util/Misc.java index 0f34f5c1c4..86fd2619b8 100644 --- a/cdm/core/src/main/java/ucar/nc2/util/Misc.java +++ b/cdm/core/src/main/java/ucar/nc2/util/Misc.java @@ -96,9 +96,9 @@ public static boolean nearlyEquals(float a, float b) { return nearlyEquals(a, b, defaultMaxRelativeDiffFloat); } - /** AbsoluteDifference is less than maxAbsDiff. */ - public static boolean nearlyEquals(float a, float b, float maxAbsDiff) { - return DoubleMath.fuzzyEquals(a, b, maxAbsDiff); + /** RelativeDifference is less than maxRelDiff. */ + public static boolean nearlyEquals(float a, float b, float maxRelDiff) { + return relativeDifference(a, b) < maxRelDiff; } /** AbsoluteDifference is less than {@link #defaultMaxRelativeDiffDouble}. */ @@ -106,9 +106,9 @@ public static boolean nearlyEquals(double a, double b) { return nearlyEquals(a, b, defaultMaxRelativeDiffDouble); } - /** AbsoluteDifference is less than maxAbsDiff. */ - public static boolean nearlyEquals(double a, double b, double maxAbsDiff) { - return DoubleMath.fuzzyEquals(a, b, maxAbsDiff); + /** RelativeDifference is less than maxRelDiff. */ + public static boolean nearlyEquals(double a, double b, double maxRelDiff) { + return relativeDifference(a, b) < maxRelDiff; } /** AbsoluteDifference is less than maxAbsDiff. */ diff --git a/cdm/core/src/test/java/ucar/nc2/filter/TestEnhancements.java b/cdm/core/src/test/java/ucar/nc2/filter/TestEnhancements.java index e1b2558a7e..e60a4d29bf 100644 --- a/cdm/core/src/test/java/ucar/nc2/filter/TestEnhancements.java +++ b/cdm/core/src/test/java/ucar/nc2/filter/TestEnhancements.java @@ -17,6 +17,7 @@ import static com.google.common.truth.Truth.assertThat; import java.io.IOException; +import java.util.Arrays; public class TestEnhancements { @@ -75,6 +76,13 @@ public static void setUp() throws IOException, InvalidRangeException { .addAttribute(new Attribute(CDM.FILL_VALUE, SIGNED_SCALED_FILL_VALUE)) .addAttribute(new Attribute(CDM.MISSING_VALUE, SIGNED_SCALED_MISSING_VALUE)); + // short data with small scale and offsets + Array smallVals = Array.factory(DataType.FLOAT, new int[] {dataLen}, missingData); + + builder.addVariable("smallVals", DataType.FLOAT, "dim").addAttribute(new Attribute(CDM.SCALE_FACTOR, 1e-12)) + .addAttribute(new Attribute(CDM.ADD_OFFSET, 1e-12)).addAttribute(new Attribute(CDM.FILL_VALUE, 110)); + + // write data NetcdfFormatWriter writer = builder.build(); writer.write(writer.findVariable("signedVar"), new int[1], signedData); @@ -85,6 +93,7 @@ public static void setUp() throws IOException, InvalidRangeException { writer.write(writer.findVariable("validMinMax"), new int[1], missingDataArray); writer.write(writer.findVariable("validRange"), new int[1], missingDataArray); writer.write(writer.findVariable("enhanceAll"), new int[1], enhanceAllArray); + writer.write(writer.findVariable("smallVals"), new int[1], smallVals); writer.close(); ncd = NetcdfDatasets.openDataset(filePath); } @@ -152,4 +161,12 @@ public void testCombinedEnhancements() throws IOException { Array data = v.read(); assertThat((double[]) data.copyTo1DJavaArray()).isEqualTo(expected); } + + @Test + public void testConvertMissingWithSmallScaleAndOffset() throws IOException { + Variable v = ncd.findVariable("smallVals"); + Array data = v.read(); + assertThat(Double.isNaN(data.getDouble(2))).isTrue(); + assertThat(Double.isNaN(data.getDouble(1))).isFalse(); + } }