mirror of
https://github.com/golang/go
synced 2024-11-20 06:54:42 -07:00
reflect: stop thinking that MaxFloat32 overflows float32.
Fixes #4282. R=golang-dev, minux.ma, rsc CC=golang-dev https://golang.org/cl/6759052
This commit is contained in:
parent
320df44f04
commit
38070a72c5
@ -2664,6 +2664,45 @@ func TestConvert(t *testing.T) {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func TestOverflow(t *testing.T) {
|
||||||
|
if ovf := V(float64(0)).OverflowFloat(1e300); ovf {
|
||||||
|
t.Errorf("%v wrongly overflows float64", 1e300)
|
||||||
|
}
|
||||||
|
|
||||||
|
maxFloat32 := float64((1<<24 - 1) << (127 - 23))
|
||||||
|
if ovf := V(float32(0)).OverflowFloat(maxFloat32); ovf {
|
||||||
|
t.Errorf("%v wrongly overflows float32", maxFloat32)
|
||||||
|
}
|
||||||
|
ovfFloat32 := float64((1<<24-1)<<(127-23) + 1<<(127-52))
|
||||||
|
if ovf := V(float32(0)).OverflowFloat(ovfFloat32); !ovf {
|
||||||
|
t.Errorf("%v should overflow float32", ovfFloat32)
|
||||||
|
}
|
||||||
|
if ovf := V(float32(0)).OverflowFloat(-ovfFloat32); !ovf {
|
||||||
|
t.Errorf("%v should overflow float32", -ovfFloat32)
|
||||||
|
}
|
||||||
|
|
||||||
|
maxInt32 := int64(0x7fffffff)
|
||||||
|
if ovf := V(int32(0)).OverflowInt(maxInt32); ovf {
|
||||||
|
t.Errorf("%v wrongly overflows int32", maxInt32)
|
||||||
|
}
|
||||||
|
if ovf := V(int32(0)).OverflowInt(-1 << 31); ovf {
|
||||||
|
t.Errorf("%v wrongly overflows int32", -int64(1)<<31)
|
||||||
|
}
|
||||||
|
ovfInt32 := int64(1 << 31)
|
||||||
|
if ovf := V(int32(0)).OverflowInt(ovfInt32); !ovf {
|
||||||
|
t.Errorf("%v should overflow int32", ovfInt32)
|
||||||
|
}
|
||||||
|
|
||||||
|
maxUint32 := uint64(0xffffffff)
|
||||||
|
if ovf := V(uint32(0)).OverflowUint(maxUint32); ovf {
|
||||||
|
t.Errorf("%v wrongly overflows uint32", maxUint32)
|
||||||
|
}
|
||||||
|
ovfUint32 := uint64(1 << 32)
|
||||||
|
if ovf := V(uint32(0)).OverflowUint(ovfUint32); !ovf {
|
||||||
|
t.Errorf("%v should overflow uint32", ovfUint32)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
type B1 struct {
|
type B1 struct {
|
||||||
X int
|
X int
|
||||||
Y int
|
Y int
|
||||||
|
@ -1179,7 +1179,7 @@ func overflowFloat32(x float64) bool {
|
|||||||
if x < 0 {
|
if x < 0 {
|
||||||
x = -x
|
x = -x
|
||||||
}
|
}
|
||||||
return math.MaxFloat32 <= x && x <= math.MaxFloat64
|
return math.MaxFloat32 < x && x <= math.MaxFloat64
|
||||||
}
|
}
|
||||||
|
|
||||||
// OverflowInt returns true if the int64 x cannot be represented by v's type.
|
// OverflowInt returns true if the int64 x cannot be represented by v's type.
|
||||||
|
Loading…
Reference in New Issue
Block a user