2
0
Эх сурвалжийг харах

Fix duplicate sign printing of complex and quaternion types

Negative zero wasn't being detected (so it would appear as `+-0`), and
`+Inf` was appearing as `++Inf` when imaginary.
Feoramund 1 жил өмнө
parent
commit
eb93779f63
1 өөрчлөгдсөн 20 нэмэгдсэн , 4 устгасан
  1. 20 4
      core/fmt/fmt.odin

+ 20 - 4
core/fmt/fmt.odin

@@ -2,6 +2,7 @@ package fmt
 
 
 import "base:intrinsics"
 import "base:intrinsics"
 import "base:runtime"
 import "base:runtime"
+import "core:math"
 import "core:math/bits"
 import "core:math/bits"
 import "core:mem"
 import "core:mem"
 import "core:io"
 import "core:io"
@@ -2968,6 +2969,21 @@ fmt_value :: proc(fi: ^Info, v: any, verb: rune) {
 		fmt_bit_field(fi, v, verb, info, "")
 		fmt_bit_field(fi, v, verb, info, "")
 	}
 	}
 }
 }
+// This proc helps keep some of the code around whether or not to print an
+// intermediate plus sign in complexes and quaternions more readable.
+@(private)
+_cq_should_print_intermediate_plus :: proc "contextless" (fi: ^Info, f: f64) -> bool {
+	if !fi.plus && f >= 0 {
+		#partial switch math.classify(f) {
+		case .Neg_Zero, .Inf:
+			// These two classes print their own signs.
+			return false
+		case:
+			return true
+		}
+	}
+	return false
+}
 // Formats a complex number based on the given formatting verb
 // Formats a complex number based on the given formatting verb
 //
 //
 // Inputs:
 // Inputs:
@@ -2981,7 +2997,7 @@ fmt_complex :: proc(fi: ^Info, c: complex128, bits: int, verb: rune) {
 	case 'f', 'F', 'v', 'h', 'H', 'w':
 	case 'f', 'F', 'v', 'h', 'H', 'w':
 		r, i := real(c), imag(c)
 		r, i := real(c), imag(c)
 		fmt_float(fi, r, bits/2, verb)
 		fmt_float(fi, r, bits/2, verb)
-		if !fi.plus && i >= 0 {
+		if _cq_should_print_intermediate_plus(fi, i) {
 			io.write_rune(fi.writer, '+', &fi.n)
 			io.write_rune(fi.writer, '+', &fi.n)
 		}
 		}
 		fmt_float(fi, i, bits/2, verb)
 		fmt_float(fi, i, bits/2, verb)
@@ -3007,19 +3023,19 @@ fmt_quaternion  :: proc(fi: ^Info, q: quaternion256, bits: int, verb: rune) {
 
 
 		fmt_float(fi, r, bits/4, verb)
 		fmt_float(fi, r, bits/4, verb)
 
 
-		if !fi.plus && i >= 0 {
+		if _cq_should_print_intermediate_plus(fi, i) {
 			io.write_rune(fi.writer, '+', &fi.n)
 			io.write_rune(fi.writer, '+', &fi.n)
 		}
 		}
 		fmt_float(fi, i, bits/4, verb)
 		fmt_float(fi, i, bits/4, verb)
 		io.write_rune(fi.writer, 'i', &fi.n)
 		io.write_rune(fi.writer, 'i', &fi.n)
 
 
-		if !fi.plus && j >= 0 {
+		if _cq_should_print_intermediate_plus(fi, j) {
 			io.write_rune(fi.writer, '+', &fi.n)
 			io.write_rune(fi.writer, '+', &fi.n)
 		}
 		}
 		fmt_float(fi, j, bits/4, verb)
 		fmt_float(fi, j, bits/4, verb)
 		io.write_rune(fi.writer, 'j', &fi.n)
 		io.write_rune(fi.writer, 'j', &fi.n)
 
 
-		if !fi.plus && k >= 0 {
+		if _cq_should_print_intermediate_plus(fi, k) {
 			io.write_rune(fi.writer, '+', &fi.n)
 			io.write_rune(fi.writer, '+', &fi.n)
 		}
 		}
 		fmt_float(fi, k, bits/4, verb)
 		fmt_float(fi, k, bits/4, verb)