Issue
The GO driver for MongoDB has a Decimal128 type which is a struct that looks like this:
type Decimal128 struct {
h, l uint64
}
according to the docs, the h and l are high and low uint64 values. What do these two values represent? Let's say I wanted to create a Decimal128 that when converted to a string will equal "100.50"
. Using the function below, what would be the value of h and l.
func NewDecimal128(h, l uint64) Decimal128 {
return Decimal128{h: h, l: l}
}
I'm always forced to parse a string like this d, _ := primitive.ParseDecimal128("100.50")
instead of
d := primitive.NewDecimal128(h, l)
to create a new Decimal128 just because i don't understand how the high and the low values are used to derive the decimal value.
Solution
Decimal128.h
and Decimal128.l
both are of type uint64
, both have 64 bits which add up to 128 bits.
| Decimal128.h bits || Decimal128.l bits |
63... ....0 63... ....0
Mongo-go's implementation of Decimal128
is similar / close to the IEEE 754 quadruple-precision floating-point format with some minor differences. Highest bit of h
is the sign bit, then there are 2 bits ignored, then comes 14 bits exponent, and 111 bits significand. The subsequent 5 bits next to the sign bits are special, if their value is 0x1f
, that means the Decimal128
value represents NaN (not a number), if their value is 0x1e
, then the value represents positive or negative infinity (depending on the sign bit).
Check out the implementation of the Decimal128.BigInt()
method for details.
As you can see, the "individual" low and high values have no direct correlation to the represented floating point number, but instead their 128 bits are handled as described above.
E.g. low and high values for "100.50"
will be:
d, err := primitive.ParseDecimal128("100.50")
fmt.Println(d, err)
fmt.Printf("%#v", d)
Output (try it on the Go Playground):
100.50 <nil>
primitive.Decimal128{h:0x303c000000000000, l:0x2742}
Answered By - icza Answer Checked By - Timothy Miller (PHPFixing Admin)
0 Comments:
Post a Comment
Note: Only a member of this blog may post a comment.