@@ -546,7 +546,7 @@ PrintTests.test("Printable_Float") {
546546 // Every power of 10 should print with only a single digit '1'
547547 for power in -45 ... 38 {
548548 let s: String
549- if power < -4 || power > 5 { // Exponential form
549+ if power < -4 || power > 7 { // Exponential form
550550 s = exponentialPowerOfTen(power)
551551 } else if power < 0 { // Fractional decimal form
552552 s = "0." + String(repeating: "0", count: -power - 1) + "1"
@@ -564,8 +564,14 @@ PrintTests.test("Printable_Float") {
564564 expectAccurateDescription(f.nextUp)
565565 }
566566
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+
569575 expectDescription("1.00001", asFloat32(1.00001))
570576 expectDescription("1.25e+17", asFloat32(125000000000000000.0))
571577 expectDescription("1.25e+16", asFloat32(12500000000000000.0))
@@ -577,8 +583,8 @@ PrintTests.test("Printable_Float") {
577583 expectDescription("1.25e+10", asFloat32(12500000000.0))
578584 expectDescription("1.25e+09", asFloat32(1250000000.0))
579585 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))
582588 expectDescription("125000.0", asFloat32(125000.0))
583589 expectDescription("12500.0", asFloat32(12500.0))
584590 expectDescription("1250.0", asFloat32(1250.0))
@@ -662,7 +668,7 @@ PrintTests.test("Printable_Double") {
662668 // We know how every power of 10 should print
663669 for power in -323 ... 308 {
664670 let s: String
665- if power < -4 || power > 14 { // Exponential form
671+ if power < -4 || power > 15 { // Exponential form
666672 s = exponentialPowerOfTen(power)
667673 } else if power < 0 { // Fractional decimal form
668674 s = "0." + String(repeating: "0", count: -power - 1) + "1"
@@ -689,12 +695,18 @@ PrintTests.test("Printable_Double") {
689695 }
690696 }
691697
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+
694706 expectDescription("1.00000000000001", asFloat64(1.00000000000001))
695707 expectDescription("1.25e+17", asFloat64(125000000000000000.0))
696708 expectDescription("1.25e+16", asFloat64(12500000000000000.0))
697- expectDescription("1.25e+15 ", asFloat64(1250000000000000.0))
709+ expectDescription("1250000000000000.0 ", asFloat64(1250000000000000.0))
698710 expectDescription("125000000000000.0", asFloat64(125000000000000.0))
699711 expectDescription("12500000000000.0", asFloat64(12500000000000.0))
700712 expectDescription("1250000000000.0", asFloat64(1250000000000.0))
@@ -771,7 +783,7 @@ PrintTests.test("Printable_Float80") {
771783 // We know how every power of 10 should print
772784 for power in -4950 ... 4932 {
773785 let s: String
774- if power < -4 || power > 17 { // Exponential form
786+ if power < -4 || power > 19 { // Exponential form
775787 s = exponentialPowerOfTen(power)
776788 } else if power < 0 { // Fractional decimal form
777789 s = "0." + String(repeating: "0", count: -power - 1) + "1"
@@ -796,11 +808,19 @@ PrintTests.test("Printable_Float80") {
796808 }
797809 }
798810
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+
801819 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))
804824 expectDescription("125000000000000000.0", asFloat80(125000000000000000.0))
805825 expectDescription("12500000000000000.0", asFloat80(12500000000000000.0))
806826 expectDescription("1250000000000000.0", asFloat80(1250000000000000.0))
0 commit comments