Home | History | Annotate | Download | only in ken
      1 // run
      2 
      3 // Copyright 2010 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 // Test complex numbers,including fmt support.
      8 // Used to crash.
      9 
     10 package main
     11 
     12 import "fmt"
     13 
     14 const (
     15 	R = 5
     16 	I = 6i
     17 
     18 	C1 = R + I // ADD(5,6)
     19 )
     20 
     21 func want(s, w string) {
     22 	if s != w {
     23 		panic(s + " != " + w)
     24 	}
     25 }
     26 
     27 func doprint(c complex128, w string) {
     28 	s := fmt.Sprintf("%f", c)
     29 	want(s, w)
     30 }
     31 
     32 func main() {
     33 
     34 	// constants
     35 	s := fmt.Sprintf("%f", -C1)
     36 	want(s, "(-5.000000-6.000000i)")
     37 	doprint(C1, "(5.000000+6.000000i)")
     38 
     39 	// variables
     40 	c1 := C1
     41 	s = fmt.Sprintf("%f", c1)
     42 	want(s, "(5.000000+6.000000i)")
     43 	doprint(c1, "(5.000000+6.000000i)")
     44 
     45 	// 128
     46 	c2 := complex128(C1)
     47 	s = fmt.Sprintf("%G", c2)
     48 	want(s, "(5+6i)")
     49 
     50 	// real, imag, complex
     51 	c3 := complex(real(c2)+3, imag(c2)-5) + c2
     52 	s = fmt.Sprintf("%G", c3)
     53 	want(s, "(13+7i)")
     54 
     55 	// compiler used to crash on nested divide
     56 	c4 := complex(real(c3/2), imag(c3/2))
     57 	if c4 != c3/2 {
     58 		fmt.Printf("BUG: c3 = %G != c4 = %G\n", c3, c4)
     59 		panic(0)
     60 	}
     61 }
     62