mirror of
https://github.com/golang/go
synced 2024-10-04 14:31:21 -06:00
d65a5cce89
parsing and printing to new syntax. Use -oldparser to parse the old syntax, use -oldprinter to print the old syntax. 2) Change default gofmt formatting settings to use tabs for indentation only and to use spaces for alignment. This will make the code alignment insensitive to an editor's tabwidth. Use -spaces=false to use tabs for alignment. 3) Manually changed src/exp/parser/parser_test.go so that it doesn't try to parse the parser's source files using the old syntax (they have new syntax now). 4) gofmt -w src misc test/bench 4th set of files. R=rsc CC=golang-dev https://golang.org/cl/180049
150 lines
2.9 KiB
Go
150 lines
2.9 KiB
Go
// Copyright 2009 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.
|
|
|
|
package strconv_test
|
|
|
|
import (
|
|
"bufio"
|
|
"fmt"
|
|
"os"
|
|
"strconv"
|
|
"strings"
|
|
"testing"
|
|
)
|
|
|
|
func pow2(i int) float64 {
|
|
switch {
|
|
case i < 0:
|
|
return 1 / pow2(-i)
|
|
case i == 0:
|
|
return 1
|
|
case i == 1:
|
|
return 2
|
|
}
|
|
return pow2(i/2) * pow2(i-i/2)
|
|
}
|
|
|
|
// Wrapper around strconv.Atof64. Handles dddddp+ddd (binary exponent)
|
|
// itself, passes the rest on to strconv.Atof64.
|
|
func myatof64(s string) (f float64, ok bool) {
|
|
a := strings.Split(s, "p", 2)
|
|
if len(a) == 2 {
|
|
n, err := strconv.Atoi64(a[0])
|
|
if err != nil {
|
|
return 0, false
|
|
}
|
|
e, err1 := strconv.Atoi(a[1])
|
|
if err1 != nil {
|
|
println("bad e", a[1])
|
|
return 0, false
|
|
}
|
|
v := float64(n)
|
|
// We expect that v*pow2(e) fits in a float64,
|
|
// but pow2(e) by itself may not. Be careful.
|
|
if e <= -1000 {
|
|
v *= pow2(-1000)
|
|
e += 1000
|
|
for e < 0 {
|
|
v /= 2
|
|
e++
|
|
}
|
|
return v, true
|
|
}
|
|
if e >= 1000 {
|
|
v *= pow2(1000)
|
|
e -= 1000
|
|
for e > 0 {
|
|
v *= 2
|
|
e--
|
|
}
|
|
return v, true
|
|
}
|
|
return v * pow2(e), true
|
|
}
|
|
f1, err := strconv.Atof64(s)
|
|
if err != nil {
|
|
return 0, false
|
|
}
|
|
return f1, true
|
|
}
|
|
|
|
// Wrapper around strconv.Atof32. Handles dddddp+ddd (binary exponent)
|
|
// itself, passes the rest on to strconv.Atof32.
|
|
func myatof32(s string) (f float32, ok bool) {
|
|
a := strings.Split(s, "p", 2)
|
|
if len(a) == 2 {
|
|
n, err := strconv.Atoi(a[0])
|
|
if err != nil {
|
|
println("bad n", a[0])
|
|
return 0, false
|
|
}
|
|
e, err1 := strconv.Atoi(a[1])
|
|
if err1 != nil {
|
|
println("bad p", a[1])
|
|
return 0, false
|
|
}
|
|
return float32(float64(n) * pow2(e)), true
|
|
}
|
|
f1, err1 := strconv.Atof32(s)
|
|
if err1 != nil {
|
|
return 0, false
|
|
}
|
|
return f1, true
|
|
}
|
|
|
|
func TestFp(t *testing.T) {
|
|
f, err := os.Open("testfp.txt", os.O_RDONLY, 0)
|
|
if err != nil {
|
|
panicln("testfp: open testfp.txt:", err.String())
|
|
}
|
|
defer f.Close()
|
|
|
|
b := bufio.NewReader(f)
|
|
|
|
lineno := 0
|
|
for {
|
|
line, err2 := b.ReadString('\n')
|
|
if err2 == os.EOF {
|
|
break
|
|
}
|
|
if err2 != nil {
|
|
panicln("testfp: read testfp.txt:", err2.String())
|
|
}
|
|
line = line[0 : len(line)-1]
|
|
lineno++
|
|
if len(line) == 0 || line[0] == '#' {
|
|
continue
|
|
}
|
|
a := strings.Split(line, " ", 0)
|
|
if len(a) != 4 {
|
|
t.Error("testfp.txt:", lineno, ": wrong field count\n")
|
|
continue
|
|
}
|
|
var s string
|
|
var v float64
|
|
switch a[0] {
|
|
case "float64":
|
|
var ok bool
|
|
v, ok = myatof64(a[2])
|
|
if !ok {
|
|
t.Error("testfp.txt:", lineno, ": cannot atof64 ", a[2])
|
|
continue
|
|
}
|
|
s = fmt.Sprintf(a[1], v)
|
|
case "float32":
|
|
v1, ok := myatof32(a[2])
|
|
if !ok {
|
|
t.Error("testfp.txt:", lineno, ": cannot atof32 ", a[2])
|
|
continue
|
|
}
|
|
s = fmt.Sprintf(a[1], v1)
|
|
v = float64(v1)
|
|
}
|
|
if s != a[3] {
|
|
t.Error("testfp.txt:", lineno, ": ", a[0], " ", a[1], " ", a[2], " (", v, ") ",
|
|
"want ", a[3], " got ", s)
|
|
}
|
|
}
|
|
}
|