// Copyright 2015 The Go Authors. All rights reserved.// Use of this source code is governed by a BSD-style// license that can be found in the LICENSE file.// This file implements encoding/decoding of Floats.package bigimport ()// Gob codec version. Permits backward-compatible changes to the encoding.constfloatGobVersionbyte = 1// GobEncode implements the gob.GobEncoder interface.// The Float value and all its attributes (precision,// rounding mode, accuracy) are marshaled.func ( *Float) () ([]byte, error) {if == nil {returnnil, nil }// determine max. space (bytes) required for encoding := 1 + 1 + 4// version + mode|acc|form|neg (3+2+2+1bit) + prec := 0// number of mantissa wordsif .form == finite {// add space for mantissa and exponent = int((.prec + (_W - 1)) / _W) // required mantissa length in words for given precision// actual mantissa slice could be shorter (trailing 0's) or longer (unused bits): // - if shorter, only encode the words present // - if longer, cut off unused words when encoding in bytes // (in practice, this should never happen since rounding // takes care of it, but be safe and do it always)iflen(.mant) < { = len(.mant) }// len(x.mant) >= n += 4 + *_S// exp + mant } := make([]byte, ) [0] = floatGobVersion := byte(.mode&7)<<5 | byte((.acc+1)&3)<<3 | byte(.form&3)<<1if .neg { |= 1 } [1] = binary.BigEndian.PutUint32([2:], .prec)if .form == finite {binary.BigEndian.PutUint32([6:], uint32(.exp)) .mant[len(.mant)-:].bytes([10:]) // cut off unused trailing words }return , nil}// GobDecode implements the gob.GobDecoder interface.// The result is rounded per the precision and rounding mode of// z unless z's precision is 0, in which case z is set exactly// to the decoded value.func ( *Float) ( []byte) error {iflen() == 0 {// Other side sent a nil or default value. * = Float{}returnnil }iflen() < 6 {returnerrors.New("Float.GobDecode: buffer too small") }if [0] != floatGobVersion {returnfmt.Errorf("Float.GobDecode: encoding version %d not supported", [0]) } := .prec := .mode := [1] .mode = RoundingMode(( >> 5) & 7) .acc = Accuracy((>>3)&3) - 1 .form = form(( >> 1) & 3) .neg = &1 != 0 .prec = binary.BigEndian.Uint32([2:])if .form == finite {iflen() < 10 {returnerrors.New("Float.GobDecode: buffer too small for finite form float") } .exp = int32(binary.BigEndian.Uint32([6:])) .mant = .mant.setBytes([10:]) }if != 0 { .mode = .SetPrec(uint()) }if := .validate0(); != "" {returnerrors.New("Float.GobDecode: " + ) }returnnil}// MarshalText implements the encoding.TextMarshaler interface.// Only the Float value is marshaled (in full precision), other// attributes such as precision or accuracy are ignored.func ( *Float) () ( []byte, error) {if == nil {return []byte("<nil>"), nil }var []bytereturn .Append(, 'g', -1), nil}// UnmarshalText implements the encoding.TextUnmarshaler interface.// The result is rounded per the precision and rounding mode of z.// If z's precision is 0, it is changed to 64 before rounding takes// effect.func ( *Float) ( []byte) error {// TODO(gri): get rid of the []byte/string conversion , , := .Parse(string(), 0)if != nil { = fmt.Errorf("math/big: cannot unmarshal %q into a *big.Float (%v)", , ) }return}
The pages are generated with Goldsv0.6.7. (GOOS=linux GOARCH=amd64)
Golds is a Go 101 project developed by Tapir Liu.
PR and bug reports are welcome and can be submitted to the issue list.
Please follow @Go100and1 (reachable from the left QR code) to get the latest news of Golds.