/
sysmath.c
138 lines (114 loc) · 2.27 KB
/
sysmath.c
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
/* math.c - these are based on bob smith's csharp routines */
#define __USE_ISOC99
#include <math.h>
#include <mono/metadata/sysmath.h>
#ifndef NAN
# if G_BYTE_ORDER == G_BIG_ENDIAN
# define __nan_bytes { 0x7f, 0xc0, 0, 0 }
# endif
# if G_BYTE_ORDER == G_LITTLE_ENDIAN
# define __nan_bytes { 0, 0, 0xc0, 0x7f }
# endif
static union { unsigned char __c[4]; float __d; } __nan_union = { __nan_bytes };
# define NAN (__nan_union.__d)
#endif
#ifndef HUGE_VAL
#define __huge_val_t union { unsigned char __c[8]; double __d; }
# if G_BYTE_ORDER == G_BIG_ENDIAN
# define __HUGE_VAL_bytes { 0x7f, 0xf0, 0, 0, 0, 0, 0, 0 }
# endif
# if G_BYTE_ORDER == G_LITTLE_ENDIAN
# define __HUGE_VAL_bytes { 0, 0, 0, 0, 0, 0, 0xf0, 0x7f }
# endif
static __huge_val_t __huge_val = { __HUGE_VAL_bytes };
# define HUGE_VAL (__huge_val.__d)
#endif
gdouble
ves_icall_System_Math_Sin (gdouble x)
{
return sin (x);
}
gdouble
ves_icall_System_Math_Cos (gdouble x)
{
return cos (x);
}
gdouble
ves_icall_System_Math_Tan (gdouble x)
{
return tan (x);
}
gdouble
ves_icall_System_Math_Sinh (gdouble x)
{
return sinh (x);
}
gdouble
ves_icall_System_Math_Cosh (gdouble x)
{
return cosh (x);
}
gdouble
ves_icall_System_Math_Tanh (gdouble x)
{
return tanh (x);
}
gdouble
ves_icall_System_Math_Acos (gdouble x)
{
if (x < -1 || x > 1)
return NAN;
return acos (x);
}
gdouble
ves_icall_System_Math_Asin (gdouble x)
{
if (x < -1 || x > 1)
return NAN;
return asin (x);
}
gdouble
ves_icall_System_Math_Atan (gdouble x)
{
return atan (x);
}
gdouble
ves_icall_System_Math_Atan2 (gdouble y, gdouble x)
{
return atan2 (y, x);
}
gdouble
ves_icall_System_Math_Exp (gdouble x)
{
return exp (x);
}
gdouble
ves_icall_System_Math_Log (gdouble x)
{
if (x == 0)
return -HUGE_VAL;
else if (x < 0)
return NAN;
return log (x);
}
gdouble
ves_icall_System_Math_Log10 (gdouble x)
{
if (x == 0)
return -HUGE_VAL;
else if (x < 0)
return NAN;
return log10 (x);
}
gdouble
ves_icall_System_Math_Pow (gdouble x, gdouble y)
{
return pow (x, y);
}
gdouble
ves_icall_System_Math_Sqrt (gdouble x)
{
if (x < 0)
return NAN;
return sqrt (x);
}