modernc.org/gc@v1.0.1-0.20240304020402-f0dba7c97c2b/testdata/errchk/test/fixedbugs/issue14651.go (about) 1 // run 2 3 // Copyright 2016 The Go Authors. All rights reserved. 4 // Use of this source code is governed by a BSD-style 5 // license that can be found in the LICENSE file. 6 7 // This test checks if the compiler's internal constant 8 // arithmetic correctly rounds up floating-point values 9 // that become the smallest denormal value. 10 // 11 // See also related issue 14553 and test issue14553.go. 12 13 package main 14 15 import ( 16 "fmt" 17 "math" 18 ) 19 20 const ( 21 p149 = 1.0 / (1 << 149) // 1p-149 22 p500 = 1.0 / (1 << 500) // 1p-500 23 p1074 = p500 * p500 / (1<<74) // 1p-1074 24 ) 25 26 const ( 27 m0000p149 = 0x0 / 16.0 * p149 // = 0.0000p-149 28 m1000p149 = 0x8 / 16.0 * p149 // = 0.1000p-149 29 m1001p149 = 0x9 / 16.0 * p149 // = 0.1001p-149 30 m1011p149 = 0xb / 16.0 * p149 // = 0.1011p-149 31 m1100p149 = 0xc / 16.0 * p149 // = 0.1100p-149 32 33 m0000p1074 = 0x0 / 16.0 * p1074 // = 0.0000p-1074 34 m1000p1074 = 0x8 / 16.0 * p1074 // = 0.1000p-1074 35 m1001p1074 = 0x9 / 16.0 * p1074 // = 0.1001p-1074 36 m1011p1074 = 0xb / 16.0 * p1074 // = 0.1011p-1074 37 m1100p1074 = 0xc / 16.0 * p1074 // = 0.1100p-1074 38 ) 39 40 func main() { 41 test32(float32(m0000p149), f32(m0000p149)) 42 test32(float32(m1000p149), f32(m1000p149)) 43 test32(float32(m1001p149), f32(m1001p149)) 44 test32(float32(m1011p149), f32(m1011p149)) 45 test32(float32(m1100p149), f32(m1100p149)) 46 47 test64(float64(m0000p1074), f64(m0000p1074)) 48 test64(float64(m1000p1074), f64(m1000p1074)) 49 test64(float64(m1001p1074), f64(m1001p1074)) 50 test64(float64(m1011p1074), f64(m1011p1074)) 51 test64(float64(m1100p1074), f64(m1100p1074)) 52 } 53 54 func f32(x float64) float32 { return float32(x) } 55 func f64(x float64) float64 { return float64(x) } 56 57 func test32(a, b float32) { 58 abits := math.Float32bits(a) 59 bbits := math.Float32bits(b) 60 if abits != bbits { 61 panic(fmt.Sprintf("%08x != %08x\n", abits, bbits)) 62 } 63 } 64 65 func test64(a, b float64) { 66 abits := math.Float64bits(a) 67 bbits := math.Float64bits(b) 68 if abits != bbits { 69 panic(fmt.Sprintf("%016x != %016x\n", abits, bbits)) 70 } 71 }