]> Cypherpunks.ru repositories - gostls13.git/blobdiff - test/float_lit3.go
cmd/compile/internal/inline: score call sites exposed by inlines
[gostls13.git] / test / float_lit3.go
index f045c40cf223a0262d6cb19ca0fee82a4da17481..37a1289fb9dd21a22e1b10961e8e94d815e9cbb4 100644 (file)
@@ -2,27 +2,46 @@
 
 // Check flagging of invalid conversion of constant to float32/float64 near min/max boundaries.
 
-// Copyright 2014 The Go Authors.  All rights reserved.
+// Copyright 2014 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
 
+// See float_lit2.go for motivation for these values.
+const (
+       two24   = 1.0 * (1 << 24)
+       two53   = 1.0 * (1 << 53)
+       two64   = 1.0 * (1 << 64)
+       two128  = two64 * two64
+       two256  = two128 * two128
+       two512  = two256 * two256
+       two768  = two512 * two256
+       two1024 = two512 * two512
+
+       ulp32 = two128 / two24
+       max32 = two128 - ulp32
+
+       ulp64 = two1024 / two53
+       max64 = two1024 - ulp64
+)
+
 var x = []interface{}{
-       float32(-340282356779733661637539395458142568448), // ERROR "constant -3\.40282e\+38 overflows float32"
-       float32(-340282356779733661637539395458142568447),
-       float32(-340282326356119256160033759537265639424),
-       float32(340282326356119256160033759537265639424),
-       float32(340282356779733661637539395458142568447),
-       float32(340282356779733661637539395458142568448), // ERROR "constant 3\.40282e\+38 overflows float32"
-       -1e1000, // ERROR "constant -1\.00000e\+1000 overflows float64"
-       float64(-1.797693134862315907937289714053e+308), // ERROR "constant -1\.79769e\+308 overflows float64"
-       float64(-1.797693134862315807937289714053e+308),
-       float64(-1.797693134862315708145274237317e+308),
-       float64(-1.797693134862315608353258760581e+308),
-       float64(1.797693134862315608353258760581e+308),
-       float64(1.797693134862315708145274237317e+308),
-       float64(1.797693134862315807937289714053e+308),
-       float64(1.797693134862315907937289714053e+308), // ERROR "constant 1\.79769e\+308 overflows float64"
-       1e1000, // ERROR "constant 1\.00000e\+1000 overflows float64"
+       float32(max32 + ulp32/2 - 1),             // ok
+       float32(max32 + ulp32/2 - two128/two256), // ok
+       float32(max32 + ulp32/2),                 // ERROR "constant 3\.40282e\+38 overflows float32|cannot convert.*to type float32"
+
+       float32(-max32 - ulp32/2 + 1),             // ok
+       float32(-max32 - ulp32/2 + two128/two256), // ok
+       float32(-max32 - ulp32/2),                 // ERROR "constant -3\.40282e\+38 overflows float32|cannot convert.*to type float32"
+
+       // If the compiler's internal floating point representation
+       // is shorter than 1024 bits, it cannot distinguish max64+ulp64/2-1 and max64+ulp64/2.
+       float64(max64 + ulp64/2 - two1024/two256), // ok
+       float64(max64 + ulp64/2 - 1),              // ok
+       float64(max64 + ulp64/2),                  // ERROR "constant 1\.79769e\+308 overflows float64|cannot convert.*to type float64"
+
+       float64(-max64 - ulp64/2 + two1024/two256), // ok
+       float64(-max64 - ulp64/2 + 1),              // ok
+       float64(-max64 - ulp64/2),                  // ERROR "constant -1\.79769e\+308 overflows float64|cannot convert.*to type float64"
 }