Home | History | Annotate | Download | only in fixedbugs
      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 }
     72