/**
  * After a call to {@code transform}, applies the <em>inverse</em> transform on {@code dstPts} and
  * compares the result with {@code srcPts}. The maximal difference (in absolute value) is
  * returned. This method is used for assertions.
  */
 private float maxError(
     final float[] srcPts1,
     final double[] srcPts2,
     int srcOff,
     final float[] dstPts1,
     final double[] dstPts2,
     int dstOff,
     int numPts) {
   float max = 0f;
   if (inverse == null) {
     inverse();
     if (inverse == null) {
       return max; // Custom user's subclass; can't do the test.
     }
   }
   final int sourceDim = getSourceDimensions();
   final float[] tmp = new float[numPts * sourceDim];
   inverse.transform(dstPts1, dstPts2, dstOff, tmp, null, 0, numPts);
   for (int i = 0; i < tmp.length; i++, srcOff++) {
     final float expected = (srcPts2 != null) ? (float) srcPts2[srcOff] : srcPts1[srcOff];
     float error = abs(tmp[i] - expected);
     switch (i % sourceDim) {
       case 0:
         error -= 360 * floor(error / 360);
         break; // Rool Longitude
       case 2:
         continue; // Ignore height because inacurate.
     }
     if (error > max) {
       max = error;
     }
   }
   return max;
 }
 /** Creates the inverse transform of this object. */
 @Override
 public MathTransform inverse() {
   if (inverse == null) {
     inverse =
         new MolodenskiTransform(
             abridged, a + da, b + db, target3D, a, b, source3D, -dx, -dy, -dz);
     inverse.inverse = this;
   }
   return inverse;
 }