Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
PojavLauncherTeam
GitHub Repository: PojavLauncherTeam/openjdk-multiarch-jdk8u
Path: blob/aarch64-shenandoah-jdk8u272-b10/jdk/test/sun/misc/FloatingDecimal/OldFloatingDecimalForTest.java
38839 views
1
/*
2
* Copyright (c) 1996, 2013, Oracle and/or its affiliates. All rights reserved.
3
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
4
*
5
* This code is free software; you can redistribute it and/or modify it
6
* under the terms of the GNU General Public License version 2 only, as
7
* published by the Free Software Foundation.
8
*
9
* This code is distributed in the hope that it will be useful, but WITHOUT
10
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
11
* FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
12
* version 2 for more details (a copy is included in the LICENSE file that
13
* accompanied this code).
14
*
15
* You should have received a copy of the GNU General Public License version
16
* 2 along with this work; if not, write to the Free Software Foundation,
17
* Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
18
*
19
* Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
20
* or visit www.oracle.com if you need additional information or have any
21
* questions.
22
*/
23
24
//package sun.misc;
25
26
import sun.misc.DoubleConsts;
27
import sun.misc.FloatConsts;
28
import java.util.regex.*;
29
30
public class OldFloatingDecimalForTest{
31
boolean isExceptional;
32
boolean isNegative;
33
int decExponent;
34
char digits[];
35
int nDigits;
36
int bigIntExp;
37
int bigIntNBits;
38
boolean mustSetRoundDir = false;
39
boolean fromHex = false;
40
int roundDir = 0; // set by doubleValue
41
42
/*
43
* The fields below provides additional information about the result of
44
* the binary to decimal digits conversion done in dtoa() and roundup()
45
* methods. They are changed if needed by those two methods.
46
*/
47
48
// True if the dtoa() binary to decimal conversion was exact.
49
boolean exactDecimalConversion = false;
50
51
// True if the result of the binary to decimal conversion was rounded-up
52
// at the end of the conversion process, i.e. roundUp() method was called.
53
boolean decimalDigitsRoundedUp = false;
54
55
private OldFloatingDecimalForTest( boolean negSign, int decExponent, char []digits, int n, boolean e )
56
{
57
isNegative = negSign;
58
isExceptional = e;
59
this.decExponent = decExponent;
60
this.digits = digits;
61
this.nDigits = n;
62
}
63
64
/*
65
* Constants of the implementation
66
* Most are IEEE-754 related.
67
* (There are more really boring constants at the end.)
68
*/
69
static final long signMask = 0x8000000000000000L;
70
static final long expMask = 0x7ff0000000000000L;
71
static final long fractMask= ~(signMask|expMask);
72
static final int expShift = 52;
73
static final int expBias = 1023;
74
static final long fractHOB = ( 1L<<expShift ); // assumed High-Order bit
75
static final long expOne = ((long)expBias)<<expShift; // exponent of 1.0
76
static final int maxSmallBinExp = 62;
77
static final int minSmallBinExp = -( 63 / 3 );
78
static final int maxDecimalDigits = 15;
79
static final int maxDecimalExponent = 308;
80
static final int minDecimalExponent = -324;
81
static final int bigDecimalExponent = 324; // i.e. abs(minDecimalExponent)
82
83
static final long highbyte = 0xff00000000000000L;
84
static final long highbit = 0x8000000000000000L;
85
static final long lowbytes = ~highbyte;
86
87
static final int singleSignMask = 0x80000000;
88
static final int singleExpMask = 0x7f800000;
89
static final int singleFractMask = ~(singleSignMask|singleExpMask);
90
static final int singleExpShift = 23;
91
static final int singleFractHOB = 1<<singleExpShift;
92
static final int singleExpBias = 127;
93
static final int singleMaxDecimalDigits = 7;
94
static final int singleMaxDecimalExponent = 38;
95
static final int singleMinDecimalExponent = -45;
96
97
static final int intDecimalDigits = 9;
98
99
100
/*
101
* count number of bits from high-order 1 bit to low-order 1 bit,
102
* inclusive.
103
*/
104
private static int
105
countBits( long v ){
106
//
107
// the strategy is to shift until we get a non-zero sign bit
108
// then shift until we have no bits left, counting the difference.
109
// we do byte shifting as a hack. Hope it helps.
110
//
111
if ( v == 0L ) return 0;
112
113
while ( ( v & highbyte ) == 0L ){
114
v <<= 8;
115
}
116
while ( v > 0L ) { // i.e. while ((v&highbit) == 0L )
117
v <<= 1;
118
}
119
120
int n = 0;
121
while (( v & lowbytes ) != 0L ){
122
v <<= 8;
123
n += 8;
124
}
125
while ( v != 0L ){
126
v <<= 1;
127
n += 1;
128
}
129
return n;
130
}
131
132
/*
133
* Keep big powers of 5 handy for future reference.
134
*/
135
private static OldFDBigIntForTest b5p[];
136
137
private static synchronized OldFDBigIntForTest
138
big5pow( int p ){
139
assert p >= 0 : p; // negative power of 5
140
if ( b5p == null ){
141
b5p = new OldFDBigIntForTest[ p+1 ];
142
}else if (b5p.length <= p ){
143
OldFDBigIntForTest t[] = new OldFDBigIntForTest[ p+1 ];
144
System.arraycopy( b5p, 0, t, 0, b5p.length );
145
b5p = t;
146
}
147
if ( b5p[p] != null )
148
return b5p[p];
149
else if ( p < small5pow.length )
150
return b5p[p] = new OldFDBigIntForTest( small5pow[p] );
151
else if ( p < long5pow.length )
152
return b5p[p] = new OldFDBigIntForTest( long5pow[p] );
153
else {
154
// construct the value.
155
// recursively.
156
int q, r;
157
// in order to compute 5^p,
158
// compute its square root, 5^(p/2) and square.
159
// or, let q = p / 2, r = p -q, then
160
// 5^p = 5^(q+r) = 5^q * 5^r
161
q = p >> 1;
162
r = p - q;
163
OldFDBigIntForTest bigq = b5p[q];
164
if ( bigq == null )
165
bigq = big5pow ( q );
166
if ( r < small5pow.length ){
167
return (b5p[p] = bigq.mult( small5pow[r] ) );
168
}else{
169
OldFDBigIntForTest bigr = b5p[ r ];
170
if ( bigr == null )
171
bigr = big5pow( r );
172
return (b5p[p] = bigq.mult( bigr ) );
173
}
174
}
175
}
176
177
//
178
// a common operation
179
//
180
private static OldFDBigIntForTest
181
multPow52( OldFDBigIntForTest v, int p5, int p2 ){
182
if ( p5 != 0 ){
183
if ( p5 < small5pow.length ){
184
v = v.mult( small5pow[p5] );
185
} else {
186
v = v.mult( big5pow( p5 ) );
187
}
188
}
189
if ( p2 != 0 ){
190
v.lshiftMe( p2 );
191
}
192
return v;
193
}
194
195
//
196
// another common operation
197
//
198
private static OldFDBigIntForTest
199
constructPow52( int p5, int p2 ){
200
OldFDBigIntForTest v = new OldFDBigIntForTest( big5pow( p5 ) );
201
if ( p2 != 0 ){
202
v.lshiftMe( p2 );
203
}
204
return v;
205
}
206
207
/*
208
* Make a floating double into a OldFDBigIntForTest.
209
* This could also be structured as a OldFDBigIntForTest
210
* constructor, but we'd have to build a lot of knowledge
211
* about floating-point representation into it, and we don't want to.
212
*
213
* AS A SIDE EFFECT, THIS METHOD WILL SET THE INSTANCE VARIABLES
214
* bigIntExp and bigIntNBits
215
*
216
*/
217
private OldFDBigIntForTest
218
doubleToBigInt( double dval ){
219
long lbits = Double.doubleToLongBits( dval ) & ~signMask;
220
int binexp = (int)(lbits >>> expShift);
221
lbits &= fractMask;
222
if ( binexp > 0 ){
223
lbits |= fractHOB;
224
} else {
225
assert lbits != 0L : lbits; // doubleToBigInt(0.0)
226
binexp +=1;
227
while ( (lbits & fractHOB ) == 0L){
228
lbits <<= 1;
229
binexp -= 1;
230
}
231
}
232
binexp -= expBias;
233
int nbits = countBits( lbits );
234
/*
235
* We now know where the high-order 1 bit is,
236
* and we know how many there are.
237
*/
238
int lowOrderZeros = expShift+1-nbits;
239
lbits >>>= lowOrderZeros;
240
241
bigIntExp = binexp+1-nbits;
242
bigIntNBits = nbits;
243
return new OldFDBigIntForTest( lbits );
244
}
245
246
/*
247
* Compute a number that is the ULP of the given value,
248
* for purposes of addition/subtraction. Generally easy.
249
* More difficult if subtracting and the argument
250
* is a normalized a power of 2, as the ULP changes at these points.
251
*/
252
private static double ulp( double dval, boolean subtracting ){
253
long lbits = Double.doubleToLongBits( dval ) & ~signMask;
254
int binexp = (int)(lbits >>> expShift);
255
double ulpval;
256
if ( subtracting && ( binexp >= expShift ) && ((lbits&fractMask) == 0L) ){
257
// for subtraction from normalized, powers of 2,
258
// use next-smaller exponent
259
binexp -= 1;
260
}
261
if ( binexp > expShift ){
262
ulpval = Double.longBitsToDouble( ((long)(binexp-expShift))<<expShift );
263
} else if ( binexp == 0 ){
264
ulpval = Double.MIN_VALUE;
265
} else {
266
ulpval = Double.longBitsToDouble( 1L<<(binexp-1) );
267
}
268
if ( subtracting ) ulpval = - ulpval;
269
270
return ulpval;
271
}
272
273
/*
274
* Round a double to a float.
275
* In addition to the fraction bits of the double,
276
* look at the class instance variable roundDir,
277
* which should help us avoid double-rounding error.
278
* roundDir was set in hardValueOf if the estimate was
279
* close enough, but not exact. It tells us which direction
280
* of rounding is preferred.
281
*/
282
float
283
stickyRound( double dval ){
284
long lbits = Double.doubleToLongBits( dval );
285
long binexp = lbits & expMask;
286
if ( binexp == 0L || binexp == expMask ){
287
// what we have here is special.
288
// don't worry, the right thing will happen.
289
return (float) dval;
290
}
291
lbits += (long)roundDir; // hack-o-matic.
292
return (float)Double.longBitsToDouble( lbits );
293
}
294
295
296
/*
297
* This is the easy subcase --
298
* all the significant bits, after scaling, are held in lvalue.
299
* negSign and decExponent tell us what processing and scaling
300
* has already been done. Exceptional cases have already been
301
* stripped out.
302
* In particular:
303
* lvalue is a finite number (not Inf, nor NaN)
304
* lvalue > 0L (not zero, nor negative).
305
*
306
* The only reason that we develop the digits here, rather than
307
* calling on Long.toString() is that we can do it a little faster,
308
* and besides want to treat trailing 0s specially. If Long.toString
309
* changes, we should re-evaluate this strategy!
310
*/
311
private void
312
developLongDigits( int decExponent, long lvalue, long insignificant ){
313
char digits[];
314
int ndigits;
315
int digitno;
316
int c;
317
//
318
// Discard non-significant low-order bits, while rounding,
319
// up to insignificant value.
320
int i;
321
for ( i = 0; insignificant >= 10L; i++ )
322
insignificant /= 10L;
323
if ( i != 0 ){
324
long pow10 = long5pow[i] << i; // 10^i == 5^i * 2^i;
325
long residue = lvalue % pow10;
326
lvalue /= pow10;
327
decExponent += i;
328
if ( residue >= (pow10>>1) ){
329
// round up based on the low-order bits we're discarding
330
lvalue++;
331
}
332
}
333
if ( lvalue <= Integer.MAX_VALUE ){
334
assert lvalue > 0L : lvalue; // lvalue <= 0
335
// even easier subcase!
336
// can do int arithmetic rather than long!
337
int ivalue = (int)lvalue;
338
ndigits = 10;
339
digits = perThreadBuffer.get();
340
digitno = ndigits-1;
341
c = ivalue%10;
342
ivalue /= 10;
343
while ( c == 0 ){
344
decExponent++;
345
c = ivalue%10;
346
ivalue /= 10;
347
}
348
while ( ivalue != 0){
349
digits[digitno--] = (char)(c+'0');
350
decExponent++;
351
c = ivalue%10;
352
ivalue /= 10;
353
}
354
digits[digitno] = (char)(c+'0');
355
} else {
356
// same algorithm as above (same bugs, too )
357
// but using long arithmetic.
358
ndigits = 20;
359
digits = perThreadBuffer.get();
360
digitno = ndigits-1;
361
c = (int)(lvalue%10L);
362
lvalue /= 10L;
363
while ( c == 0 ){
364
decExponent++;
365
c = (int)(lvalue%10L);
366
lvalue /= 10L;
367
}
368
while ( lvalue != 0L ){
369
digits[digitno--] = (char)(c+'0');
370
decExponent++;
371
c = (int)(lvalue%10L);
372
lvalue /= 10;
373
}
374
digits[digitno] = (char)(c+'0');
375
}
376
char result [];
377
ndigits -= digitno;
378
result = new char[ ndigits ];
379
System.arraycopy( digits, digitno, result, 0, ndigits );
380
this.digits = result;
381
this.decExponent = decExponent+1;
382
this.nDigits = ndigits;
383
}
384
385
//
386
// add one to the least significant digit.
387
// in the unlikely event there is a carry out,
388
// deal with it.
389
// assert that this will only happen where there
390
// is only one digit, e.g. (float)1e-44 seems to do it.
391
//
392
private void
393
roundup(){
394
int i;
395
int q = digits[ i = (nDigits-1)];
396
if ( q == '9' ){
397
while ( q == '9' && i > 0 ){
398
digits[i] = '0';
399
q = digits[--i];
400
}
401
if ( q == '9' ){
402
// carryout! High-order 1, rest 0s, larger exp.
403
decExponent += 1;
404
digits[0] = '1';
405
return;
406
}
407
// else fall through.
408
}
409
digits[i] = (char)(q+1);
410
decimalDigitsRoundedUp = true;
411
}
412
413
public boolean digitsRoundedUp() {
414
return decimalDigitsRoundedUp;
415
}
416
417
/*
418
* FIRST IMPORTANT CONSTRUCTOR: DOUBLE
419
*/
420
public OldFloatingDecimalForTest( double d )
421
{
422
long dBits = Double.doubleToLongBits( d );
423
long fractBits;
424
int binExp;
425
int nSignificantBits;
426
427
// discover and delete sign
428
if ( (dBits&signMask) != 0 ){
429
isNegative = true;
430
dBits ^= signMask;
431
} else {
432
isNegative = false;
433
}
434
// Begin to unpack
435
// Discover obvious special cases of NaN and Infinity.
436
binExp = (int)( (dBits&expMask) >> expShift );
437
fractBits = dBits&fractMask;
438
if ( binExp == (int)(expMask>>expShift) ) {
439
isExceptional = true;
440
if ( fractBits == 0L ){
441
digits = infinity;
442
} else {
443
digits = notANumber;
444
isNegative = false; // NaN has no sign!
445
}
446
nDigits = digits.length;
447
return;
448
}
449
isExceptional = false;
450
// Finish unpacking
451
// Normalize denormalized numbers.
452
// Insert assumed high-order bit for normalized numbers.
453
// Subtract exponent bias.
454
if ( binExp == 0 ){
455
if ( fractBits == 0L ){
456
// not a denorm, just a 0!
457
decExponent = 0;
458
digits = zero;
459
nDigits = 1;
460
return;
461
}
462
while ( (fractBits&fractHOB) == 0L ){
463
fractBits <<= 1;
464
binExp -= 1;
465
}
466
nSignificantBits = expShift + binExp +1; // recall binExp is - shift count.
467
binExp += 1;
468
} else {
469
fractBits |= fractHOB;
470
nSignificantBits = expShift+1;
471
}
472
binExp -= expBias;
473
// call the routine that actually does all the hard work.
474
dtoa( binExp, fractBits, nSignificantBits );
475
}
476
477
/*
478
* SECOND IMPORTANT CONSTRUCTOR: SINGLE
479
*/
480
public OldFloatingDecimalForTest( float f )
481
{
482
int fBits = Float.floatToIntBits( f );
483
int fractBits;
484
int binExp;
485
int nSignificantBits;
486
487
// discover and delete sign
488
if ( (fBits&singleSignMask) != 0 ){
489
isNegative = true;
490
fBits ^= singleSignMask;
491
} else {
492
isNegative = false;
493
}
494
// Begin to unpack
495
// Discover obvious special cases of NaN and Infinity.
496
binExp = (fBits&singleExpMask) >> singleExpShift;
497
fractBits = fBits&singleFractMask;
498
if ( binExp == (singleExpMask>>singleExpShift) ) {
499
isExceptional = true;
500
if ( fractBits == 0L ){
501
digits = infinity;
502
} else {
503
digits = notANumber;
504
isNegative = false; // NaN has no sign!
505
}
506
nDigits = digits.length;
507
return;
508
}
509
isExceptional = false;
510
// Finish unpacking
511
// Normalize denormalized numbers.
512
// Insert assumed high-order bit for normalized numbers.
513
// Subtract exponent bias.
514
if ( binExp == 0 ){
515
if ( fractBits == 0 ){
516
// not a denorm, just a 0!
517
decExponent = 0;
518
digits = zero;
519
nDigits = 1;
520
return;
521
}
522
while ( (fractBits&singleFractHOB) == 0 ){
523
fractBits <<= 1;
524
binExp -= 1;
525
}
526
nSignificantBits = singleExpShift + binExp +1; // recall binExp is - shift count.
527
binExp += 1;
528
} else {
529
fractBits |= singleFractHOB;
530
nSignificantBits = singleExpShift+1;
531
}
532
binExp -= singleExpBias;
533
// call the routine that actually does all the hard work.
534
dtoa( binExp, ((long)fractBits)<<(expShift-singleExpShift), nSignificantBits );
535
}
536
537
private void
538
dtoa( int binExp, long fractBits, int nSignificantBits )
539
{
540
int nFractBits; // number of significant bits of fractBits;
541
int nTinyBits; // number of these to the right of the point.
542
int decExp;
543
544
// Examine number. Determine if it is an easy case,
545
// which we can do pretty trivially using float/long conversion,
546
// or whether we must do real work.
547
nFractBits = countBits( fractBits );
548
nTinyBits = Math.max( 0, nFractBits - binExp - 1 );
549
if ( binExp <= maxSmallBinExp && binExp >= minSmallBinExp ){
550
// Look more closely at the number to decide if,
551
// with scaling by 10^nTinyBits, the result will fit in
552
// a long.
553
if ( (nTinyBits < long5pow.length) && ((nFractBits + n5bits[nTinyBits]) < 64 ) ){
554
/*
555
* We can do this:
556
* take the fraction bits, which are normalized.
557
* (a) nTinyBits == 0: Shift left or right appropriately
558
* to align the binary point at the extreme right, i.e.
559
* where a long int point is expected to be. The integer
560
* result is easily converted to a string.
561
* (b) nTinyBits > 0: Shift right by expShift-nFractBits,
562
* which effectively converts to long and scales by
563
* 2^nTinyBits. Then multiply by 5^nTinyBits to
564
* complete the scaling. We know this won't overflow
565
* because we just counted the number of bits necessary
566
* in the result. The integer you get from this can
567
* then be converted to a string pretty easily.
568
*/
569
long halfULP;
570
if ( nTinyBits == 0 ) {
571
if ( binExp > nSignificantBits ){
572
halfULP = 1L << ( binExp-nSignificantBits-1);
573
} else {
574
halfULP = 0L;
575
}
576
if ( binExp >= expShift ){
577
fractBits <<= (binExp-expShift);
578
} else {
579
fractBits >>>= (expShift-binExp) ;
580
}
581
developLongDigits( 0, fractBits, halfULP );
582
return;
583
}
584
/*
585
* The following causes excess digits to be printed
586
* out in the single-float case. Our manipulation of
587
* halfULP here is apparently not correct. If we
588
* better understand how this works, perhaps we can
589
* use this special case again. But for the time being,
590
* we do not.
591
* else {
592
* fractBits >>>= expShift+1-nFractBits;
593
* fractBits *= long5pow[ nTinyBits ];
594
* halfULP = long5pow[ nTinyBits ] >> (1+nSignificantBits-nFractBits);
595
* developLongDigits( -nTinyBits, fractBits, halfULP );
596
* return;
597
* }
598
*/
599
}
600
}
601
/*
602
* This is the hard case. We are going to compute large positive
603
* integers B and S and integer decExp, s.t.
604
* d = ( B / S ) * 10^decExp
605
* 1 <= B / S < 10
606
* Obvious choices are:
607
* decExp = floor( log10(d) )
608
* B = d * 2^nTinyBits * 10^max( 0, -decExp )
609
* S = 10^max( 0, decExp) * 2^nTinyBits
610
* (noting that nTinyBits has already been forced to non-negative)
611
* I am also going to compute a large positive integer
612
* M = (1/2^nSignificantBits) * 2^nTinyBits * 10^max( 0, -decExp )
613
* i.e. M is (1/2) of the ULP of d, scaled like B.
614
* When we iterate through dividing B/S and picking off the
615
* quotient bits, we will know when to stop when the remainder
616
* is <= M.
617
*
618
* We keep track of powers of 2 and powers of 5.
619
*/
620
621
/*
622
* Estimate decimal exponent. (If it is small-ish,
623
* we could double-check.)
624
*
625
* First, scale the mantissa bits such that 1 <= d2 < 2.
626
* We are then going to estimate
627
* log10(d2) ~=~ (d2-1.5)/1.5 + log(1.5)
628
* and so we can estimate
629
* log10(d) ~=~ log10(d2) + binExp * log10(2)
630
* take the floor and call it decExp.
631
* FIXME -- use more precise constants here. It costs no more.
632
*/
633
double d2 = Double.longBitsToDouble(
634
expOne | ( fractBits &~ fractHOB ) );
635
decExp = (int)Math.floor(
636
(d2-1.5D)*0.289529654D + 0.176091259 + (double)binExp * 0.301029995663981 );
637
int B2, B5; // powers of 2 and powers of 5, respectively, in B
638
int S2, S5; // powers of 2 and powers of 5, respectively, in S
639
int M2, M5; // powers of 2 and powers of 5, respectively, in M
640
int Bbits; // binary digits needed to represent B, approx.
641
int tenSbits; // binary digits needed to represent 10*S, approx.
642
OldFDBigIntForTest Sval, Bval, Mval;
643
644
B5 = Math.max( 0, -decExp );
645
B2 = B5 + nTinyBits + binExp;
646
647
S5 = Math.max( 0, decExp );
648
S2 = S5 + nTinyBits;
649
650
M5 = B5;
651
M2 = B2 - nSignificantBits;
652
653
/*
654
* the long integer fractBits contains the (nFractBits) interesting
655
* bits from the mantissa of d ( hidden 1 added if necessary) followed
656
* by (expShift+1-nFractBits) zeros. In the interest of compactness,
657
* I will shift out those zeros before turning fractBits into a
658
* OldFDBigIntForTest. The resulting whole number will be
659
* d * 2^(nFractBits-1-binExp).
660
*/
661
fractBits >>>= (expShift+1-nFractBits);
662
B2 -= nFractBits-1;
663
int common2factor = Math.min( B2, S2 );
664
B2 -= common2factor;
665
S2 -= common2factor;
666
M2 -= common2factor;
667
668
/*
669
* HACK!! For exact powers of two, the next smallest number
670
* is only half as far away as we think (because the meaning of
671
* ULP changes at power-of-two bounds) for this reason, we
672
* hack M2. Hope this works.
673
*/
674
if ( nFractBits == 1 )
675
M2 -= 1;
676
677
if ( M2 < 0 ){
678
// oops.
679
// since we cannot scale M down far enough,
680
// we must scale the other values up.
681
B2 -= M2;
682
S2 -= M2;
683
M2 = 0;
684
}
685
/*
686
* Construct, Scale, iterate.
687
* Some day, we'll write a stopping test that takes
688
* account of the asymmetry of the spacing of floating-point
689
* numbers below perfect powers of 2
690
* 26 Sept 96 is not that day.
691
* So we use a symmetric test.
692
*/
693
char digits[] = this.digits = new char[18];
694
int ndigit = 0;
695
boolean low, high;
696
long lowDigitDifference;
697
int q;
698
699
/*
700
* Detect the special cases where all the numbers we are about
701
* to compute will fit in int or long integers.
702
* In these cases, we will avoid doing OldFDBigIntForTest arithmetic.
703
* We use the same algorithms, except that we "normalize"
704
* our OldFDBigIntForTests before iterating. This is to make division easier,
705
* as it makes our fist guess (quotient of high-order words)
706
* more accurate!
707
*
708
* Some day, we'll write a stopping test that takes
709
* account of the asymmetry of the spacing of floating-point
710
* numbers below perfect powers of 2
711
* 26 Sept 96 is not that day.
712
* So we use a symmetric test.
713
*/
714
Bbits = nFractBits + B2 + (( B5 < n5bits.length )? n5bits[B5] : ( B5*3 ));
715
tenSbits = S2+1 + (( (S5+1) < n5bits.length )? n5bits[(S5+1)] : ( (S5+1)*3 ));
716
if ( Bbits < 64 && tenSbits < 64){
717
if ( Bbits < 32 && tenSbits < 32){
718
// wa-hoo! They're all ints!
719
int b = ((int)fractBits * small5pow[B5] ) << B2;
720
int s = small5pow[S5] << S2;
721
int m = small5pow[M5] << M2;
722
int tens = s * 10;
723
/*
724
* Unroll the first iteration. If our decExp estimate
725
* was too high, our first quotient will be zero. In this
726
* case, we discard it and decrement decExp.
727
*/
728
ndigit = 0;
729
q = b / s;
730
b = 10 * ( b % s );
731
m *= 10;
732
low = (b < m );
733
high = (b+m > tens );
734
assert q < 10 : q; // excessively large digit
735
if ( (q == 0) && ! high ){
736
// oops. Usually ignore leading zero.
737
decExp--;
738
} else {
739
digits[ndigit++] = (char)('0' + q);
740
}
741
/*
742
* HACK! Java spec sez that we always have at least
743
* one digit after the . in either F- or E-form output.
744
* Thus we will need more than one digit if we're using
745
* E-form
746
*/
747
if ( decExp < -3 || decExp >= 8 ){
748
high = low = false;
749
}
750
while( ! low && ! high ){
751
q = b / s;
752
b = 10 * ( b % s );
753
m *= 10;
754
assert q < 10 : q; // excessively large digit
755
if ( m > 0L ){
756
low = (b < m );
757
high = (b+m > tens );
758
} else {
759
// hack -- m might overflow!
760
// in this case, it is certainly > b,
761
// which won't
762
// and b+m > tens, too, since that has overflowed
763
// either!
764
low = true;
765
high = true;
766
}
767
digits[ndigit++] = (char)('0' + q);
768
}
769
lowDigitDifference = (b<<1) - tens;
770
exactDecimalConversion = (b == 0);
771
} else {
772
// still good! they're all longs!
773
long b = (fractBits * long5pow[B5] ) << B2;
774
long s = long5pow[S5] << S2;
775
long m = long5pow[M5] << M2;
776
long tens = s * 10L;
777
/*
778
* Unroll the first iteration. If our decExp estimate
779
* was too high, our first quotient will be zero. In this
780
* case, we discard it and decrement decExp.
781
*/
782
ndigit = 0;
783
q = (int) ( b / s );
784
b = 10L * ( b % s );
785
m *= 10L;
786
low = (b < m );
787
high = (b+m > tens );
788
assert q < 10 : q; // excessively large digit
789
if ( (q == 0) && ! high ){
790
// oops. Usually ignore leading zero.
791
decExp--;
792
} else {
793
digits[ndigit++] = (char)('0' + q);
794
}
795
/*
796
* HACK! Java spec sez that we always have at least
797
* one digit after the . in either F- or E-form output.
798
* Thus we will need more than one digit if we're using
799
* E-form
800
*/
801
if ( decExp < -3 || decExp >= 8 ){
802
high = low = false;
803
}
804
while( ! low && ! high ){
805
q = (int) ( b / s );
806
b = 10 * ( b % s );
807
m *= 10;
808
assert q < 10 : q; // excessively large digit
809
if ( m > 0L ){
810
low = (b < m );
811
high = (b+m > tens );
812
} else {
813
// hack -- m might overflow!
814
// in this case, it is certainly > b,
815
// which won't
816
// and b+m > tens, too, since that has overflowed
817
// either!
818
low = true;
819
high = true;
820
}
821
digits[ndigit++] = (char)('0' + q);
822
}
823
lowDigitDifference = (b<<1) - tens;
824
exactDecimalConversion = (b == 0);
825
}
826
} else {
827
OldFDBigIntForTest ZeroVal = new OldFDBigIntForTest(0);
828
OldFDBigIntForTest tenSval;
829
int shiftBias;
830
831
/*
832
* We really must do OldFDBigIntForTest arithmetic.
833
* Fist, construct our OldFDBigIntForTest initial values.
834
*/
835
Bval = multPow52( new OldFDBigIntForTest( fractBits ), B5, B2 );
836
Sval = constructPow52( S5, S2 );
837
Mval = constructPow52( M5, M2 );
838
839
840
// normalize so that division works better
841
Bval.lshiftMe( shiftBias = Sval.normalizeMe() );
842
Mval.lshiftMe( shiftBias );
843
tenSval = Sval.mult( 10 );
844
/*
845
* Unroll the first iteration. If our decExp estimate
846
* was too high, our first quotient will be zero. In this
847
* case, we discard it and decrement decExp.
848
*/
849
ndigit = 0;
850
q = Bval.quoRemIteration( Sval );
851
Mval = Mval.mult( 10 );
852
low = (Bval.cmp( Mval ) < 0);
853
high = (Bval.add( Mval ).cmp( tenSval ) > 0 );
854
assert q < 10 : q; // excessively large digit
855
if ( (q == 0) && ! high ){
856
// oops. Usually ignore leading zero.
857
decExp--;
858
} else {
859
digits[ndigit++] = (char)('0' + q);
860
}
861
/*
862
* HACK! Java spec sez that we always have at least
863
* one digit after the . in either F- or E-form output.
864
* Thus we will need more than one digit if we're using
865
* E-form
866
*/
867
if ( decExp < -3 || decExp >= 8 ){
868
high = low = false;
869
}
870
while( ! low && ! high ){
871
q = Bval.quoRemIteration( Sval );
872
Mval = Mval.mult( 10 );
873
assert q < 10 : q; // excessively large digit
874
low = (Bval.cmp( Mval ) < 0);
875
high = (Bval.add( Mval ).cmp( tenSval ) > 0 );
876
digits[ndigit++] = (char)('0' + q);
877
}
878
if ( high && low ){
879
Bval.lshiftMe(1);
880
lowDigitDifference = Bval.cmp(tenSval);
881
} else {
882
lowDigitDifference = 0L; // this here only for flow analysis!
883
}
884
exactDecimalConversion = (Bval.cmp( ZeroVal ) == 0);
885
}
886
this.decExponent = decExp+1;
887
this.digits = digits;
888
this.nDigits = ndigit;
889
/*
890
* Last digit gets rounded based on stopping condition.
891
*/
892
if ( high ){
893
if ( low ){
894
if ( lowDigitDifference == 0L ){
895
// it's a tie!
896
// choose based on which digits we like.
897
if ( (digits[nDigits-1]&1) != 0 ) roundup();
898
} else if ( lowDigitDifference > 0 ){
899
roundup();
900
}
901
} else {
902
roundup();
903
}
904
}
905
}
906
907
public boolean decimalDigitsExact() {
908
return exactDecimalConversion;
909
}
910
911
public String
912
toString(){
913
// most brain-dead version
914
StringBuffer result = new StringBuffer( nDigits+8 );
915
if ( isNegative ){ result.append( '-' ); }
916
if ( isExceptional ){
917
result.append( digits, 0, nDigits );
918
} else {
919
result.append( "0.");
920
result.append( digits, 0, nDigits );
921
result.append('e');
922
result.append( decExponent );
923
}
924
return new String(result);
925
}
926
927
public String toJavaFormatString() {
928
char result[] = perThreadBuffer.get();
929
int i = getChars(result);
930
return new String(result, 0, i);
931
}
932
933
private int getChars(char[] result) {
934
assert nDigits <= 19 : nDigits; // generous bound on size of nDigits
935
int i = 0;
936
if (isNegative) { result[0] = '-'; i = 1; }
937
if (isExceptional) {
938
System.arraycopy(digits, 0, result, i, nDigits);
939
i += nDigits;
940
} else {
941
if (decExponent > 0 && decExponent < 8) {
942
// print digits.digits.
943
int charLength = Math.min(nDigits, decExponent);
944
System.arraycopy(digits, 0, result, i, charLength);
945
i += charLength;
946
if (charLength < decExponent) {
947
charLength = decExponent-charLength;
948
System.arraycopy(zero, 0, result, i, charLength);
949
i += charLength;
950
result[i++] = '.';
951
result[i++] = '0';
952
} else {
953
result[i++] = '.';
954
if (charLength < nDigits) {
955
int t = nDigits - charLength;
956
System.arraycopy(digits, charLength, result, i, t);
957
i += t;
958
} else {
959
result[i++] = '0';
960
}
961
}
962
} else if (decExponent <=0 && decExponent > -3) {
963
result[i++] = '0';
964
result[i++] = '.';
965
if (decExponent != 0) {
966
System.arraycopy(zero, 0, result, i, -decExponent);
967
i -= decExponent;
968
}
969
System.arraycopy(digits, 0, result, i, nDigits);
970
i += nDigits;
971
} else {
972
result[i++] = digits[0];
973
result[i++] = '.';
974
if (nDigits > 1) {
975
System.arraycopy(digits, 1, result, i, nDigits-1);
976
i += nDigits-1;
977
} else {
978
result[i++] = '0';
979
}
980
result[i++] = 'E';
981
int e;
982
if (decExponent <= 0) {
983
result[i++] = '-';
984
e = -decExponent+1;
985
} else {
986
e = decExponent-1;
987
}
988
// decExponent has 1, 2, or 3, digits
989
if (e <= 9) {
990
result[i++] = (char)(e+'0');
991
} else if (e <= 99) {
992
result[i++] = (char)(e/10 +'0');
993
result[i++] = (char)(e%10 + '0');
994
} else {
995
result[i++] = (char)(e/100+'0');
996
e %= 100;
997
result[i++] = (char)(e/10+'0');
998
result[i++] = (char)(e%10 + '0');
999
}
1000
}
1001
}
1002
return i;
1003
}
1004
1005
// Per-thread buffer for string/stringbuffer conversion
1006
private static ThreadLocal<char[]> perThreadBuffer = new ThreadLocal<char[]>() {
1007
protected synchronized char[] initialValue() {
1008
return new char[26];
1009
}
1010
};
1011
1012
public void appendTo(Appendable buf) {
1013
char result[] = perThreadBuffer.get();
1014
int i = getChars(result);
1015
if (buf instanceof StringBuilder)
1016
((StringBuilder) buf).append(result, 0, i);
1017
else if (buf instanceof StringBuffer)
1018
((StringBuffer) buf).append(result, 0, i);
1019
else
1020
assert false;
1021
}
1022
1023
@SuppressWarnings("fallthrough")
1024
public static OldFloatingDecimalForTest
1025
readJavaFormatString( String in ) throws NumberFormatException {
1026
boolean isNegative = false;
1027
boolean signSeen = false;
1028
int decExp;
1029
char c;
1030
1031
parseNumber:
1032
try{
1033
in = in.trim(); // don't fool around with white space.
1034
// throws NullPointerException if null
1035
int l = in.length();
1036
if ( l == 0 ) throw new NumberFormatException("empty String");
1037
int i = 0;
1038
switch ( c = in.charAt( i ) ){
1039
case '-':
1040
isNegative = true;
1041
//FALLTHROUGH
1042
case '+':
1043
i++;
1044
signSeen = true;
1045
}
1046
1047
// Check for NaN and Infinity strings
1048
c = in.charAt(i);
1049
if(c == 'N' || c == 'I') { // possible NaN or infinity
1050
boolean potentialNaN = false;
1051
char targetChars[] = null; // char array of "NaN" or "Infinity"
1052
1053
if(c == 'N') {
1054
targetChars = notANumber;
1055
potentialNaN = true;
1056
} else {
1057
targetChars = infinity;
1058
}
1059
1060
// compare Input string to "NaN" or "Infinity"
1061
int j = 0;
1062
while(i < l && j < targetChars.length) {
1063
if(in.charAt(i) == targetChars[j]) {
1064
i++; j++;
1065
}
1066
else // something is amiss, throw exception
1067
break parseNumber;
1068
}
1069
1070
// For the candidate string to be a NaN or infinity,
1071
// all characters in input string and target char[]
1072
// must be matched ==> j must equal targetChars.length
1073
// and i must equal l
1074
if( (j == targetChars.length) && (i == l) ) { // return NaN or infinity
1075
return (potentialNaN ? new OldFloatingDecimalForTest(Double.NaN) // NaN has no sign
1076
: new OldFloatingDecimalForTest(isNegative?
1077
Double.NEGATIVE_INFINITY:
1078
Double.POSITIVE_INFINITY)) ;
1079
}
1080
else { // something went wrong, throw exception
1081
break parseNumber;
1082
}
1083
1084
} else if (c == '0') { // check for hexadecimal floating-point number
1085
if (l > i+1 ) {
1086
char ch = in.charAt(i+1);
1087
if (ch == 'x' || ch == 'X' ) // possible hex string
1088
return parseHexString(in);
1089
}
1090
} // look for and process decimal floating-point string
1091
1092
char[] digits = new char[ l ];
1093
int nDigits= 0;
1094
boolean decSeen = false;
1095
int decPt = 0;
1096
int nLeadZero = 0;
1097
int nTrailZero= 0;
1098
digitLoop:
1099
while ( i < l ){
1100
switch ( c = in.charAt( i ) ){
1101
case '0':
1102
if ( nDigits > 0 ){
1103
nTrailZero += 1;
1104
} else {
1105
nLeadZero += 1;
1106
}
1107
break; // out of switch.
1108
case '1':
1109
case '2':
1110
case '3':
1111
case '4':
1112
case '5':
1113
case '6':
1114
case '7':
1115
case '8':
1116
case '9':
1117
while ( nTrailZero > 0 ){
1118
digits[nDigits++] = '0';
1119
nTrailZero -= 1;
1120
}
1121
digits[nDigits++] = c;
1122
break; // out of switch.
1123
case '.':
1124
if ( decSeen ){
1125
// already saw one ., this is the 2nd.
1126
throw new NumberFormatException("multiple points");
1127
}
1128
decPt = i;
1129
if ( signSeen ){
1130
decPt -= 1;
1131
}
1132
decSeen = true;
1133
break; // out of switch.
1134
default:
1135
break digitLoop;
1136
}
1137
i++;
1138
}
1139
/*
1140
* At this point, we've scanned all the digits and decimal
1141
* point we're going to see. Trim off leading and trailing
1142
* zeros, which will just confuse us later, and adjust
1143
* our initial decimal exponent accordingly.
1144
* To review:
1145
* we have seen i total characters.
1146
* nLeadZero of them were zeros before any other digits.
1147
* nTrailZero of them were zeros after any other digits.
1148
* if ( decSeen ), then a . was seen after decPt characters
1149
* ( including leading zeros which have been discarded )
1150
* nDigits characters were neither lead nor trailing
1151
* zeros, nor point
1152
*/
1153
/*
1154
* special hack: if we saw no non-zero digits, then the
1155
* answer is zero!
1156
* Unfortunately, we feel honor-bound to keep parsing!
1157
*/
1158
if ( nDigits == 0 ){
1159
digits = zero;
1160
nDigits = 1;
1161
if ( nLeadZero == 0 ){
1162
// we saw NO DIGITS AT ALL,
1163
// not even a crummy 0!
1164
// this is not allowed.
1165
break parseNumber; // go throw exception
1166
}
1167
1168
}
1169
1170
/* Our initial exponent is decPt, adjusted by the number of
1171
* discarded zeros. Or, if there was no decPt,
1172
* then its just nDigits adjusted by discarded trailing zeros.
1173
*/
1174
if ( decSeen ){
1175
decExp = decPt - nLeadZero;
1176
} else {
1177
decExp = nDigits+nTrailZero;
1178
}
1179
1180
/*
1181
* Look for 'e' or 'E' and an optionally signed integer.
1182
*/
1183
if ( (i < l) && (((c = in.charAt(i) )=='e') || (c == 'E') ) ){
1184
int expSign = 1;
1185
int expVal = 0;
1186
int reallyBig = Integer.MAX_VALUE / 10;
1187
boolean expOverflow = false;
1188
switch( in.charAt(++i) ){
1189
case '-':
1190
expSign = -1;
1191
//FALLTHROUGH
1192
case '+':
1193
i++;
1194
}
1195
int expAt = i;
1196
expLoop:
1197
while ( i < l ){
1198
if ( expVal >= reallyBig ){
1199
// the next character will cause integer
1200
// overflow.
1201
expOverflow = true;
1202
}
1203
switch ( c = in.charAt(i++) ){
1204
case '0':
1205
case '1':
1206
case '2':
1207
case '3':
1208
case '4':
1209
case '5':
1210
case '6':
1211
case '7':
1212
case '8':
1213
case '9':
1214
expVal = expVal*10 + ( (int)c - (int)'0' );
1215
continue;
1216
default:
1217
i--; // back up.
1218
break expLoop; // stop parsing exponent.
1219
}
1220
}
1221
int expLimit = bigDecimalExponent+nDigits+nTrailZero;
1222
if ( expOverflow || ( expVal > expLimit ) ){
1223
//
1224
// The intent here is to end up with
1225
// infinity or zero, as appropriate.
1226
// The reason for yielding such a small decExponent,
1227
// rather than something intuitive such as
1228
// expSign*Integer.MAX_VALUE, is that this value
1229
// is subject to further manipulation in
1230
// doubleValue() and floatValue(), and I don't want
1231
// it to be able to cause overflow there!
1232
// (The only way we can get into trouble here is for
1233
// really outrageous nDigits+nTrailZero, such as 2 billion. )
1234
//
1235
decExp = expSign*expLimit;
1236
} else {
1237
// this should not overflow, since we tested
1238
// for expVal > (MAX+N), where N >= abs(decExp)
1239
decExp = decExp + expSign*expVal;
1240
}
1241
1242
// if we saw something not a digit ( or end of string )
1243
// after the [Ee][+-], without seeing any digits at all
1244
// this is certainly an error. If we saw some digits,
1245
// but then some trailing garbage, that might be ok.
1246
// so we just fall through in that case.
1247
// HUMBUG
1248
if ( i == expAt )
1249
break parseNumber; // certainly bad
1250
}
1251
/*
1252
* We parsed everything we could.
1253
* If there are leftovers, then this is not good input!
1254
*/
1255
if ( i < l &&
1256
((i != l - 1) ||
1257
(in.charAt(i) != 'f' &&
1258
in.charAt(i) != 'F' &&
1259
in.charAt(i) != 'd' &&
1260
in.charAt(i) != 'D'))) {
1261
break parseNumber; // go throw exception
1262
}
1263
1264
return new OldFloatingDecimalForTest( isNegative, decExp, digits, nDigits, false );
1265
} catch ( StringIndexOutOfBoundsException e ){ }
1266
throw new NumberFormatException("For input string: \"" + in + "\"");
1267
}
1268
1269
/*
1270
* Take a FloatingDecimal, which we presumably just scanned in,
1271
* and find out what its value is, as a double.
1272
*
1273
* AS A SIDE EFFECT, SET roundDir TO INDICATE PREFERRED
1274
* ROUNDING DIRECTION in case the result is really destined
1275
* for a single-precision float.
1276
*/
1277
1278
public strictfp double doubleValue(){
1279
int kDigits = Math.min( nDigits, maxDecimalDigits+1 );
1280
long lValue;
1281
double dValue;
1282
double rValue, tValue;
1283
1284
// First, check for NaN and Infinity values
1285
if(digits == infinity || digits == notANumber) {
1286
if(digits == notANumber)
1287
return Double.NaN;
1288
else
1289
return (isNegative?Double.NEGATIVE_INFINITY:Double.POSITIVE_INFINITY);
1290
}
1291
else {
1292
if (mustSetRoundDir) {
1293
roundDir = 0;
1294
}
1295
/*
1296
* convert the lead kDigits to a long integer.
1297
*/
1298
// (special performance hack: start to do it using int)
1299
int iValue = (int)digits[0]-(int)'0';
1300
int iDigits = Math.min( kDigits, intDecimalDigits );
1301
for ( int i=1; i < iDigits; i++ ){
1302
iValue = iValue*10 + (int)digits[i]-(int)'0';
1303
}
1304
lValue = (long)iValue;
1305
for ( int i=iDigits; i < kDigits; i++ ){
1306
lValue = lValue*10L + (long)((int)digits[i]-(int)'0');
1307
}
1308
dValue = (double)lValue;
1309
int exp = decExponent-kDigits;
1310
/*
1311
* lValue now contains a long integer with the value of
1312
* the first kDigits digits of the number.
1313
* dValue contains the (double) of the same.
1314
*/
1315
1316
if ( nDigits <= maxDecimalDigits ){
1317
/*
1318
* possibly an easy case.
1319
* We know that the digits can be represented
1320
* exactly. And if the exponent isn't too outrageous,
1321
* the whole thing can be done with one operation,
1322
* thus one rounding error.
1323
* Note that all our constructors trim all leading and
1324
* trailing zeros, so simple values (including zero)
1325
* will always end up here
1326
*/
1327
if (exp == 0 || dValue == 0.0)
1328
return (isNegative)? -dValue : dValue; // small floating integer
1329
else if ( exp >= 0 ){
1330
if ( exp <= maxSmallTen ){
1331
/*
1332
* Can get the answer with one operation,
1333
* thus one roundoff.
1334
*/
1335
rValue = dValue * small10pow[exp];
1336
if ( mustSetRoundDir ){
1337
tValue = rValue / small10pow[exp];
1338
roundDir = ( tValue == dValue ) ? 0
1339
:( tValue < dValue ) ? 1
1340
: -1;
1341
}
1342
return (isNegative)? -rValue : rValue;
1343
}
1344
int slop = maxDecimalDigits - kDigits;
1345
if ( exp <= maxSmallTen+slop ){
1346
/*
1347
* We can multiply dValue by 10^(slop)
1348
* and it is still "small" and exact.
1349
* Then we can multiply by 10^(exp-slop)
1350
* with one rounding.
1351
*/
1352
dValue *= small10pow[slop];
1353
rValue = dValue * small10pow[exp-slop];
1354
1355
if ( mustSetRoundDir ){
1356
tValue = rValue / small10pow[exp-slop];
1357
roundDir = ( tValue == dValue ) ? 0
1358
:( tValue < dValue ) ? 1
1359
: -1;
1360
}
1361
return (isNegative)? -rValue : rValue;
1362
}
1363
/*
1364
* Else we have a hard case with a positive exp.
1365
*/
1366
} else {
1367
if ( exp >= -maxSmallTen ){
1368
/*
1369
* Can get the answer in one division.
1370
*/
1371
rValue = dValue / small10pow[-exp];
1372
tValue = rValue * small10pow[-exp];
1373
if ( mustSetRoundDir ){
1374
roundDir = ( tValue == dValue ) ? 0
1375
:( tValue < dValue ) ? 1
1376
: -1;
1377
}
1378
return (isNegative)? -rValue : rValue;
1379
}
1380
/*
1381
* Else we have a hard case with a negative exp.
1382
*/
1383
}
1384
}
1385
1386
/*
1387
* Harder cases:
1388
* The sum of digits plus exponent is greater than
1389
* what we think we can do with one error.
1390
*
1391
* Start by approximating the right answer by,
1392
* naively, scaling by powers of 10.
1393
*/
1394
if ( exp > 0 ){
1395
if ( decExponent > maxDecimalExponent+1 ){
1396
/*
1397
* Lets face it. This is going to be
1398
* Infinity. Cut to the chase.
1399
*/
1400
return (isNegative)? Double.NEGATIVE_INFINITY : Double.POSITIVE_INFINITY;
1401
}
1402
if ( (exp&15) != 0 ){
1403
dValue *= small10pow[exp&15];
1404
}
1405
if ( (exp>>=4) != 0 ){
1406
int j;
1407
for( j = 0; exp > 1; j++, exp>>=1 ){
1408
if ( (exp&1)!=0)
1409
dValue *= big10pow[j];
1410
}
1411
/*
1412
* The reason for the weird exp > 1 condition
1413
* in the above loop was so that the last multiply
1414
* would get unrolled. We handle it here.
1415
* It could overflow.
1416
*/
1417
double t = dValue * big10pow[j];
1418
if ( Double.isInfinite( t ) ){
1419
/*
1420
* It did overflow.
1421
* Look more closely at the result.
1422
* If the exponent is just one too large,
1423
* then use the maximum finite as our estimate
1424
* value. Else call the result infinity
1425
* and punt it.
1426
* ( I presume this could happen because
1427
* rounding forces the result here to be
1428
* an ULP or two larger than
1429
* Double.MAX_VALUE ).
1430
*/
1431
t = dValue / 2.0;
1432
t *= big10pow[j];
1433
if ( Double.isInfinite( t ) ){
1434
return (isNegative)? Double.NEGATIVE_INFINITY : Double.POSITIVE_INFINITY;
1435
}
1436
t = Double.MAX_VALUE;
1437
}
1438
dValue = t;
1439
}
1440
} else if ( exp < 0 ){
1441
exp = -exp;
1442
if ( decExponent < minDecimalExponent-1 ){
1443
/*
1444
* Lets face it. This is going to be
1445
* zero. Cut to the chase.
1446
*/
1447
return (isNegative)? -0.0 : 0.0;
1448
}
1449
if ( (exp&15) != 0 ){
1450
dValue /= small10pow[exp&15];
1451
}
1452
if ( (exp>>=4) != 0 ){
1453
int j;
1454
for( j = 0; exp > 1; j++, exp>>=1 ){
1455
if ( (exp&1)!=0)
1456
dValue *= tiny10pow[j];
1457
}
1458
/*
1459
* The reason for the weird exp > 1 condition
1460
* in the above loop was so that the last multiply
1461
* would get unrolled. We handle it here.
1462
* It could underflow.
1463
*/
1464
double t = dValue * tiny10pow[j];
1465
if ( t == 0.0 ){
1466
/*
1467
* It did underflow.
1468
* Look more closely at the result.
1469
* If the exponent is just one too small,
1470
* then use the minimum finite as our estimate
1471
* value. Else call the result 0.0
1472
* and punt it.
1473
* ( I presume this could happen because
1474
* rounding forces the result here to be
1475
* an ULP or two less than
1476
* Double.MIN_VALUE ).
1477
*/
1478
t = dValue * 2.0;
1479
t *= tiny10pow[j];
1480
if ( t == 0.0 ){
1481
return (isNegative)? -0.0 : 0.0;
1482
}
1483
t = Double.MIN_VALUE;
1484
}
1485
dValue = t;
1486
}
1487
}
1488
1489
/*
1490
* dValue is now approximately the result.
1491
* The hard part is adjusting it, by comparison
1492
* with OldFDBigIntForTest arithmetic.
1493
* Formulate the EXACT big-number result as
1494
* bigD0 * 10^exp
1495
*/
1496
OldFDBigIntForTest bigD0 = new OldFDBigIntForTest( lValue, digits, kDigits, nDigits );
1497
exp = decExponent - nDigits;
1498
1499
correctionLoop:
1500
while(true){
1501
/* AS A SIDE EFFECT, THIS METHOD WILL SET THE INSTANCE VARIABLES
1502
* bigIntExp and bigIntNBits
1503
*/
1504
OldFDBigIntForTest bigB = doubleToBigInt( dValue );
1505
1506
/*
1507
* Scale bigD, bigB appropriately for
1508
* big-integer operations.
1509
* Naively, we multiply by powers of ten
1510
* and powers of two. What we actually do
1511
* is keep track of the powers of 5 and
1512
* powers of 2 we would use, then factor out
1513
* common divisors before doing the work.
1514
*/
1515
int B2, B5; // powers of 2, 5 in bigB
1516
int D2, D5; // powers of 2, 5 in bigD
1517
int Ulp2; // powers of 2 in halfUlp.
1518
if ( exp >= 0 ){
1519
B2 = B5 = 0;
1520
D2 = D5 = exp;
1521
} else {
1522
B2 = B5 = -exp;
1523
D2 = D5 = 0;
1524
}
1525
if ( bigIntExp >= 0 ){
1526
B2 += bigIntExp;
1527
} else {
1528
D2 -= bigIntExp;
1529
}
1530
Ulp2 = B2;
1531
// shift bigB and bigD left by a number s. t.
1532
// halfUlp is still an integer.
1533
int hulpbias;
1534
if ( bigIntExp+bigIntNBits <= -expBias+1 ){
1535
// This is going to be a denormalized number
1536
// (if not actually zero).
1537
// half an ULP is at 2^-(expBias+expShift+1)
1538
hulpbias = bigIntExp+ expBias + expShift;
1539
} else {
1540
hulpbias = expShift + 2 - bigIntNBits;
1541
}
1542
B2 += hulpbias;
1543
D2 += hulpbias;
1544
// if there are common factors of 2, we might just as well
1545
// factor them out, as they add nothing useful.
1546
int common2 = Math.min( B2, Math.min( D2, Ulp2 ) );
1547
B2 -= common2;
1548
D2 -= common2;
1549
Ulp2 -= common2;
1550
// do multiplications by powers of 5 and 2
1551
bigB = multPow52( bigB, B5, B2 );
1552
OldFDBigIntForTest bigD = multPow52( new OldFDBigIntForTest( bigD0 ), D5, D2 );
1553
//
1554
// to recap:
1555
// bigB is the scaled-big-int version of our floating-point
1556
// candidate.
1557
// bigD is the scaled-big-int version of the exact value
1558
// as we understand it.
1559
// halfUlp is 1/2 an ulp of bigB, except for special cases
1560
// of exact powers of 2
1561
//
1562
// the plan is to compare bigB with bigD, and if the difference
1563
// is less than halfUlp, then we're satisfied. Otherwise,
1564
// use the ratio of difference to halfUlp to calculate a fudge
1565
// factor to add to the floating value, then go 'round again.
1566
//
1567
OldFDBigIntForTest diff;
1568
int cmpResult;
1569
boolean overvalue;
1570
if ( (cmpResult = bigB.cmp( bigD ) ) > 0 ){
1571
overvalue = true; // our candidate is too big.
1572
diff = bigB.sub( bigD );
1573
if ( (bigIntNBits == 1) && (bigIntExp > -expBias+1) ){
1574
// candidate is a normalized exact power of 2 and
1575
// is too big. We will be subtracting.
1576
// For our purposes, ulp is the ulp of the
1577
// next smaller range.
1578
Ulp2 -= 1;
1579
if ( Ulp2 < 0 ){
1580
// rats. Cannot de-scale ulp this far.
1581
// must scale diff in other direction.
1582
Ulp2 = 0;
1583
diff.lshiftMe( 1 );
1584
}
1585
}
1586
} else if ( cmpResult < 0 ){
1587
overvalue = false; // our candidate is too small.
1588
diff = bigD.sub( bigB );
1589
} else {
1590
// the candidate is exactly right!
1591
// this happens with surprising frequency
1592
break correctionLoop;
1593
}
1594
OldFDBigIntForTest halfUlp = constructPow52( B5, Ulp2 );
1595
if ( (cmpResult = diff.cmp( halfUlp ) ) < 0 ){
1596
// difference is small.
1597
// this is close enough
1598
if (mustSetRoundDir) {
1599
roundDir = overvalue ? -1 : 1;
1600
}
1601
break correctionLoop;
1602
} else if ( cmpResult == 0 ){
1603
// difference is exactly half an ULP
1604
// round to some other value maybe, then finish
1605
dValue += 0.5*ulp( dValue, overvalue );
1606
// should check for bigIntNBits == 1 here??
1607
if (mustSetRoundDir) {
1608
roundDir = overvalue ? -1 : 1;
1609
}
1610
break correctionLoop;
1611
} else {
1612
// difference is non-trivial.
1613
// could scale addend by ratio of difference to
1614
// halfUlp here, if we bothered to compute that difference.
1615
// Most of the time ( I hope ) it is about 1 anyway.
1616
dValue += ulp( dValue, overvalue );
1617
if ( dValue == 0.0 || dValue == Double.POSITIVE_INFINITY )
1618
break correctionLoop; // oops. Fell off end of range.
1619
continue; // try again.
1620
}
1621
1622
}
1623
return (isNegative)? -dValue : dValue;
1624
}
1625
}
1626
1627
/*
1628
* Take a FloatingDecimal, which we presumably just scanned in,
1629
* and find out what its value is, as a float.
1630
* This is distinct from doubleValue() to avoid the extremely
1631
* unlikely case of a double rounding error, wherein the conversion
1632
* to double has one rounding error, and the conversion of that double
1633
* to a float has another rounding error, IN THE WRONG DIRECTION,
1634
* ( because of the preference to a zero low-order bit ).
1635
*/
1636
1637
public strictfp float floatValue(){
1638
int kDigits = Math.min( nDigits, singleMaxDecimalDigits+1 );
1639
int iValue;
1640
float fValue;
1641
1642
// First, check for NaN and Infinity values
1643
if(digits == infinity || digits == notANumber) {
1644
if(digits == notANumber)
1645
return Float.NaN;
1646
else
1647
return (isNegative?Float.NEGATIVE_INFINITY:Float.POSITIVE_INFINITY);
1648
}
1649
else {
1650
/*
1651
* convert the lead kDigits to an integer.
1652
*/
1653
iValue = (int)digits[0]-(int)'0';
1654
for ( int i=1; i < kDigits; i++ ){
1655
iValue = iValue*10 + (int)digits[i]-(int)'0';
1656
}
1657
fValue = (float)iValue;
1658
int exp = decExponent-kDigits;
1659
/*
1660
* iValue now contains an integer with the value of
1661
* the first kDigits digits of the number.
1662
* fValue contains the (float) of the same.
1663
*/
1664
1665
if ( nDigits <= singleMaxDecimalDigits ){
1666
/*
1667
* possibly an easy case.
1668
* We know that the digits can be represented
1669
* exactly. And if the exponent isn't too outrageous,
1670
* the whole thing can be done with one operation,
1671
* thus one rounding error.
1672
* Note that all our constructors trim all leading and
1673
* trailing zeros, so simple values (including zero)
1674
* will always end up here.
1675
*/
1676
if (exp == 0 || fValue == 0.0f)
1677
return (isNegative)? -fValue : fValue; // small floating integer
1678
else if ( exp >= 0 ){
1679
if ( exp <= singleMaxSmallTen ){
1680
/*
1681
* Can get the answer with one operation,
1682
* thus one roundoff.
1683
*/
1684
fValue *= singleSmall10pow[exp];
1685
return (isNegative)? -fValue : fValue;
1686
}
1687
int slop = singleMaxDecimalDigits - kDigits;
1688
if ( exp <= singleMaxSmallTen+slop ){
1689
/*
1690
* We can multiply dValue by 10^(slop)
1691
* and it is still "small" and exact.
1692
* Then we can multiply by 10^(exp-slop)
1693
* with one rounding.
1694
*/
1695
fValue *= singleSmall10pow[slop];
1696
fValue *= singleSmall10pow[exp-slop];
1697
return (isNegative)? -fValue : fValue;
1698
}
1699
/*
1700
* Else we have a hard case with a positive exp.
1701
*/
1702
} else {
1703
if ( exp >= -singleMaxSmallTen ){
1704
/*
1705
* Can get the answer in one division.
1706
*/
1707
fValue /= singleSmall10pow[-exp];
1708
return (isNegative)? -fValue : fValue;
1709
}
1710
/*
1711
* Else we have a hard case with a negative exp.
1712
*/
1713
}
1714
} else if ( (decExponent >= nDigits) && (nDigits+decExponent <= maxDecimalDigits) ){
1715
/*
1716
* In double-precision, this is an exact floating integer.
1717
* So we can compute to double, then shorten to float
1718
* with one round, and get the right answer.
1719
*
1720
* First, finish accumulating digits.
1721
* Then convert that integer to a double, multiply
1722
* by the appropriate power of ten, and convert to float.
1723
*/
1724
long lValue = (long)iValue;
1725
for ( int i=kDigits; i < nDigits; i++ ){
1726
lValue = lValue*10L + (long)((int)digits[i]-(int)'0');
1727
}
1728
double dValue = (double)lValue;
1729
exp = decExponent-nDigits;
1730
dValue *= small10pow[exp];
1731
fValue = (float)dValue;
1732
return (isNegative)? -fValue : fValue;
1733
1734
}
1735
/*
1736
* Harder cases:
1737
* The sum of digits plus exponent is greater than
1738
* what we think we can do with one error.
1739
*
1740
* Start by weeding out obviously out-of-range
1741
* results, then convert to double and go to
1742
* common hard-case code.
1743
*/
1744
if ( decExponent > singleMaxDecimalExponent+1 ){
1745
/*
1746
* Lets face it. This is going to be
1747
* Infinity. Cut to the chase.
1748
*/
1749
return (isNegative)? Float.NEGATIVE_INFINITY : Float.POSITIVE_INFINITY;
1750
} else if ( decExponent < singleMinDecimalExponent-1 ){
1751
/*
1752
* Lets face it. This is going to be
1753
* zero. Cut to the chase.
1754
*/
1755
return (isNegative)? -0.0f : 0.0f;
1756
}
1757
1758
/*
1759
* Here, we do 'way too much work, but throwing away
1760
* our partial results, and going and doing the whole
1761
* thing as double, then throwing away half the bits that computes
1762
* when we convert back to float.
1763
*
1764
* The alternative is to reproduce the whole multiple-precision
1765
* algorithm for float precision, or to try to parameterize it
1766
* for common usage. The former will take about 400 lines of code,
1767
* and the latter I tried without success. Thus the semi-hack
1768
* answer here.
1769
*/
1770
mustSetRoundDir = !fromHex;
1771
double dValue = doubleValue();
1772
return stickyRound( dValue );
1773
}
1774
}
1775
1776
1777
/*
1778
* All the positive powers of 10 that can be
1779
* represented exactly in double/float.
1780
*/
1781
private static final double small10pow[] = {
1782
1.0e0,
1783
1.0e1, 1.0e2, 1.0e3, 1.0e4, 1.0e5,
1784
1.0e6, 1.0e7, 1.0e8, 1.0e9, 1.0e10,
1785
1.0e11, 1.0e12, 1.0e13, 1.0e14, 1.0e15,
1786
1.0e16, 1.0e17, 1.0e18, 1.0e19, 1.0e20,
1787
1.0e21, 1.0e22
1788
};
1789
1790
private static final float singleSmall10pow[] = {
1791
1.0e0f,
1792
1.0e1f, 1.0e2f, 1.0e3f, 1.0e4f, 1.0e5f,
1793
1.0e6f, 1.0e7f, 1.0e8f, 1.0e9f, 1.0e10f
1794
};
1795
1796
private static final double big10pow[] = {
1797
1e16, 1e32, 1e64, 1e128, 1e256 };
1798
private static final double tiny10pow[] = {
1799
1e-16, 1e-32, 1e-64, 1e-128, 1e-256 };
1800
1801
private static final int maxSmallTen = small10pow.length-1;
1802
private static final int singleMaxSmallTen = singleSmall10pow.length-1;
1803
1804
private static final int small5pow[] = {
1805
1,
1806
5,
1807
5*5,
1808
5*5*5,
1809
5*5*5*5,
1810
5*5*5*5*5,
1811
5*5*5*5*5*5,
1812
5*5*5*5*5*5*5,
1813
5*5*5*5*5*5*5*5,
1814
5*5*5*5*5*5*5*5*5,
1815
5*5*5*5*5*5*5*5*5*5,
1816
5*5*5*5*5*5*5*5*5*5*5,
1817
5*5*5*5*5*5*5*5*5*5*5*5,
1818
5*5*5*5*5*5*5*5*5*5*5*5*5
1819
};
1820
1821
1822
private static final long long5pow[] = {
1823
1L,
1824
5L,
1825
5L*5,
1826
5L*5*5,
1827
5L*5*5*5,
1828
5L*5*5*5*5,
1829
5L*5*5*5*5*5,
1830
5L*5*5*5*5*5*5,
1831
5L*5*5*5*5*5*5*5,
1832
5L*5*5*5*5*5*5*5*5,
1833
5L*5*5*5*5*5*5*5*5*5,
1834
5L*5*5*5*5*5*5*5*5*5*5,
1835
5L*5*5*5*5*5*5*5*5*5*5*5,
1836
5L*5*5*5*5*5*5*5*5*5*5*5*5,
1837
5L*5*5*5*5*5*5*5*5*5*5*5*5*5,
1838
5L*5*5*5*5*5*5*5*5*5*5*5*5*5*5,
1839
5L*5*5*5*5*5*5*5*5*5*5*5*5*5*5*5,
1840
5L*5*5*5*5*5*5*5*5*5*5*5*5*5*5*5*5,
1841
5L*5*5*5*5*5*5*5*5*5*5*5*5*5*5*5*5*5,
1842
5L*5*5*5*5*5*5*5*5*5*5*5*5*5*5*5*5*5*5,
1843
5L*5*5*5*5*5*5*5*5*5*5*5*5*5*5*5*5*5*5*5,
1844
5L*5*5*5*5*5*5*5*5*5*5*5*5*5*5*5*5*5*5*5*5,
1845
5L*5*5*5*5*5*5*5*5*5*5*5*5*5*5*5*5*5*5*5*5*5,
1846
5L*5*5*5*5*5*5*5*5*5*5*5*5*5*5*5*5*5*5*5*5*5*5,
1847
5L*5*5*5*5*5*5*5*5*5*5*5*5*5*5*5*5*5*5*5*5*5*5*5,
1848
5L*5*5*5*5*5*5*5*5*5*5*5*5*5*5*5*5*5*5*5*5*5*5*5*5,
1849
5L*5*5*5*5*5*5*5*5*5*5*5*5*5*5*5*5*5*5*5*5*5*5*5*5*5,
1850
};
1851
1852
// approximately ceil( log2( long5pow[i] ) )
1853
private static final int n5bits[] = {
1854
0,
1855
3,
1856
5,
1857
7,
1858
10,
1859
12,
1860
14,
1861
17,
1862
19,
1863
21,
1864
24,
1865
26,
1866
28,
1867
31,
1868
33,
1869
35,
1870
38,
1871
40,
1872
42,
1873
45,
1874
47,
1875
49,
1876
52,
1877
54,
1878
56,
1879
59,
1880
61,
1881
};
1882
1883
private static final char infinity[] = { 'I', 'n', 'f', 'i', 'n', 'i', 't', 'y' };
1884
private static final char notANumber[] = { 'N', 'a', 'N' };
1885
private static final char zero[] = { '0', '0', '0', '0', '0', '0', '0', '0' };
1886
1887
1888
/*
1889
* Grammar is compatible with hexadecimal floating-point constants
1890
* described in section 6.4.4.2 of the C99 specification.
1891
*/
1892
private static Pattern hexFloatPattern = null;
1893
private static synchronized Pattern getHexFloatPattern() {
1894
if (hexFloatPattern == null) {
1895
hexFloatPattern = Pattern.compile(
1896
//1 234 56 7 8 9
1897
"([-+])?0[xX](((\\p{XDigit}+)\\.?)|((\\p{XDigit}*)\\.(\\p{XDigit}+)))[pP]([-+])?(\\p{Digit}+)[fFdD]?"
1898
);
1899
}
1900
return hexFloatPattern;
1901
}
1902
1903
/*
1904
* Convert string s to a suitable floating decimal; uses the
1905
* double constructor and set the roundDir variable appropriately
1906
* in case the value is later converted to a float.
1907
*/
1908
static OldFloatingDecimalForTest parseHexString(String s) {
1909
// Verify string is a member of the hexadecimal floating-point
1910
// string language.
1911
Matcher m = getHexFloatPattern().matcher(s);
1912
boolean validInput = m.matches();
1913
1914
if (!validInput) {
1915
// Input does not match pattern
1916
throw new NumberFormatException("For input string: \"" + s + "\"");
1917
} else { // validInput
1918
/*
1919
* We must isolate the sign, significand, and exponent
1920
* fields. The sign value is straightforward. Since
1921
* floating-point numbers are stored with a normalized
1922
* representation, the significand and exponent are
1923
* interrelated.
1924
*
1925
* After extracting the sign, we normalized the
1926
* significand as a hexadecimal value, calculating an
1927
* exponent adjust for any shifts made during
1928
* normalization. If the significand is zero, the
1929
* exponent doesn't need to be examined since the output
1930
* will be zero.
1931
*
1932
* Next the exponent in the input string is extracted.
1933
* Afterwards, the significand is normalized as a *binary*
1934
* value and the input value's normalized exponent can be
1935
* computed. The significand bits are copied into a
1936
* double significand; if the string has more logical bits
1937
* than can fit in a double, the extra bits affect the
1938
* round and sticky bits which are used to round the final
1939
* value.
1940
*/
1941
1942
// Extract significand sign
1943
String group1 = m.group(1);
1944
double sign = (( group1 == null ) || group1.equals("+"))? 1.0 : -1.0;
1945
1946
1947
// Extract Significand magnitude
1948
/*
1949
* Based on the form of the significand, calculate how the
1950
* binary exponent needs to be adjusted to create a
1951
* normalized *hexadecimal* floating-point number; that
1952
* is, a number where there is one nonzero hex digit to
1953
* the left of the (hexa)decimal point. Since we are
1954
* adjusting a binary, not hexadecimal exponent, the
1955
* exponent is adjusted by a multiple of 4.
1956
*
1957
* There are a number of significand scenarios to consider;
1958
* letters are used in indicate nonzero digits:
1959
*
1960
* 1. 000xxxx => x.xxx normalized
1961
* increase exponent by (number of x's - 1)*4
1962
*
1963
* 2. 000xxx.yyyy => x.xxyyyy normalized
1964
* increase exponent by (number of x's - 1)*4
1965
*
1966
* 3. .000yyy => y.yy normalized
1967
* decrease exponent by (number of zeros + 1)*4
1968
*
1969
* 4. 000.00000yyy => y.yy normalized
1970
* decrease exponent by (number of zeros to right of point + 1)*4
1971
*
1972
* If the significand is exactly zero, return a properly
1973
* signed zero.
1974
*/
1975
1976
String significandString =null;
1977
int signifLength = 0;
1978
int exponentAdjust = 0;
1979
{
1980
int leftDigits = 0; // number of meaningful digits to
1981
// left of "decimal" point
1982
// (leading zeros stripped)
1983
int rightDigits = 0; // number of digits to right of
1984
// "decimal" point; leading zeros
1985
// must always be accounted for
1986
/*
1987
* The significand is made up of either
1988
*
1989
* 1. group 4 entirely (integer portion only)
1990
*
1991
* OR
1992
*
1993
* 2. the fractional portion from group 7 plus any
1994
* (optional) integer portions from group 6.
1995
*/
1996
String group4;
1997
if( (group4 = m.group(4)) != null) { // Integer-only significand
1998
// Leading zeros never matter on the integer portion
1999
significandString = stripLeadingZeros(group4);
2000
leftDigits = significandString.length();
2001
}
2002
else {
2003
// Group 6 is the optional integer; leading zeros
2004
// never matter on the integer portion
2005
String group6 = stripLeadingZeros(m.group(6));
2006
leftDigits = group6.length();
2007
2008
// fraction
2009
String group7 = m.group(7);
2010
rightDigits = group7.length();
2011
2012
// Turn "integer.fraction" into "integer"+"fraction"
2013
significandString =
2014
((group6 == null)?"":group6) + // is the null
2015
// check necessary?
2016
group7;
2017
}
2018
2019
significandString = stripLeadingZeros(significandString);
2020
signifLength = significandString.length();
2021
2022
/*
2023
* Adjust exponent as described above
2024
*/
2025
if (leftDigits >= 1) { // Cases 1 and 2
2026
exponentAdjust = 4*(leftDigits - 1);
2027
} else { // Cases 3 and 4
2028
exponentAdjust = -4*( rightDigits - signifLength + 1);
2029
}
2030
2031
// If the significand is zero, the exponent doesn't
2032
// matter; return a properly signed zero.
2033
2034
if (signifLength == 0) { // Only zeros in input
2035
return new OldFloatingDecimalForTest(sign * 0.0);
2036
}
2037
}
2038
2039
// Extract Exponent
2040
/*
2041
* Use an int to read in the exponent value; this should
2042
* provide more than sufficient range for non-contrived
2043
* inputs. If reading the exponent in as an int does
2044
* overflow, examine the sign of the exponent and
2045
* significand to determine what to do.
2046
*/
2047
String group8 = m.group(8);
2048
boolean positiveExponent = ( group8 == null ) || group8.equals("+");
2049
long unsignedRawExponent;
2050
try {
2051
unsignedRawExponent = Integer.parseInt(m.group(9));
2052
}
2053
catch (NumberFormatException e) {
2054
// At this point, we know the exponent is
2055
// syntactically well-formed as a sequence of
2056
// digits. Therefore, if an NumberFormatException
2057
// is thrown, it must be due to overflowing int's
2058
// range. Also, at this point, we have already
2059
// checked for a zero significand. Thus the signs
2060
// of the exponent and significand determine the
2061
// final result:
2062
//
2063
// significand
2064
// + -
2065
// exponent + +infinity -infinity
2066
// - +0.0 -0.0
2067
return new OldFloatingDecimalForTest(sign * (positiveExponent ?
2068
Double.POSITIVE_INFINITY : 0.0));
2069
}
2070
2071
long rawExponent =
2072
(positiveExponent ? 1L : -1L) * // exponent sign
2073
unsignedRawExponent; // exponent magnitude
2074
2075
// Calculate partially adjusted exponent
2076
long exponent = rawExponent + exponentAdjust ;
2077
2078
// Starting copying non-zero bits into proper position in
2079
// a long; copy explicit bit too; this will be masked
2080
// later for normal values.
2081
2082
boolean round = false;
2083
boolean sticky = false;
2084
int bitsCopied=0;
2085
int nextShift=0;
2086
long significand=0L;
2087
// First iteration is different, since we only copy
2088
// from the leading significand bit; one more exponent
2089
// adjust will be needed...
2090
2091
// IMPORTANT: make leadingDigit a long to avoid
2092
// surprising shift semantics!
2093
long leadingDigit = getHexDigit(significandString, 0);
2094
2095
/*
2096
* Left shift the leading digit (53 - (bit position of
2097
* leading 1 in digit)); this sets the top bit of the
2098
* significand to 1. The nextShift value is adjusted
2099
* to take into account the number of bit positions of
2100
* the leadingDigit actually used. Finally, the
2101
* exponent is adjusted to normalize the significand
2102
* as a binary value, not just a hex value.
2103
*/
2104
if (leadingDigit == 1) {
2105
significand |= leadingDigit << 52;
2106
nextShift = 52 - 4;
2107
/* exponent += 0 */ }
2108
else if (leadingDigit <= 3) { // [2, 3]
2109
significand |= leadingDigit << 51;
2110
nextShift = 52 - 5;
2111
exponent += 1;
2112
}
2113
else if (leadingDigit <= 7) { // [4, 7]
2114
significand |= leadingDigit << 50;
2115
nextShift = 52 - 6;
2116
exponent += 2;
2117
}
2118
else if (leadingDigit <= 15) { // [8, f]
2119
significand |= leadingDigit << 49;
2120
nextShift = 52 - 7;
2121
exponent += 3;
2122
} else {
2123
throw new AssertionError("Result from digit conversion too large!");
2124
}
2125
// The preceding if-else could be replaced by a single
2126
// code block based on the high-order bit set in
2127
// leadingDigit. Given leadingOnePosition,
2128
2129
// significand |= leadingDigit << (SIGNIFICAND_WIDTH - leadingOnePosition);
2130
// nextShift = 52 - (3 + leadingOnePosition);
2131
// exponent += (leadingOnePosition-1);
2132
2133
2134
/*
2135
* Now the exponent variable is equal to the normalized
2136
* binary exponent. Code below will make representation
2137
* adjustments if the exponent is incremented after
2138
* rounding (includes overflows to infinity) or if the
2139
* result is subnormal.
2140
*/
2141
2142
// Copy digit into significand until the significand can't
2143
// hold another full hex digit or there are no more input
2144
// hex digits.
2145
int i = 0;
2146
for(i = 1;
2147
i < signifLength && nextShift >= 0;
2148
i++) {
2149
long currentDigit = getHexDigit(significandString, i);
2150
significand |= (currentDigit << nextShift);
2151
nextShift-=4;
2152
}
2153
2154
// After the above loop, the bulk of the string is copied.
2155
// Now, we must copy any partial hex digits into the
2156
// significand AND compute the round bit and start computing
2157
// sticky bit.
2158
2159
if ( i < signifLength ) { // at least one hex input digit exists
2160
long currentDigit = getHexDigit(significandString, i);
2161
2162
// from nextShift, figure out how many bits need
2163
// to be copied, if any
2164
switch(nextShift) { // must be negative
2165
case -1:
2166
// three bits need to be copied in; can
2167
// set round bit
2168
significand |= ((currentDigit & 0xEL) >> 1);
2169
round = (currentDigit & 0x1L) != 0L;
2170
break;
2171
2172
case -2:
2173
// two bits need to be copied in; can
2174
// set round and start sticky
2175
significand |= ((currentDigit & 0xCL) >> 2);
2176
round = (currentDigit &0x2L) != 0L;
2177
sticky = (currentDigit & 0x1L) != 0;
2178
break;
2179
2180
case -3:
2181
// one bit needs to be copied in
2182
significand |= ((currentDigit & 0x8L)>>3);
2183
// Now set round and start sticky, if possible
2184
round = (currentDigit &0x4L) != 0L;
2185
sticky = (currentDigit & 0x3L) != 0;
2186
break;
2187
2188
case -4:
2189
// all bits copied into significand; set
2190
// round and start sticky
2191
round = ((currentDigit & 0x8L) != 0); // is top bit set?
2192
// nonzeros in three low order bits?
2193
sticky = (currentDigit & 0x7L) != 0;
2194
break;
2195
2196
default:
2197
throw new AssertionError("Unexpected shift distance remainder.");
2198
// break;
2199
}
2200
2201
// Round is set; sticky might be set.
2202
2203
// For the sticky bit, it suffices to check the
2204
// current digit and test for any nonzero digits in
2205
// the remaining unprocessed input.
2206
i++;
2207
while(i < signifLength && !sticky) {
2208
currentDigit = getHexDigit(significandString,i);
2209
sticky = sticky || (currentDigit != 0);
2210
i++;
2211
}
2212
2213
}
2214
// else all of string was seen, round and sticky are
2215
// correct as false.
2216
2217
2218
// Check for overflow and update exponent accordingly.
2219
2220
if (exponent > DoubleConsts.MAX_EXPONENT) { // Infinite result
2221
// overflow to properly signed infinity
2222
return new OldFloatingDecimalForTest(sign * Double.POSITIVE_INFINITY);
2223
} else { // Finite return value
2224
if (exponent <= DoubleConsts.MAX_EXPONENT && // (Usually) normal result
2225
exponent >= DoubleConsts.MIN_EXPONENT) {
2226
2227
// The result returned in this block cannot be a
2228
// zero or subnormal; however after the
2229
// significand is adjusted from rounding, we could
2230
// still overflow in infinity.
2231
2232
// AND exponent bits into significand; if the
2233
// significand is incremented and overflows from
2234
// rounding, this combination will update the
2235
// exponent correctly, even in the case of
2236
// Double.MAX_VALUE overflowing to infinity.
2237
2238
significand = (( (exponent +
2239
(long)DoubleConsts.EXP_BIAS) <<
2240
(DoubleConsts.SIGNIFICAND_WIDTH-1))
2241
& DoubleConsts.EXP_BIT_MASK) |
2242
(DoubleConsts.SIGNIF_BIT_MASK & significand);
2243
2244
} else { // Subnormal or zero
2245
// (exponent < DoubleConsts.MIN_EXPONENT)
2246
2247
if (exponent < (DoubleConsts.MIN_SUB_EXPONENT -1 )) {
2248
// No way to round back to nonzero value
2249
// regardless of significand if the exponent is
2250
// less than -1075.
2251
return new OldFloatingDecimalForTest(sign * 0.0);
2252
} else { // -1075 <= exponent <= MIN_EXPONENT -1 = -1023
2253
/*
2254
* Find bit position to round to; recompute
2255
* round and sticky bits, and shift
2256
* significand right appropriately.
2257
*/
2258
2259
sticky = sticky || round;
2260
round = false;
2261
2262
// Number of bits of significand to preserve is
2263
// exponent - abs_min_exp +1
2264
// check:
2265
// -1075 +1074 + 1 = 0
2266
// -1023 +1074 + 1 = 52
2267
2268
int bitsDiscarded = 53 -
2269
((int)exponent - DoubleConsts.MIN_SUB_EXPONENT + 1);
2270
assert bitsDiscarded >= 1 && bitsDiscarded <= 53;
2271
2272
// What to do here:
2273
// First, isolate the new round bit
2274
round = (significand & (1L << (bitsDiscarded -1))) != 0L;
2275
if (bitsDiscarded > 1) {
2276
// create mask to update sticky bits; low
2277
// order bitsDiscarded bits should be 1
2278
long mask = ~((~0L) << (bitsDiscarded -1));
2279
sticky = sticky || ((significand & mask) != 0L ) ;
2280
}
2281
2282
// Now, discard the bits
2283
significand = significand >> bitsDiscarded;
2284
2285
significand = (( ((long)(DoubleConsts.MIN_EXPONENT -1) + // subnorm exp.
2286
(long)DoubleConsts.EXP_BIAS) <<
2287
(DoubleConsts.SIGNIFICAND_WIDTH-1))
2288
& DoubleConsts.EXP_BIT_MASK) |
2289
(DoubleConsts.SIGNIF_BIT_MASK & significand);
2290
}
2291
}
2292
2293
// The significand variable now contains the currently
2294
// appropriate exponent bits too.
2295
2296
/*
2297
* Determine if significand should be incremented;
2298
* making this determination depends on the least
2299
* significant bit and the round and sticky bits.
2300
*
2301
* Round to nearest even rounding table, adapted from
2302
* table 4.7 in "Computer Arithmetic" by IsraelKoren.
2303
* The digit to the left of the "decimal" point is the
2304
* least significant bit, the digits to the right of
2305
* the point are the round and sticky bits
2306
*
2307
* Number Round(x)
2308
* x0.00 x0.
2309
* x0.01 x0.
2310
* x0.10 x0.
2311
* x0.11 x1. = x0. +1
2312
* x1.00 x1.
2313
* x1.01 x1.
2314
* x1.10 x1. + 1
2315
* x1.11 x1. + 1
2316
*/
2317
boolean incremented = false;
2318
boolean leastZero = ((significand & 1L) == 0L);
2319
if( ( leastZero && round && sticky ) ||
2320
((!leastZero) && round )) {
2321
incremented = true;
2322
significand++;
2323
}
2324
2325
OldFloatingDecimalForTest fd = new OldFloatingDecimalForTest(Math.copySign(
2326
Double.longBitsToDouble(significand),
2327
sign));
2328
2329
/*
2330
* Set roundingDir variable field of fd properly so
2331
* that the input string can be properly rounded to a
2332
* float value. There are two cases to consider:
2333
*
2334
* 1. rounding to double discards sticky bit
2335
* information that would change the result of a float
2336
* rounding (near halfway case between two floats)
2337
*
2338
* 2. rounding to double rounds up when rounding up
2339
* would not occur when rounding to float.
2340
*
2341
* For former case only needs to be considered when
2342
* the bits rounded away when casting to float are all
2343
* zero; otherwise, float round bit is properly set
2344
* and sticky will already be true.
2345
*
2346
* The lower exponent bound for the code below is the
2347
* minimum (normalized) subnormal exponent - 1 since a
2348
* value with that exponent can round up to the
2349
* minimum subnormal value and the sticky bit
2350
* information must be preserved (i.e. case 1).
2351
*/
2352
if ((exponent >= FloatConsts.MIN_SUB_EXPONENT-1) &&
2353
(exponent <= FloatConsts.MAX_EXPONENT ) ){
2354
// Outside above exponent range, the float value
2355
// will be zero or infinity.
2356
2357
/*
2358
* If the low-order 28 bits of a rounded double
2359
* significand are 0, the double could be a
2360
* half-way case for a rounding to float. If the
2361
* double value is a half-way case, the double
2362
* significand may have to be modified to round
2363
* the the right float value (see the stickyRound
2364
* method). If the rounding to double has lost
2365
* what would be float sticky bit information, the
2366
* double significand must be incremented. If the
2367
* double value's significand was itself
2368
* incremented, the float value may end up too
2369
* large so the increment should be undone.
2370
*/
2371
if ((significand & 0xfffffffL) == 0x0L) {
2372
// For negative values, the sign of the
2373
// roundDir is the same as for positive values
2374
// since adding 1 increasing the significand's
2375
// magnitude and subtracting 1 decreases the
2376
// significand's magnitude. If neither round
2377
// nor sticky is true, the double value is
2378
// exact and no adjustment is required for a
2379
// proper float rounding.
2380
if( round || sticky) {
2381
if (leastZero) { // prerounding lsb is 0
2382
// If round and sticky were both true,
2383
// and the least significant
2384
// significand bit were 0, the rounded
2385
// significand would not have its
2386
// low-order bits be zero. Therefore,
2387
// we only need to adjust the
2388
// significand if round XOR sticky is
2389
// true.
2390
if (round ^ sticky) {
2391
fd.roundDir = 1;
2392
}
2393
}
2394
else { // prerounding lsb is 1
2395
// If the prerounding lsb is 1 and the
2396
// resulting significand has its
2397
// low-order bits zero, the significand
2398
// was incremented. Here, we undo the
2399
// increment, which will ensure the
2400
// right guard and sticky bits for the
2401
// float rounding.
2402
if (round)
2403
fd.roundDir = -1;
2404
}
2405
}
2406
}
2407
}
2408
2409
fd.fromHex = true;
2410
return fd;
2411
}
2412
}
2413
}
2414
2415
/**
2416
* Return <code>s</code> with any leading zeros removed.
2417
*/
2418
static String stripLeadingZeros(String s) {
2419
return s.replaceFirst("^0+", "");
2420
}
2421
2422
/**
2423
* Extract a hexadecimal digit from position <code>position</code>
2424
* of string <code>s</code>.
2425
*/
2426
static int getHexDigit(String s, int position) {
2427
int value = Character.digit(s.charAt(position), 16);
2428
if (value <= -1 || value >= 16) {
2429
throw new AssertionError("Unexpected failure of digit conversion of " +
2430
s.charAt(position));
2431
}
2432
return value;
2433
}
2434
2435
2436
}
2437
2438