| // 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. |
| |
| //go:generate go run gen.go -output table.go |
| |
| // Package f32 implements some linear algebra and GL helpers for float32s. |
| // |
| // Types defined in this package have methods implementing common |
| // mathematical operations. The common form for these functions is |
| // |
| // func (dst *T) Op(lhs, rhs *T) |
| // |
| // which reads in traditional mathematical notation as |
| // |
| // dst = lhs op rhs. |
| // |
| // It is safe to use the destination address as the left-hand side, |
| // that is, dst *= rhs is dst.Mul(dst, rhs). |
| // |
| // WARNING |
| // |
| // The interface to this package is not stable. It will change considerably. |
| // Only use functions that provide package documentation. Semantics are |
| // non-obvious. Be prepared for the package name to change. |
| package f32 // import "golang.org/x/mobile/exp/f32" |
| |
| import ( |
| "encoding/binary" |
| "fmt" |
| "math" |
| ) |
| |
| type Radian float32 |
| |
| func Cos(x float32) float32 { |
| const n = sinTableLen |
| i := uint32(int32(x * (n / math.Pi))) |
| i += n / 2 |
| i &= 2*n - 1 |
| if i >= n { |
| return -sinTable[i&(n-1)] |
| } |
| return sinTable[i&(n-1)] |
| } |
| |
| func Sin(x float32) float32 { |
| const n = sinTableLen |
| i := uint32(int32(x * (n / math.Pi))) |
| i &= 2*n - 1 |
| if i >= n { |
| return -sinTable[i&(n-1)] |
| } |
| return sinTable[i&(n-1)] |
| } |
| |
| func Sqrt(x float32) float32 { |
| return float32(math.Sqrt(float64(x))) // TODO(crawshaw): implement |
| } |
| |
| func Tan(x float32) float32 { |
| return float32(math.Tan(float64(x))) // TODO(crawshaw): fast version |
| } |
| |
| // Bytes returns the byte representation of float32 values in the given byte |
| // order. byteOrder must be either binary.BigEndian or binary.LittleEndian. |
| func Bytes(byteOrder binary.ByteOrder, values ...float32) []byte { |
| le := false |
| switch byteOrder { |
| case binary.BigEndian: |
| case binary.LittleEndian: |
| le = true |
| default: |
| panic(fmt.Sprintf("invalid byte order %v", byteOrder)) |
| } |
| |
| b := make([]byte, 4*len(values)) |
| for i, v := range values { |
| u := math.Float32bits(v) |
| if le { |
| b[4*i+0] = byte(u >> 0) |
| b[4*i+1] = byte(u >> 8) |
| b[4*i+2] = byte(u >> 16) |
| b[4*i+3] = byte(u >> 24) |
| } else { |
| b[4*i+0] = byte(u >> 24) |
| b[4*i+1] = byte(u >> 16) |
| b[4*i+2] = byte(u >> 8) |
| b[4*i+3] = byte(u >> 0) |
| } |
| } |
| return b |
| } |