Wiki
Download
Manual
Eggs
API
Tests
Bugs
show
edit
history
You can edit this page using
wiki syntax
for markup.
Article contents:
== Outdated egg! This is an egg for CHICKEN 4, the unsupported old release. You're almost certainly looking for [[/eggref/5/mathh|the CHICKEN 5 version of this egg]], if it exists. If it does not exist, there may be equivalent functionality provided by another egg; have a look at the [[https://wiki.call-cc.org/chicken-projects/egg-index-5.html|egg index]]. Otherwise, please consider porting this egg to the current version of CHICKEN. [[tags: egg]] == mathh [[toc:]] == 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 <enscript language=scheme> (use "mathh") </enscript> ==== bessel-j0 ==== bessel-j1 ==== bessel-jn ==== bessel-jn ==== bessel-y0 ==== bessel-y1 ==== bessel-yn <procedure>(bessel-j0 N) -> real</procedure> <procedure>(bessel-j1 N) -> real</procedure> <procedure>(bessel-jn O N) -> real</procedure> <procedure>(bessel-y0 N) -> real</procedure> <procedure>(bessel-y1 N) -> real</procedure> <procedure>(bessel-yn O N) -> real</procedure> ==== cosh ==== sinh ==== tanh ==== acosh ==== asinh ==== atanh <procedure>(cosh N) -> real</procedure> <procedure>(sinh N) -> real</procedure> <procedure>(tanh N) -> real</procedure> <procedure>(acosh N) -> real</procedure> <procedure>(asinh N) -> real</procedure> <procedure>(atanh N) -> real</procedure> ==== hypot <procedure>(hypot N1 N2) -> real</procedure> ==== gamma ==== lgamma <procedure>(gamma N) -> real</procedure> <procedure>(lgamma N) -> real</procedure> ==== erf ==== erfc <procedure>(erf N) -> real</procedure> <procedure>(erfc N) -> real</procedure> ==== log10 ==== log2 ==== log1p <procedure>(log10 N) -> real</procedure> <procedure>(log2 N) -> real</procedure> <procedure>(log1p N) -> real</procedure> ==== log-with-base <procedure>(log-with-base N) -> (procedure (real) real)</procedure> Returns a monadic function, the logarithm of base {{N}}. ==== ldexp ==== scalbn <procedure>(ldexp N P2) -> real</procedure> <procedure>(scalbn N P2) -> real</procedure> ==== cbrt <procedure>(cbrt N) -> real</procedure> ==== nextafter <procedure>(nextafter N M) -> real</procedure> Returns the next {{N}} in the direction of {{M}}. ==== fpmod <procedure>(fpmod N M) -> real</procedure> Returns the modulus of {{N}} for {{M}}. ==== modf <procedure>(modf N) -> (values real integer)</procedure> Returns two values, the integral and fractional components of {{N}}. ==== frexp <procedure>(frexp N) -> (values real real)</procedure> Returns two values, the fraction and the exponent components of {{N}}. ==== signbit <procedure>(signbit N) -> boolean</procedure> Returns {{#t}} when negative, {{#f}} otherwise. ==== copysign <procedure>(copysign N M) -> real</procedure> Returns {{N}} with same sign as {{M}}. ==== fpclassify <procedure>(fpclassify N) -> symbol</procedure> Returns a symbol denoting the floating-point kind of {{N}}. ; infinite : ; nan : ; normal : ; subnormal : ; zero : ; unclassified : ==== fpclass <procedure>(fpclass N) -> symbol</procedure> 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 <enscript language=scheme> (require-extension fp-utils) </enscript> {{N N1 ... X1 ... Y1 ...}} below are {{flonum}}. {{P}} is the precision in decimal digits, an {{integer}}. ==== fprandom <procedure>(fprandom [N]) -> flonum</procedure> Returns {{flonum}} in {{[0 -1)}}. ; {{N}} : {{fixnum}} or {{flonum}} limit. ==== fpzero? <procedure>(fpzero? N) -> boolean</procedure> ==== fppositive? <procedure>(fppositive? N) -> boolean</procedure> Note that {{-0.0}} is '''not''' positive, due to {{(fl<? -0.0 0.0)}}. ==== fpcardinal? <procedure>(fpcardinal? N) -> boolean</procedure> Note that {{-0.0}} is '''not''' cardinal, due to {{(fl<? -0.0 0.0)}}. ==== fpnegative? <procedure>(fpnegative? N) -> boolean</procedure> Note that {{-0.0}} is '''not''' negative, due to {{(fl<? -0.0 0.0)}}. ==== fpeven? <procedure>(fpeven? N) -> boolean</procedure> ==== fpodd? <procedure>(fpodd? N) -> boolean</procedure> ==== fpclosed-right? ==== fpclosedr? <procedure>(fpclosed-right? L N H) -> boolean</procedure> <procedure>(fpclosedr? L N H) -> boolean</procedure> 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</procedure> {{N}}, {{L}} & {{H}} are {{flonum}} low & high limits. ==== fpclosed-left? ==== fpclosedl? Returns {{N}} in {{[L .. H)}}. <procedure>(fpclosed-left? L N H) -> boolean</procedure> <procedure>(fpclosedl? L N H) -> boolean</procedure> {{N}}, {{L}} & {{H}} are {{flonum}} low & high limits. ==== fpadd1 <procedure>(fpadd1 N) -> flonum</procedure> ==== fpsub1 <procedure>(fpsub1 N) -> flonum</procedure> ==== fpmodulo <procedure>(fpmodulo N1 N2) -> flonum</procedure> ==== fpquotient <procedure>(fpquotient N1 N2) -> flonum</procedure> ==== fpremainder <procedure>(fpremainder N1 N2) -> flonum</procedure> ==== fpfraction <procedure>(fpfraction N) -> flonum</procedure> ==== fptruncate/precision <procedure>(fptruncate/precision N [P 4]) -> flonum</procedure> ==== fpround/precision <procedure>(fpround/precision N [P 4]) -> flonum</procedure> ==== fpceiling/precision <procedure>(fpceiling/precision N [P 4]) -> flonum</procedure> ==== fpfloor/precision <procedure>(fpfloor/precision N [P 4]) -> flonum</procedure> ==== fp~= <procedure>(fp~= N1 N2 [EPS flonum-epsilon]) -> flonum</procedure> Compare floating-point values {{N1}} and {{N2}} within some {{flonum}} epsilon {{EPS}}. ==== fp~<= <procedure>(fp~<= N) -> boolean</procedure> ==== fp~>= <procedure>(fp~>= N) -> boolean</procedure> ==== fpsqr <procedure>(fpsqr N) -> flonum</procedure> ==== fpcub <procedure>(fpcub N) -> flonum</procedure> ==== fpdegree->radian <procedure>(fpdegree->radian N) -> flonum</procedure> ==== fpradian->degree <procedure>(fpradian->degree N) -> flonum</procedure> ==== fpdistance <procedure>(fpdistance X1 Y1 X2 Y2) -> flonum</procedure> Pythagorean distance between the points {{X1 Y1}} and {{X2 Y2}}. ==== fpdistance* <procedure>(fpdistance* X1 Y1 X2 Y2) -> flonum</procedure> Pythagorean distance, inaccurate but useful for relative comparisons. ==== fpmax-and-min <procedure>(fpmax-and-min N ...) -> (values flonum flonum)</procedure> Returns the maximum & minimum values for the {{flonum}}s {{N ...}}. ==== fpprecision-factor <procedure>(fpprecision-factor P [BASE 10.0]) -> flonum</procedure> Returns factor for {{P}} decimal digits precision. === Fixnum Utilities ==== Usage <enscript language=scheme> (require-extension fx-utils) </enscript> {{N N1 ... X1 ... Y1 ...}} below are {{fixnum}}. ==== fxrandom <procedure>(fxrandom [N]) -> fixnum</procedure> {{N}} {{fixnum}} limit. ==== fxzero? <procedure>(fxzero? N) -> boolean</procedure> ==== fxpositive? <procedure>(fxpositive? N) -> boolean</procedure> ==== fxcardinal? <procedure>(fxcardinal? N) -> boolean</procedure> ==== fxnegative? <procedure>(fxnegative? N) -> boolean</procedure> ==== fxclosed-right? ==== fxclosedr? <procedure>(fxclosed-right? L N H) -> boolean</procedure> <procedure>(fxclosedr? L N H) -> boolean</procedure> 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</procedure> {{N}}, {{L}} & {{H}} are {{fixnum}} low & high limits. ==== fxclosed-left? ==== fxclosedl? Returns {{N}} in {{[L .. H)}}. <procedure>(fxclosed-left? L N H) -> boolean</procedure> <procedure>(fxclosedl? L N H) -> boolean</procedure> {{N}}, {{L}} & {{H}} are {{fixnum}} low & high limits. ==== fxadd1 <procedure>(fxadd1 N) -> fixnum</procedure> ==== fxsub1 <procedure>(fxsub1 N) -> fixnum</procedure> ==== fxabs <procedure>(fxabs N) -> fixnum</procedure> ==== fxsqr <procedure>(fxsqr N) -> fixnum</procedure> ==== fxcub <procedure>(fxcub N) -> fixnum</procedure> ==== fxlog2 <procedure>(fxlog2 N) -> fixnum</procedure> Returns index of highest bit set, so {{N}} is treated as unsigned. ==== fxpow2log2 <procedure>(fxpow2log2 N) -> fixnum</procedure> Returns {{fixnum}} {{2^N}}. ==== fxdistance <procedure>(fxdistance X1 Y1 X2 Y2) -> fixnum</procedure> Pythagorean distance between the points {{X1 Y1}} and {{X2 Y2}}. ==== fxdistance* <procedure>(fxdistance* X1 Y1 X2 Y2) -> fixnum</procedure> Pythagorean distance, inaccurate but useful for relative comparisons. ==== fxmax-and-min <procedure>(fxmax-and-min N ...) -> (values fixnum fixnum)</procedure> Returns the maximum & minimum values for the {{fixnum}}s {{N ...}}. === Math Constants (Module) ==== Usage <enscript language=scheme> (require-extension mathh-consts) </enscript> ==== 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 <enscript language=scheme> (include "mathh-constants") </enscript> ==== 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. == Author [[/users/kon-lovett|Kon Lovett]] [[/users/john cowan|John Cowan]] == 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. == License This code is in the public domain.
Description of your changes:
I would like to authenticate
Authentication
Username:
Password:
Spam control
What do you get when you add 23 to 17?