mirror of
https://github.com/golang/go.git
synced 2026-04-04 10:20:00 +09:00
The old way of implementing it, float32(float64(x)), involves 2 roundings which can cause accuracy errors in some strange cases. Implement a runtime version of [u]int64tofloat32 which only does one rounding. Fixes #48807 Change-Id: Ie580be480bee4f3a479e58ef8dce23032f231704 Reviewed-on: https://go-review.googlesource.com/c/go/+/354429 Trust: Keith Randall <khr@golang.org> Run-TryBot: Keith Randall <khr@golang.org> TryBot-Result: Go Bot <gobot@golang.org> Reviewed-by: David Chase <drchase@google.com>
26 lines
699 B
Go
26 lines
699 B
Go
// Copyright 2021 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 runtime_test
|
|
|
|
import (
|
|
"testing"
|
|
)
|
|
|
|
func TestIssue48807(t *testing.T) {
|
|
for _, i := range []uint64{
|
|
0x8234508000000001, // from issue48807
|
|
1<<56 + 1<<32 + 1,
|
|
} {
|
|
got := float32(i)
|
|
dontwant := float32(float64(i))
|
|
if got == dontwant {
|
|
// The test cases above should be uint64s such that
|
|
// this equality doesn't hold. These examples trigger
|
|
// the case where using an intermediate float64 doesn't work.
|
|
t.Errorf("direct float32 conversion doesn't work: arg=%x got=%x dontwant=%x", i, got, dontwant)
|
|
}
|
|
}
|
|
}
|