1 // Copyright 2009 The Go Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style
3 // license that can be found in the LICENSE file.
16 func pow2(i
int) float64 {
25 return pow2(i
/2) * pow2(i
-i
/2)
28 // Wrapper around strconv.ParseFloat(x, 64). Handles dddddp+ddd (binary exponent)
29 // itself, passes the rest on to strconv.ParseFloat.
30 func myatof64(s
string) (f
float64, ok
bool) {
31 a
:= strings
.SplitN(s
, "p", 2)
33 n
, err
:= strconv
.ParseInt(a
[0], 10, 64)
37 e
, err1
:= strconv
.Atoi(a
[1])
39 println("bad e", a
[1])
43 // We expect that v*pow2(e) fits in a float64,
44 // but pow2(e) by itself may not. Be careful.
63 return v
* pow2(e
), true
65 f1
, err
:= strconv
.ParseFloat(s
, 64)
72 // Wrapper around strconv.ParseFloat(x, 32). Handles dddddp+ddd (binary exponent)
73 // itself, passes the rest on to strconv.ParseFloat.
74 func myatof32(s
string) (f
float32, ok
bool) {
75 a
:= strings
.SplitN(s
, "p", 2)
77 n
, err
:= strconv
.Atoi(a
[0])
79 println("bad n", a
[0])
82 e
, err1
:= strconv
.Atoi(a
[1])
84 println("bad p", a
[1])
87 return float32(float64(n
) * pow2(e
)), true
89 f64
, err1
:= strconv
.ParseFloat(s
, 32)
97 func TestFp(t
*testing
.T
) {
98 f
, err
:= os
.Open("testdata/testfp.txt")
100 t
.Fatal("testfp: open testdata/testfp.txt:", err
)
104 s
:= bufio
.NewScanner(f
)
106 for lineno
:= 1; s
.Scan(); lineno
++ {
108 if len(line
) == 0 || line
[0] == '#' {
111 a
:= strings
.Split(line
, " ")
113 t
.Error("testdata/testfp.txt:", lineno
, ": wrong field count")
121 v
, ok
= myatof64(a
[2])
123 t
.Error("testdata/testfp.txt:", lineno
, ": cannot atof64 ", a
[2])
126 s
= fmt
.Sprintf(a
[1], v
)
128 v1
, ok
:= myatof32(a
[2])
130 t
.Error("testdata/testfp.txt:", lineno
, ": cannot atof32 ", a
[2])
133 s
= fmt
.Sprintf(a
[1], v1
)
137 t
.Error("testdata/testfp.txt:", lineno
, ": ", a
[0], " ", a
[1], " ", a
[2], " (", v
, ") ",
138 "want ", a
[3], " got ", s
)
142 t
.Fatal("testfp: read testdata/testfp.txt: ", s
.Err())