-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathhexfloat.go
More file actions
66 lines (55 loc) · 1.29 KB
/
hexfloat.go
File metadata and controls
66 lines (55 loc) · 1.29 KB
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
package wax
import (
"math"
"strconv"
"strings"
"github.com/pkg/errors"
)
func ParseHexfloat32(s string) (float32, error) {
f, err := ParseHexfloat64(s)
if err != nil {
return 0, err
}
return float32(f), nil
}
func ParseHexfloat64(s string) (float64, error) {
s = strings.Trim(s, " \r\n\t")
sign := float64(1)
if strings.HasPrefix(s, "-") {
sign = -1
s = strings.TrimPrefix(s, "-")
}
if !strings.HasPrefix(s, "0x") && !strings.HasPrefix(s, "0X") {
return 0, errors.Errorf("invalid format: %s", s)
}
s = strings.TrimPrefix(s, "0x")
s = strings.TrimPrefix(s, "0X")
shexnumfrac := s
spow := "0"
i := strings.IndexAny(s, "pP")
if i >= 0 {
shexnumfrac = s[:i]
spow = strings.Trim(s[i:], "pP")
}
shexnum := shexnumfrac
shexfrac := "0"
j := strings.IndexRune(shexnumfrac, '.')
if j >= 0 {
shexnum = shexnumfrac[:j]
shexfrac = strings.Trim(shexnumfrac[j:], ".")
}
hexnum, err := strconv.ParseUint(shexnum, 16, 64)
if err != nil {
return 0, err
}
hexfrac, err := strconv.ParseUint(shexfrac, 16, 64)
if err != nil {
return 0, err
}
fhexfrac := float64(hexfrac) / float64(math.Pow(16, float64(len(shexfrac))))
pow, err := strconv.ParseInt(spow, 10, 64)
if err != nil {
return 0, err
}
return sign * (float64(hexnum) + fhexfrac) * math.Pow(2, float64(pow)), nil
}