| // 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") | |
| } | |
| } |