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