// run | |
// Copyright 2018 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 main | |
import ( | |
"math" | |
) | |
type S struct { | |
u int64 | |
n int32 | |
} | |
func F1(f float64) *S { | |
s := f | |
pf := math.Copysign(f, 1) | |
u := math.Floor(pf) | |
return &S{ | |
u: int64(math.Copysign(u, s)), | |
n: int32(math.Copysign((pf-u)*1e9, s)), | |
} | |
} | |
func F2(f float64) *S { | |
s := f | |
f = math.Copysign(f, 1) | |
u := math.Floor(f) | |
return &S{ | |
u: int64(math.Copysign(u, s)), | |
n: int32(math.Copysign((f-u)*1e9, s)), | |
} | |
} | |
func main() { | |
s1 := F1(-1) | |
s2 := F2(-1) | |
if *s1 != *s2 { | |
println("F1:", s1.u, s1.n) | |
println("F2:", s2.u, s2.n) | |
panic("different") | |
} | |
} |