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