• egg

## Documentation

Provides access to ISO C math functions in <math.h> that are not defined by the Chicken core. Please refer to your documentation for <math.h> for a description of the various calls.

### Math Functions

O, P2 are integer.

N, N1, N2, M are real.

#### Usage

`(use "mathh")`

#### bessel-yn

[procedure] (bessel-j0 N) -> real
[procedure] (bessel-j1 N) -> real
[procedure] (bessel-jn O N) -> real
[procedure] (bessel-y0 N) -> real
[procedure] (bessel-y1 N) -> real
[procedure] (bessel-yn O N) -> real

#### atanh

[procedure] (cosh N) -> real
[procedure] (sinh N) -> real
[procedure] (tanh N) -> real
[procedure] (acosh N) -> real
[procedure] (asinh N) -> real
[procedure] (atanh N) -> real

#### hypot

[procedure] (hypot N1 N2) -> real

#### lgamma

[procedure] (gamma N) -> real
[procedure] (lgamma N) -> real

#### erfc

[procedure] (erf N) -> real
[procedure] (erfc N) -> real

#### log1p

[procedure] (log10 N) -> real
[procedure] (log2 N) -> real
[procedure] (log1p N) -> real

#### log-with-base

[procedure] (log-with-base N) -> (procedure (real) real)

Returns a monadic function, the logarithm of base N.

#### scalbn

[procedure] (ldexp N P2) -> real
[procedure] (scalbn N P2) -> real

#### cbrt

[procedure] (cbrt N) -> real

#### nextafter

[procedure] (nextafter N M) -> real

Returns the next N in the direction of M.

#### fpmod

[procedure] (fpmod N M) -> real

Returns the modulus of N for M.

#### modf

[procedure] (modf N) -> (values real integer)

Returns two values, the integral and fractional components of N.

#### frexp

[procedure] (frexp N) -> (values real real)

Returns two values, the fraction and the exponent components of N.

#### signbit

[procedure] (signbit N) -> boolean

Returns #t when negative, #f otherwise.

#### copysign

[procedure] (copysign N M) -> real

Returns N with same sign as M.

#### fpclassify

[procedure] (fpclassify N) -> symbol

Returns a symbol denoting the floating-point kind of N.

infinite
nan
normal
subnormal
zero
unclassified

#### fpclass

[procedure] (fpclass N) -> symbol

Returns a symbol denoting the floating-point kind of N.

positive-infinite
negative-infinite
quiet-nan
signaling-nan
positive-normal
negative-normal
positive-subnormal
negative-subnormal
positive-zero
negative-zero
unclassified

### Flonum Utilities

#### Usage

`(require-extension fp-utils)`

N N1 ... X1 ... Y1 ... below are flonum.

P is the precision in decimal digits, an integer.

#### fprandom

[procedure] (fprandom [N]) -> flonum

Returns flonum in [0 -1).

N
fixnum or flonum limit.

#### fpzero?

[procedure] (fpzero? N) -> boolean

#### fppositive?

[procedure] (fppositive? N) -> boolean

Note that -0.0 is not positive, due to (fl<? -0.0 0.0).

#### fpcardinal?

[procedure] (fpcardinal? N) -> boolean

Note that -0.0 is not cardinal, due to (fl<? -0.0 0.0).

#### fpnegative?

[procedure] (fpnegative? N) -> boolean

Note that -0.0 is not negative, due to (fl<? -0.0 0.0).

#### fpeven?

[procedure] (fpeven? N) -> boolean

#### fpodd?

[procedure] (fpodd? N) -> boolean

#### fpclosedr?

[procedure] (fpclosed-right? L N H) -> boolean
[procedure] (fpclosedr? L N H) -> boolean

Returns N in (L .. H].

N, L & H are flonum low & high limits.

#### fpclosed?

Returns N in [L .. H].

[procedure] (fpclosed? L N H) -> boolean

N, L & H are flonum low & high limits.

#### fpclosedl?

Returns N in [L .. H).

[procedure] (fpclosed-left? L N H) -> boolean
[procedure] (fpclosedl? L N H) -> boolean

N, L & H are flonum low & high limits.

#### fpsub1

[procedure] (fpsub1 N) -> flonum

#### fpmodulo

[procedure] (fpmodulo N1 N2) -> flonum

#### fpquotient

[procedure] (fpquotient N1 N2) -> flonum

#### fpremainder

[procedure] (fpremainder N1 N2) -> flonum

#### fpfraction

[procedure] (fpfraction N) -> flonum

#### fptruncate/precision

