xref: /plan9-contrib/sys/src/cmd/hoc/math.c (revision 3e12c5d1bb89fc02707907988834ef147769ddaf)
1*3e12c5d1SDavid du Colombier #include <u.h>
2*3e12c5d1SDavid du Colombier #include <libc.h>
3*3e12c5d1SDavid du Colombier 
4*3e12c5d1SDavid du Colombier #include "hoc.h"
5*3e12c5d1SDavid du Colombier 
6*3e12c5d1SDavid du Colombier double	errcheck(double, char*);
7*3e12c5d1SDavid du Colombier 
8*3e12c5d1SDavid du Colombier double
9*3e12c5d1SDavid du Colombier Log(double x)
10*3e12c5d1SDavid du Colombier {
11*3e12c5d1SDavid du Colombier 	return errcheck(log(x), "log");
12*3e12c5d1SDavid du Colombier }
13*3e12c5d1SDavid du Colombier double
14*3e12c5d1SDavid du Colombier Log10(double x)
15*3e12c5d1SDavid du Colombier {
16*3e12c5d1SDavid du Colombier 	return errcheck(log10(x), "log10");
17*3e12c5d1SDavid du Colombier }
18*3e12c5d1SDavid du Colombier 
19*3e12c5d1SDavid du Colombier double
20*3e12c5d1SDavid du Colombier Sqrt(double x)
21*3e12c5d1SDavid du Colombier {
22*3e12c5d1SDavid du Colombier 	return errcheck(sqrt(x), "sqrt");
23*3e12c5d1SDavid du Colombier }
24*3e12c5d1SDavid du Colombier 
25*3e12c5d1SDavid du Colombier double
26*3e12c5d1SDavid du Colombier Gamma(double x)
27*3e12c5d1SDavid du Colombier {
28*3e12c5d1SDavid du Colombier 	double y;
29*3e12c5d1SDavid du Colombier 	extern int signgam;
30*3e12c5d1SDavid du Colombier 	y=errcheck(gamma(x), "gamma");
31*3e12c5d1SDavid du Colombier 	if(y>88.0)
32*3e12c5d1SDavid du Colombier 		execerror("gamma result out of range", (char *)0);
33*3e12c5d1SDavid du Colombier 	return signgam*exp(y);
34*3e12c5d1SDavid du Colombier }
35*3e12c5d1SDavid du Colombier 
36*3e12c5d1SDavid du Colombier double
37*3e12c5d1SDavid du Colombier Exp(double x)
38*3e12c5d1SDavid du Colombier {
39*3e12c5d1SDavid du Colombier 	return errcheck(exp(x), "exp");
40*3e12c5d1SDavid du Colombier }
41*3e12c5d1SDavid du Colombier 
42*3e12c5d1SDavid du Colombier double
43*3e12c5d1SDavid du Colombier Asin(double x)
44*3e12c5d1SDavid du Colombier {
45*3e12c5d1SDavid du Colombier 	return errcheck(asin(x), "asin");
46*3e12c5d1SDavid du Colombier }
47*3e12c5d1SDavid du Colombier 
48*3e12c5d1SDavid du Colombier double
49*3e12c5d1SDavid du Colombier Acos(double x)
50*3e12c5d1SDavid du Colombier {
51*3e12c5d1SDavid du Colombier 	return errcheck(acos(x), "acos");
52*3e12c5d1SDavid du Colombier }
53*3e12c5d1SDavid du Colombier 
54*3e12c5d1SDavid du Colombier double
55*3e12c5d1SDavid du Colombier Sinh(double x)
56*3e12c5d1SDavid du Colombier {
57*3e12c5d1SDavid du Colombier 	return errcheck(sinh(x), "sinh");
58*3e12c5d1SDavid du Colombier }
59*3e12c5d1SDavid du Colombier double
60*3e12c5d1SDavid du Colombier Cosh(double x)
61*3e12c5d1SDavid du Colombier {
62*3e12c5d1SDavid du Colombier 	return errcheck(cosh(x), "cosh");
63*3e12c5d1SDavid du Colombier }
64*3e12c5d1SDavid du Colombier double
65*3e12c5d1SDavid du Colombier Pow(double x, double y)
66*3e12c5d1SDavid du Colombier {
67*3e12c5d1SDavid du Colombier 	return errcheck(pow(x,y), "exponentiation");
68*3e12c5d1SDavid du Colombier }
69*3e12c5d1SDavid du Colombier 
70*3e12c5d1SDavid du Colombier double
71*3e12c5d1SDavid du Colombier integer(double x)
72*3e12c5d1SDavid du Colombier {
73*3e12c5d1SDavid du Colombier 	return (double)(long)x;
74*3e12c5d1SDavid du Colombier }
75*3e12c5d1SDavid du Colombier 
76*3e12c5d1SDavid du Colombier double
77*3e12c5d1SDavid du Colombier errcheck(double d, char* s)	/* check result of library call */
78*3e12c5d1SDavid du Colombier {
79*3e12c5d1SDavid du Colombier 	if(isNaN(d))
80*3e12c5d1SDavid du Colombier 		execerror(s, "argument out of domain");
81*3e12c5d1SDavid du Colombier 	if(isInf(d, 0))
82*3e12c5d1SDavid du Colombier 		execerror(s, "result out of range");
83*3e12c5d1SDavid du Colombier 	return d;
84*3e12c5d1SDavid du Colombier }
85