1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122
| func genericFtoa(dst []byte, val float64, fmt byte, prec, bitSize int) []byte { var bits uint64 var flt *floatInfo
print("传入的待创处理的float64类型的值:",val,"\n")
switch bitSize { case 32: bits = uint64(math.Float32bits(float32(val))) flt = &float32info case 64: bits = math.Float64bits(val) flt = &float64info default: panic("strconv: illegal AppendFloat/FormatFloat bitSize") }
print("得到的bits的值:",bits,"\n")
neg := bits>>(flt.expbits+flt.mantbits) != 0 exp := int(bits>>flt.mantbits) & (1<<flt.expbits - 1) mant := bits & (uint64(1)<<flt.mantbits - 1)
switch exp { case 1<<flt.expbits - 1: var s string switch { case mant != 0: s = "NaN" case neg: s = "-Inf" default: s = "+Inf" } return append(dst, s...)
case 0: exp++
default: mant |= uint64(1) << flt.mantbits } exp += flt.bias
if fmt == 'b' { return fmtB(dst, neg, mant, exp, flt) } if fmt == 'x' || fmt == 'X' { return fmtX(dst, prec, fmt, neg, mant, exp, flt) }
if !optimize { return bigFtoa(dst, prec, fmt, neg, mant, exp, flt) }
var digs decimalSlice ok := false shortest := prec < 0 if shortest { f := new(extFloat) lower, upper := f.AssignComputeBounds(mant, exp, neg, flt) var buf [32]byte digs.d = buf[:] ok = f.ShortestDecimal(&digs, &lower, &upper) if !ok { return bigFtoa(dst, prec, fmt, neg, mant, exp, flt) } switch fmt { case 'e', 'E': prec = max(digs.nd-1, 0) case 'f': prec = max(digs.nd-digs.dp, 0) case 'g', 'G': prec = digs.nd } } else if fmt != 'f' { digits := prec switch fmt { case 'e', 'E': digits++ case 'g', 'G': if prec == 0 { prec = 1 } digits = prec } if digits <= 15 { var buf [24]byte digs.d = buf[:] f := extFloat{mant, exp - int(flt.mantbits), neg} ok = f.FixedDecimal(&digs, digits) } } if !ok { return bigFtoa(dst, prec, fmt, neg, mant, exp, flt) } return formatDigits(dst, shortest, neg, digs, prec, fmt) }
|