// Copyright 2009 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

/*
	Floating-point hyperbolic sine and cosine.

	The exponential func is called for arguments
	greater in magnitude than 0.5.

	A series is used for arguments smaller in magnitude than 0.5.

	Cosh(x) is computed from the exponential func for
	all arguments.
*/

// Sinh returns the hyperbolic sine of x.
//
// Special cases are:
//
//	Sinh(±0) = ±0
//	Sinh(±Inf) = ±Inf
//	Sinh(NaN) = NaN
func ( float64) float64 {
	if haveArchSinh {
		return archSinh()
	}
	return sinh()
}

func sinh( float64) float64 {
	// The coefficients are #2029 from Hart & Cheney. (20.36D)
	const (
		 = -0.6307673640497716991184787251e+6
		 = -0.8991272022039509355398013511e+5
		 = -0.2894211355989563807284660366e+4
		 = -0.2630563213397497062819489e+2
		 = -0.6307673640497716991212077277e+6
		 = 0.1521517378790019070696485176e+5
		 = -0.173678953558233699533450911e+3
	)

	 := false
	if  < 0 {
		 = -
		 = true
	}

	var  float64
	switch {
	case  > 21:
		 = Exp() * 0.5

	case  > 0.5:
		 := Exp()
		 = ( - 1/) * 0.5

	default:
		 :=  * 
		 = (((*+)*+)* + ) * 
		 =  / (((+)*+)* + )
	}

	if  {
		 = -
	}
	return 
}

// Cosh returns the hyperbolic cosine of x.
//
// Special cases are:
//
//	Cosh(±0) = 1
//	Cosh(±Inf) = +Inf
//	Cosh(NaN) = NaN
func ( float64) float64 {
	if haveArchCosh {
		return archCosh()
	}
	return cosh()
}

func cosh( float64) float64 {
	 = Abs()
	if  > 21 {
		return Exp() * 0.5
	}
	 := Exp()
	return ( + 1/) * 0.5
}