@@ -546,7 +546,7 @@ PrintTests.test("Printable_Float") {
546
546
// Every power of 10 should print with only a single digit '1'
547
547
for power in -45 ... 38 {
548
548
let s: String
549
- if power < -4 || power > 5 { // Exponential form
549
+ if power < -4 || power > 7 { // Exponential form
550
550
s = exponentialPowerOfTen(power)
551
551
} else if power < 0 { // Fractional decimal form
552
552
s = "0." + String(repeating: "0", count: -power - 1) + "1"
@@ -564,8 +564,14 @@ PrintTests.test("Printable_Float") {
564
564
expectAccurateDescription(f.nextUp)
565
565
}
566
566
567
- // Check that the formatter chooses exponential
568
- // format when it should:
567
+ // Float can represent all integers -(2^24)...(2^24)
568
+ let maxDecimalForm = Float(1 << 24)
569
+ expectDescription("16777216.0", maxDecimalForm)
570
+ expectDescription("-16777216.0", -maxDecimalForm)
571
+ // Outside of that range, use exponential form
572
+ expectDescription("1.6777218e+07", maxDecimalForm.nextUp)
573
+ expectDescription("-1.6777218e+07", -maxDecimalForm.nextUp)
574
+
569
575
expectDescription("1.00001", asFloat32(1.00001))
570
576
expectDescription("1.25e+17", asFloat32(125000000000000000.0))
571
577
expectDescription("1.25e+16", asFloat32(12500000000000000.0))
@@ -577,8 +583,8 @@ PrintTests.test("Printable_Float") {
577
583
expectDescription("1.25e+10", asFloat32(12500000000.0))
578
584
expectDescription("1.25e+09", asFloat32(1250000000.0))
579
585
expectDescription("1.25e+08", asFloat32(125000000.0))
580
- expectDescription("1.25e+07 ", asFloat32(12500000.0))
581
- expectDescription("1.25e+06 ", asFloat32(1250000.0))
586
+ expectDescription("12500000.0 ", asFloat32(12500000.0))
587
+ expectDescription("1250000.0 ", asFloat32(1250000.0))
582
588
expectDescription("125000.0", asFloat32(125000.0))
583
589
expectDescription("12500.0", asFloat32(12500.0))
584
590
expectDescription("1250.0", asFloat32(1250.0))
@@ -662,7 +668,7 @@ PrintTests.test("Printable_Double") {
662
668
// We know how every power of 10 should print
663
669
for power in -323 ... 308 {
664
670
let s: String
665
- if power < -4 || power > 14 { // Exponential form
671
+ if power < -4 || power > 15 { // Exponential form
666
672
s = exponentialPowerOfTen(power)
667
673
} else if power < 0 { // Fractional decimal form
668
674
s = "0." + String(repeating: "0", count: -power - 1) + "1"
@@ -689,12 +695,18 @@ PrintTests.test("Printable_Double") {
689
695
}
690
696
}
691
697
692
- // Check that the formatter chooses exponential
693
- // format when it should:
698
+ // Double can represent all integers -(2^53)...(2^53)
699
+ let maxDecimalForm = Double((1 as Int64) << 53)
700
+ expectDescription("9007199254740992.0", maxDecimalForm)
701
+ expectDescription("-9007199254740992.0", -maxDecimalForm)
702
+ // Outside of that range, we use exponential form:
703
+ expectDescription("9.007199254740994e+15", maxDecimalForm.nextUp)
704
+ expectDescription("-9.007199254740994e+15", -maxDecimalForm.nextUp)
705
+
694
706
expectDescription("1.00000000000001", asFloat64(1.00000000000001))
695
707
expectDescription("1.25e+17", asFloat64(125000000000000000.0))
696
708
expectDescription("1.25e+16", asFloat64(12500000000000000.0))
697
- expectDescription("1.25e+15 ", asFloat64(1250000000000000.0))
709
+ expectDescription("1250000000000000.0 ", asFloat64(1250000000000000.0))
698
710
expectDescription("125000000000000.0", asFloat64(125000000000000.0))
699
711
expectDescription("12500000000000.0", asFloat64(12500000000000.0))
700
712
expectDescription("1250000000000.0", asFloat64(1250000000000.0))
@@ -771,7 +783,7 @@ PrintTests.test("Printable_Float80") {
771
783
// We know how every power of 10 should print
772
784
for power in -4950 ... 4932 {
773
785
let s: String
774
- if power < -4 || power > 17 { // Exponential form
786
+ if power < -4 || power > 19 { // Exponential form
775
787
s = exponentialPowerOfTen(power)
776
788
} else if power < 0 { // Fractional decimal form
777
789
s = "0." + String(repeating: "0", count: -power - 1) + "1"
@@ -796,11 +808,19 @@ PrintTests.test("Printable_Float80") {
796
808
}
797
809
}
798
810
799
- // Check that the formatter chooses exponential
800
- // format when it should:
811
+ // Float80 can represent all integers -(2^64)...(2^64):
812
+ let maxDecimalForm = Float80(UInt64.max) + 1.0
813
+ expectDescription("18446744073709551616.0", maxDecimalForm)
814
+ expectDescription("-18446744073709551616.0", -maxDecimalForm)
815
+ // Outside of that range, use exponential form
816
+ expectDescription("1.8446744073709551618e+19", maxDecimalForm.nextUp)
817
+ expectDescription("-1.8446744073709551618e+19", -maxDecimalForm.nextUp)
818
+
801
819
expectDescription("1.00000000000000001", asFloat80(1.00000000000000001))
802
- expectDescription("1.25e+19", asFloat80(12500000000000000000.0))
803
- expectDescription("1.25e+18", asFloat80(1250000000000000000.0))
820
+ expectDescription("1.25e+21", asFloat80(1250000000000000000000.0))
821
+ expectDescription("1.25e+20", asFloat80(125000000000000000000.0))
822
+ expectDescription("12500000000000000000.0", asFloat80(12500000000000000000.0))
823
+ expectDescription("1250000000000000000.0", asFloat80(1250000000000000000.0))
804
824
expectDescription("125000000000000000.0", asFloat80(125000000000000000.0))
805
825
expectDescription("12500000000000000.0", asFloat80(12500000000000000.0))
806
826
expectDescription("1250000000000000.0", asFloat80(1250000000000000.0))
0 commit comments