[procedure] (fptruncate/precision N [P 4]) -> flonum

#### fpround/precision

[procedure] (fpround/precision N [P 4]) -> flonum

#### fpceiling/precision

[procedure] (fpceiling/precision N [P 4]) -> flonum

#### fpfloor/precision

[procedure] (fpfloor/precision N [P 4]) -> flonum

#### fp~=

[procedure] (fp~= N1 N2 [EPS flonum-epsilon]) -> flonum

Compare floating-point values N1 and N2 within some flonum epsilon EPS.

#### fp~<=

[procedure] (fp~<= N) -> boolean

#### fp~>=

[procedure] (fp~>= N) -> boolean

#### fpsqr

[procedure] (fpsqr N) -> flonum

#### fpcub

[procedure] (fpcub N) -> flonum

#### fpdistance

[procedure] (fpdistance X1 Y1 X2 Y2) -> flonum

Pythagorean distance between the points X1 Y1 and X2 Y2.

#### fpdistance*

[procedure] (fpdistance* X1 Y1 X2 Y2) -> flonum

Pythagorean distance, inaccurate but useful for relative comparisons.

#### fpmax-and-min

[procedure] (fpmax-and-min N ...) -> (values flonum flonum)

Returns the maximum & minimum values for the flonums N ....

#### fpprecision-factor

[procedure] (fpprecision-factor P [BASE 10.0]) -> flonum

Returns factor for P decimal digits precision.

### Fixnum Utilities

#### Usage

`(require-extension fx-utils)`

N N1 ... X1 ... Y1 ... below are fixnum.

#### fxrandom

[procedure] (fxrandom [N]) -> fixnum

N fixnum limit.

#### fxzero?

[procedure] (fxzero? N) -> boolean

#### fxpositive?

[procedure] (fxpositive? N) -> boolean

#### fxcardinal?

[procedure] (fxcardinal? N) -> boolean

#### fxnegative?

[procedure] (fxnegative? N) -> boolean

#### fxclosedr?

[procedure] (fxclosed-right? L N H) -> boolean
[procedure] (fxclosedr? L N H) -> boolean

Returns N in (L .. H].

N, L & H are fixnum low & high limits.

#### fxclosed?

Returns N in [L .. H].

[procedure] (fxclosed? L N H) -> boolean

N, L & H are fixnum low & high limits.

#### fxclosedl?

Returns N in [L .. H).

[procedure] (fxclosed-left? L N H) -> boolean
[procedure] (fxclosedl? L N H) -> boolean

N, L & H are fixnum low & high limits.

#### fxsub1

[procedure] (fxsub1 N) -> fixnum

#### fxabs

[procedure] (fxabs N) -> fixnum

#### fxsqr

[procedure] (fxsqr N) -> fixnum

#### fxcub

[procedure] (fxcub N) -> fixnum

#### fxlog2

[procedure] (fxlog2 N) -> fixnum

Returns index of highest bit set, so N is treated as unsigned.

#### fxpow2log2

[procedure] (fxpow2log2 N) -> fixnum

Returns fixnum 2^N.

#### fxdistance

[procedure] (fxdistance X1 Y1 X2 Y2) -> fixnum

Pythagorean distance between the points X1 Y1 and X2 Y2.

#### fxdistance*

[procedure] (fxdistance* X1 Y1 X2 Y2) -> fixnum

Pythagorean distance, inaccurate but useful for relative comparisons.

#### fxmax-and-min

[procedure] (fxmax-and-min N ...) -> (values fixnum fixnum)

Returns the maximum & minimum values for the fixnums N ....

### Math Constants (Module)

#### Usage

`(require-extension mathh-consts)`

#### Constants

These are all flonum.

e
e
1/e
1/e
e^2
e^2
e^pi/4
e^(pi/4)
log2e
log2(e)
log10e
log10(e)
ln2
log(2)
ln3
ln(3)
lnpi
ln(pi)
ln10
log(10)
1/ln2
1/ln(2)
1/ln10
1/ln(10)
pi
pi
pi/2
pi/2
pi/4
pi/4
1/pi
1/pi
2/pi
2/pi
2/sqrtpi
2/sqrt(pi)
sqrtpi
sqrt(pi)
pi^2
pi^2
degree
pi/180
sqrt2
sqrt(2)
1/sqrt2
1/sqrt(2)
sqrt3
sqrt(3)
sqrt5
sqrt(5)
sqrt10
sqrt(10)
cubert2
cubert(2)
cubert3
cubert(3)
4thrt2
fourthrt(2)
gamma1/2
gamma(1/2)
gamma1/3
gamma(1/3)
gamma2/3
gamma(2/3)
phi
phi
lnphi
ln(phi)
1/lnphi
1/ln(phi)
euler
euler
e^euler
e^euler
sin1
sin(1)
cos1
cos(1)
zeta3
theta(3)

