53 lines
833 B
Go
53 lines
833 B
Go
package main
|
|
|
|
import (
|
|
"fmt"
|
|
"math"
|
|
)
|
|
|
|
func main() {
|
|
d2, d1, d0 := encodeAcc(6.742071875)
|
|
a := decode2Acc(d2, d1, d0)
|
|
fmt.Println(a)
|
|
}
|
|
|
|
const G = 9.80665
|
|
|
|
func encodeAcc(a float32) (d2, d1, d0 byte) {
|
|
d2 = 0
|
|
d1 = 0
|
|
d0 = 0
|
|
x := a / G
|
|
v := uint32(0)
|
|
for i := 17; i >= 0; i-- {
|
|
t := float32(1.0 / math.Pow(2, float64(17-i)))
|
|
if t > x {
|
|
continue
|
|
} else {
|
|
v |= 1 << i
|
|
x -= t
|
|
}
|
|
}
|
|
fmt.Printf("%b, %b\n", v, v<<6)
|
|
v <<= 6
|
|
d0 = byte(v)
|
|
d1 = byte(v >> 8)
|
|
d2 = byte(v >> 16)
|
|
fmt.Printf("%b, %b, %b\n", d2, d1, d0)
|
|
return
|
|
}
|
|
|
|
func decode2Acc(d2, d1, d0 byte) float32 {
|
|
v := uint32(d2)<<10 | uint32(d1)<<2 | uint32(d0>>6)
|
|
fmt.Printf("%b\n", v)
|
|
x := float32(0)
|
|
for i := 17; i >= 0; i-- {
|
|
if v&(1<<i) != 0 {
|
|
t := float32(1.0 / math.Pow(2, float64(17-i)))
|
|
x += t
|
|
}
|
|
}
|
|
fmt.Println(x)
|
|
return x * G
|
|
}
|