2727 * then applying Frame of Reference encoding and bit-packing.
2828 * Values that cannot be losslessly converted are stored as exceptions.
2929 *
30- * <p>Encoding formula: encoded = round(value * 10^exponent / 10^factor)
31- * <p>Decoding formula: value = encoded / 10^exponent * 10^factor
30+ * <p>Encoding formula: encoded = round(value * 10^exponent * 10^(- factor) )
31+ * <p>Decoding formula: value = encoded * 10^factor * 10^(-exponent)
3232 *
3333 * <p>Exception conditions:
3434 * <ul>
@@ -45,26 +45,6 @@ private AlpEncoderDecoder() {
4545 // Utility class
4646 }
4747
48- // ========== Float multiplier ==========
49-
50- static float getFloatMultiplier (int exponent , int factor ) {
51- float multiplier = FLOAT_POW10 [exponent ];
52- if (factor > 0 ) {
53- multiplier /= FLOAT_POW10 [factor ];
54- }
55- return multiplier ;
56- }
57-
58- // ========== Double multiplier ==========
59-
60- static double getDoubleMultiplier (int exponent , int factor ) {
61- double multiplier = DOUBLE_POW10 [exponent ];
62- if (factor > 0 ) {
63- multiplier /= DOUBLE_POW10 [factor ];
64- }
65- return multiplier ;
66- }
67-
6848 // ========== Float exception detection ==========
6949
7050 /** NaN, Inf, and -0.0 can never be encoded regardless of exponent/factor. */
@@ -83,9 +63,8 @@ static boolean isFloatException(float value, int exponent, int factor) {
8363 if (isFloatException (value )) {
8464 return true ;
8565 }
86- float multiplier = getFloatMultiplier (exponent , factor );
87- float scaled = value * multiplier ;
88- if (scaled > Integer .MAX_VALUE || scaled < Integer .MIN_VALUE ) {
66+ float scaled = value * FLOAT_POW10 [exponent ] * FLOAT_POW10_NEGATIVE [factor ];
67+ if (scaled > FLOAT_ENCODING_UPPER_LIMIT || scaled < FLOAT_ENCODING_LOWER_LIMIT ) {
8968 return true ;
9069 }
9170 int encoded = encodeFloat (value , exponent , factor );
@@ -94,15 +73,18 @@ static boolean isFloatException(float value, int exponent, int factor) {
9473 }
9574
9675 // ========== Float encode/decode ==========
76+ // Two-step multiplication matching C++ to produce identical floating-point rounding.
77+ // C++ encode: value * 10^exponent * 10^(-factor)
78+ // C++ decode: (float)encoded * 10^factor * 10^(-exponent)
9779
98- /** Encode: round(value * 10^exponent / 10^factor) */
80+ /** Encode: round(value * 10^exponent * 10^(- factor) ) */
9981 static int encodeFloat (float value , int exponent , int factor ) {
100- return fastRoundFloat (value * getFloatMultiplier ( exponent , factor ) );
82+ return fastRoundFloat (value * FLOAT_POW10 [ exponent ] * FLOAT_POW10_NEGATIVE [ factor ] );
10183 }
10284
103- /** Decode: encoded / 10^exponent * 10^factor */
85+ /** Decode: encoded * 10^factor * 10^(-exponent) */
10486 static float decodeFloat (int encoded , int exponent , int factor ) {
105- return encoded / getFloatMultiplier ( exponent , factor ) ;
87+ return ( float ) encoded * FLOAT_POW10 [ factor ] * FLOAT_POW10_NEGATIVE [ exponent ] ;
10688 }
10789
10890 // Uses the 2^22+2^23 magic-number trick to round without branching on the FPU.
@@ -130,9 +112,8 @@ static boolean isDoubleException(double value, int exponent, int factor) {
130112 if (isDoubleException (value )) {
131113 return true ;
132114 }
133- double multiplier = getDoubleMultiplier (exponent , factor );
134- double scaled = value * multiplier ;
135- if (scaled > Long .MAX_VALUE || scaled < Long .MIN_VALUE ) {
115+ double scaled = value * DOUBLE_POW10 [exponent ] * DOUBLE_POW10_NEGATIVE [factor ];
116+ if (scaled > DOUBLE_ENCODING_UPPER_LIMIT || scaled < DOUBLE_ENCODING_LOWER_LIMIT ) {
136117 return true ;
137118 }
138119 long encoded = encodeDouble (value , exponent , factor );
@@ -141,13 +122,16 @@ static boolean isDoubleException(double value, int exponent, int factor) {
141122 }
142123
143124 // ========== Double encode/decode ==========
125+ // Two-step multiplication matching C++ to produce identical floating-point rounding.
144126
127+ /** Encode: round(value * 10^exponent * 10^(-factor)) */
145128 static long encodeDouble (double value , int exponent , int factor ) {
146- return fastRoundDouble (value * getDoubleMultiplier ( exponent , factor ) );
129+ return fastRoundDouble (value * DOUBLE_POW10 [ exponent ] * DOUBLE_POW10_NEGATIVE [ factor ] );
147130 }
148131
132+ /** Decode: encoded * 10^factor * 10^(-exponent) */
149133 static double decodeDouble (long encoded , int exponent , int factor ) {
150- return encoded / getDoubleMultiplier ( exponent , factor ) ;
134+ return ( double ) encoded * DOUBLE_POW10 [ factor ] * DOUBLE_POW10_NEGATIVE [ exponent ] ;
151135 }
152136
153137 // Same trick but with 2^51+2^52 for double precision.
0 commit comments