### Math Constants (Include)

Common constants, using 'define-constant'. As such they must be textually included.

#### Usage

`(include "mathh-constants")`

E
e
1/E
1/e
E^2
e^2
E^PI/4
e^(pi/4)
LOG2E
log2(e)
LOG10E
log10(e)
LN2
log(2)
LN3
ln(3)
LNPI
ln(pi)
LN10
log(10)
1/LN2
1/ln(2)
1/LN10
1/ln(10)
PI
pi
PI/2
pi/2
PI/4
pi/4
1/PI
1/pi
2/PI
2/pi
2/SQRTPI
2/sqrt(pi)
SQRTPI
sqrt(pi)
PI^2
pi^2
DEGREE
pi/180
SQRT2
sqrt(2)
1/SQRT2
1/sqrt(2)
SQRT3
sqrt(3)
SQRT5
sqrt(5)
SQRT10
sqrt(10)
CUBERT2
cubert(2)
CUBERT3
cubert(3)
4THRT2
fourthrt(2)
GAMMA1/2
gamma(1/2)
GAMMA1/3
gamma(1/3)
GAMMA2/3
gamma(2/3)
PHI
phi
LNPHI
ln(phi)
1/LNPHI
1/ln(phi)
EULER
euler
E^EULER
e^euler
SIN1
sin(1)
COS1
cos(1)
ZETA3
theta(3)

## Notes

• The C library call gamma is deprecated in favor of tgamma but not available yet on some platforms, so we use gamma where necessary.
• Some library calls that are not supplied by the platform have rough implementations supplied. See Bugs and Limitations.
• The general naming convention is to use the C library call name as the Scheme name. But there are exceptions:
fmod
fpmod - fp-utils fpmodulo - should be in Chicken library?
j0
bessel-j0 (Prefixed to distinguish the names from common variables)
j1
bessel-j1
jn
bessel-jn
y0
bessel-y0
y1
bessel-y1
yn
bessel-yn

## Bugs and Limitations

• CHICKEN_INCLUDE_PATH must at least state the value of the (repository-path) to include mathh-constants.scm. Suggest using the module mathh-consts.
• The types integer & real refer to the Chicken "core" concept of a number. Support for the full numeric tower is not provided.
• Windows library calls lgamma, gamma, acosh, asinh, atanh, cbrt & signbit are not provided.
• FreeBSD does not provide the library call log2. A usable log2 is supplied.
• The fpclass quiet-nan is only distinguished on Windows.
• fx-utils.scm & fp-utils.scm belong in own eggs.

## Version history

3.4.2
Fix foreign-declare use. Fix fpzero?, fppositive?, fpnegative?, fpcardinal? again.
3.4.1
Remove unneeded dependency.
3.4.0 ; Fix fppositive?, fpnegative?, fpcardinal?, fpeven?, fpodd?.
3.3.3 ; Remove Windows log2, log1p, erf, erfc, scalbn.
3.3.2 ;
3.3.1 ;
3.3.0 ; Add log-with-base. Deprecate make-log/base. Fix fprandom sign preservation.
3.2.4 ; Add fxlog2, fix fxpow2log2.
3.2.3 ; Fix 4THRT2, 1/LNPHI, extend 1/SQRT2.
3.2.2 ; Remove inline generation for mathh.
3.2.1 ; Add types. Fix signbit & fpclass.
3.2.0 ; Fix fpodd?. Add fx-utils.scm. Extend fp-utils.scm.
3.1.0 ; Added module for mathh-constants.scm.
3.0.0 ; Moved copy of mathh-constants.scm to (chicken-home). Ticket #1327
2.2.6 ; better argvector chicken test
2.2.5 ; argvector chicken support
2.2.4 ;
2.2.3 ; Fix for ticket #630
2.2.2 ; mathh-constants.scm copied to Chicken Repository. Produces shared+static object files.
2.2.1
Better no-install support.
2.2.0
Added acosh, asinh, atanh, erf & erfc. Includes <sunmath.h> on Sun platform for log2.
2.1.0
Added signbit, copysign, nextafter & cbrt.
2.0.0
Chicken 4 release. fpclass and fpclassify are now part of the mathh extension.