Skip to content

Commit

Permalink
feat(stdlibs): add math and math/bits (#1153)
Browse files Browse the repository at this point in the history
Co-authored-by: Antonio Navarro Perez <[email protected]>
  • Loading branch information
thehowl and ajnavarro authored Nov 23, 2023
1 parent becc4eb commit 899a156
Show file tree
Hide file tree
Showing 54 changed files with 10,999 additions and 209 deletions.
4 changes: 2 additions & 2 deletions docs/reference/go-gno-compatibility.md
Original file line number Diff line number Diff line change
Expand Up @@ -194,9 +194,9 @@ Legend:
| log/slog | `tbd` |
| log/syslog | `nondet` |
| maps | `gnics` |
| math | `part` |
| math | `full` |
| math/big | `tbd` |
| math/bits | `todo` |
| math/bits | `full` |
| math/cmplx | `tbd` |
| math/rand | `todo` |
| mime | `tbd` |
Expand Down
6 changes: 1 addition & 5 deletions gnovm/stdlibs/math/abs.gno
Original file line number Diff line number Diff line change
Expand Up @@ -4,16 +4,12 @@

package math

import (
imath "internal/math" // XXX
)

// Abs returns the absolute value of x.
//
// Special cases are:
//
// Abs(±Inf) = +Inf
// Abs(NaN) = NaN
func Abs(x float64) float64 {
return imath.Float64frombits(imath.Float64bits(x) &^ (1 << 63))
return Float64frombits(Float64bits(x) &^ (1 << 63))
}
62 changes: 62 additions & 0 deletions gnovm/stdlibs/math/acosh.gno
Original file line number Diff line number Diff line change
@@ -0,0 +1,62 @@
// Copyright 2010 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 math

// The original C code, the long comment, and the constants
// below are from FreeBSD's /usr/src/lib/msun/src/e_acosh.c
// and came with this notice. The go code is a simplified
// version of the original C.
//
// ====================================================
// Copyright (C) 1993 by Sun Microsystems, Inc. All rights reserved.
//
// Developed at SunPro, a Sun Microsystems, Inc. business.
// Permission to use, copy, modify, and distribute this
// software is freely granted, provided that this notice
// is preserved.
// ====================================================
//
//
// __ieee754_acosh(x)
// Method :
// Based on
// acosh(x) = log [ x + sqrt(x*x-1) ]
// we have
// acosh(x) := log(x)+ln2, if x is large; else
// acosh(x) := log(2x-1/(sqrt(x*x-1)+x)) if x>2; else
// acosh(x) := log1p(t+sqrt(2.0*t+t*t)); where t=x-1.
//
// Special cases:
// acosh(x) is NaN with signal if x<1.
// acosh(NaN) is NaN without signal.
//

// Acosh returns the inverse hyperbolic cosine of x.
//
// Special cases are:
//
// Acosh(+Inf) = +Inf
// Acosh(x) = NaN if x < 1
// Acosh(NaN) = NaN
func Acosh(x float64) float64 {
return acosh(x)
}

func acosh(x float64) float64 {
const Large = 1 << 28 // 2**28
// first case is special case
switch {
case x < 1 || IsNaN(x):
return NaN()
case x == 1:
return 0
case x >= Large:
return Log(x) + Ln2 // x > 2**28
case x > 2:
return Log(2*x - 1/(x+Sqrt(x*x-1))) // 2**28 > x > 2
}
t := x - 1
return Log1p(t + Sqrt(2*t+t*t)) // 2 >= x > 1
}
Loading

0 comments on commit 899a156

Please sign in to comment.