1
2 /*
3 * M_APM - mapmcnst.c
4 *
5 * Copyright (C) 1999 - 2007 Michael C. Ring
6 *
7 * Permission to use, copy, and distribute this software and its
8 * documentation for any purpose with or without fee is hereby granted,
9 * provided that the above copyright notice appear in all copies and
10 * that both that copyright notice and this permission notice appear
11 * in supporting documentation.
12 *
13 * Permission to modify the software is granted. Permission to distribute
14 * the modified code is granted. Modifications are to be distributed by
15 * using the file 'license.txt' as a template to modify the file header.
16 * 'license.txt' is available in the official MAPM distribution.
17 *
18 * This software is provided "as is" without express or implied warranty.
19 */
20
21 /*
22 * $Id: mapmcnst.c,v 1.24 2007/12/03 01:51:16 mike Exp $
23 *
24 * This file contains declarations and initializes the constants
25 * used throughout the library.
26 *
27 * $Log: mapmcnst.c,v $
28 * Revision 1.24 2007/12/03 01:51:16 mike
29 * Update license
30 *
31 * Revision 1.23 2003/05/06 21:28:53 mike
32 * add lib version functions
33 *
34 * Revision 1.22 2003/03/30 21:14:16 mike
35 * add local copies of log(2) and log(10)
36 *
37 * Revision 1.21 2002/11/03 22:45:29 mike
38 * Updated function parameters to use the modern style
39 *
40 * Revision 1.20 2002/05/17 22:40:25 mike
41 * call m_apm_init from cpp_precision to init the library
42 * if it hasn't been done yet.
43 *
44 * Revision 1.19 2001/07/16 19:40:12 mike
45 * add function M_free_all_cnst
46 *
47 * Revision 1.18 2001/02/07 19:17:58 mike
48 * eliminate MM_skip_limit_PI_check
49 *
50 * Revision 1.17 2000/05/19 16:31:02 mike
51 * add local copies for PI variables
52 *
53 * Revision 1.16 2000/05/04 23:52:03 mike
54 * added new constant, 256R.
55 * renamed _008 to _125R
56 *
57 * Revision 1.15 2000/04/11 18:44:21 mike
58 * no longer need the constant 'Fifteen'
59 *
60 * Revision 1.14 2000/04/05 20:12:53 mike
61 * add C++ min precision function
62 *
63 * Revision 1.13 1999/07/09 22:47:48 mike
64 * add skip limit PI check
65 *
66 * Revision 1.12 1999/07/08 23:34:50 mike
67 * change constant
68 *
69 * Revision 1.11 1999/07/08 22:58:08 mike
70 * add new constant
71 *
72 * Revision 1.10 1999/06/23 01:09:53 mike
73 * added new constant 15
74 *
75 * Revision 1.9 1999/06/20 23:32:30 mike
76 * added new constants
77 *
78 * Revision 1.8 1999/06/20 19:24:14 mike
79 * delete constants no longer needed
80 *
81 * Revision 1.7 1999/06/20 18:57:29 mike
82 * fixed missing init for new constants
83 *
84 * Revision 1.6 1999/06/20 18:53:44 mike
85 * added more constants
86 *
87 * Revision 1.5 1999/05/31 23:50:30 mike
88 * delete constants no longer needed
89 *
90 * Revision 1.4 1999/05/14 19:50:22 mike
91 * added more constants with more digits
92 *
93 * Revision 1.3 1999/05/12 20:53:08 mike
94 * added more constants
95 *
96 * Revision 1.2 1999/05/10 21:52:24 mike
97 * added some comments
98 *
99 * Revision 1.1 1999/05/10 20:56:31 mike
100 * Initial revision
101 */
102
103 #include "m_apm_lc.h"
104
105 int MM_lc_PI_digits = 0;
106 int MM_lc_log_digits;
107 int MM_cpp_min_precision; /* only used in C++ wrapper */
108
109 M_APM MM_Zero = NULL;
110 M_APM MM_One = NULL;
111 M_APM MM_Two = NULL;
112 M_APM MM_Three = NULL;
113 M_APM MM_Four = NULL;
114 M_APM MM_Five = NULL;
115 M_APM MM_Ten = NULL;
116 M_APM MM_0_5 = NULL;
117 M_APM MM_E = NULL;
118 M_APM MM_PI = NULL;
119 M_APM MM_HALF_PI = NULL;
120 M_APM MM_2_PI = NULL;
121 M_APM MM_lc_PI = NULL;
122 M_APM MM_lc_HALF_PI = NULL;
123 M_APM MM_lc_2_PI = NULL;
124 M_APM MM_lc_log2 = NULL;
125 M_APM MM_lc_log10 = NULL;
126 M_APM MM_lc_log10R = NULL;
127 M_APM MM_0_85 = NULL;
128 M_APM MM_5x_125R = NULL;
129 M_APM MM_5x_64R = NULL;
130 M_APM MM_5x_256R = NULL;
131 M_APM MM_5x_Eight = NULL;
132 M_APM MM_5x_Sixteen = NULL;
133 M_APM MM_5x_Twenty = NULL;
134 M_APM MM_LOG_E_BASE_10 = NULL;
135 M_APM MM_LOG_10_BASE_E = NULL;
136 M_APM MM_LOG_2_BASE_E = NULL;
137 M_APM MM_LOG_3_BASE_E = NULL;
138
139
140 static char MM_cnst_PI[] =
141 "3.1415926535897932384626433832795028841971693993751058209749445923078\
142 1640628620899862803482534211706798214808651328230664709384460955";
143
144 static char MM_cnst_E[] =
145 "2.7182818284590452353602874713526624977572470936999595749669676277240\
146 76630353547594571382178525166427427466391932003059921817413596629";
147
148 static char MM_cnst_log_2[] =
149 "0.6931471805599453094172321214581765680755001343602552541206800094933\
150 93621969694715605863326996418687542001481020570685733685520235758";
151
152 static char MM_cnst_log_3[] =
153 "1.0986122886681096913952452369225257046474905578227494517346943336374\
154 9429321860896687361575481373208878797002906595786574236800422593";
155
156 static char MM_cnst_log_10[] =
157 "2.3025850929940456840179914546843642076011014886287729760333279009675\
158 7260967735248023599720508959829834196778404228624863340952546508";
159
160 static char MM_cnst_1_log_10[] =
161 "0.4342944819032518276511289189166050822943970058036665661144537831658\
162 64649208870774729224949338431748318706106744766303733641679287159";
163
164 /*
165 * the following constants have ~520 digits each, if needed
166 */
167
168 /*
169 static char MM_cnst_PI[] =
170 "3.1415926535897932384626433832795028841971693993751058209749445923078\
171 164062862089986280348253421170679821480865132823066470938446095505822\
172 317253594081284811174502841027019385211055596446229489549303819644288\
173 109756659334461284756482337867831652712019091456485669234603486104543\
174 266482133936072602491412737245870066063155881748815209209628292540917\
175 153643678925903600113305305488204665213841469519415116094330572703657\
176 595919530921861173819326117931051185480744623799627495673518857527248\
177 91227938183011949129833673362440656643";
178
179 static char MM_cnst_E[] =
180 "2.7182818284590452353602874713526624977572470936999595749669676277240\
181 766303535475945713821785251664274274663919320030599218174135966290435\
182 729003342952605956307381323286279434907632338298807531952510190115738\
183 341879307021540891499348841675092447614606680822648001684774118537423\
184 454424371075390777449920695517027618386062613313845830007520449338265\
185 602976067371132007093287091274437470472306969772093101416928368190255\
186 151086574637721112523897844250569536967707854499699679468644549059879\
187 3163688923009879312773617821542499923";
188
189 static char MM_cnst_log_2[] =
190 "0.6931471805599453094172321214581765680755001343602552541206800094933\
191 936219696947156058633269964186875420014810205706857336855202357581305\
192 570326707516350759619307275708283714351903070386238916734711233501153\
193 644979552391204751726815749320651555247341395258829504530070953263666\
194 426541042391578149520437404303855008019441706416715186447128399681717\
195 845469570262716310645461502572074024816377733896385506952606683411372\
196 738737229289564935470257626520988596932019650585547647033067936544325\
197 47632744951250406069438147104689946506";
198
199 static char MM_cnst_log_3[] =
200 "1.0986122886681096913952452369225257046474905578227494517346943336374\
201 942932186089668736157548137320887879700290659578657423680042259305198\
202 210528018707672774106031627691833813671793736988443609599037425703167\
203 959115211455919177506713470549401667755802222031702529468975606901065\
204 215056428681380363173732985777823669916547921318181490200301038236301\
205 222486527481982259910974524908964580534670088459650857484441190188570\
206 876474948670796130858294116021661211840014098255143919487688936798494\
207 3022557315353296853452952514592138765";
208
209 static char MM_cnst_log_10[] =
210 "2.3025850929940456840179914546843642076011014886287729760333279009675\
211 726096773524802359972050895982983419677840422862486334095254650828067\
212 566662873690987816894829072083255546808437998948262331985283935053089\
213 653777326288461633662222876982198867465436674744042432743651550489343\
214 149393914796194044002221051017141748003688084012647080685567743216228\
215 355220114804663715659121373450747856947683463616792101806445070648000\
216 277502684916746550586856935673420670581136429224554405758925724208241\
217 31469568901675894025677631135691929203";
218
219 static char MM_cnst_1_log_10[] =
220 "0.4342944819032518276511289189166050822943970058036665661144537831658\
221 646492088707747292249493384317483187061067447663037336416792871589639\
222 065692210646628122658521270865686703295933708696588266883311636077384\
223 905142844348666768646586085135561482123487653435434357317253835622281\
224 395603048646652366095539377356176323431916710991411597894962993512457\
225 934926357655469077671082419150479910989674900103277537653570270087328\
226 550951731440674697951899513594088040423931518868108402544654089797029\
227 86328682876262414401345704354613292060";
228 */
229
230
231 /****************************************************************************/
m_apm_lib_version(char * v)232 char *m_apm_lib_version(char *v)
233 {
234 strcpy(v, MAPM_LIB_VERSION);
235 return(v);
236 }
237 /****************************************************************************/
m_apm_lib_short_version(char * v)238 char *m_apm_lib_short_version(char *v)
239 {
240 strcpy(v, MAPM_LIB_SHORT_VERSION);
241 return(v);
242 }
243 /****************************************************************************/
M_free_all_cnst()244 void M_free_all_cnst()
245 {
246 if (MM_lc_PI_digits != 0)
247 {
248 m_apm_free(MM_Zero);
249 m_apm_free(MM_One);
250 m_apm_free(MM_Two);
251 m_apm_free(MM_Three);
252 m_apm_free(MM_Four);
253 m_apm_free(MM_Five);
254 m_apm_free(MM_Ten);
255 m_apm_free(MM_0_5);
256 m_apm_free(MM_LOG_2_BASE_E);
257 m_apm_free(MM_LOG_3_BASE_E);
258 m_apm_free(MM_E);
259 m_apm_free(MM_PI);
260 m_apm_free(MM_HALF_PI);
261 m_apm_free(MM_2_PI);
262 m_apm_free(MM_lc_PI);
263 m_apm_free(MM_lc_HALF_PI);
264 m_apm_free(MM_lc_2_PI);
265 m_apm_free(MM_lc_log2);
266 m_apm_free(MM_lc_log10);
267 m_apm_free(MM_lc_log10R);
268 m_apm_free(MM_0_85);
269 m_apm_free(MM_5x_125R);
270 m_apm_free(MM_5x_64R);
271 m_apm_free(MM_5x_256R);
272 m_apm_free(MM_5x_Eight);
273 m_apm_free(MM_5x_Sixteen);
274 m_apm_free(MM_5x_Twenty);
275 m_apm_free(MM_LOG_E_BASE_10);
276 m_apm_free(MM_LOG_10_BASE_E);
277
278 MM_lc_PI_digits = 0;
279 }
280 }
281 /****************************************************************************/
M_init_trig_globals()282 void M_init_trig_globals()
283 {
284 MM_lc_PI_digits = VALID_DECIMAL_PLACES;
285 MM_lc_log_digits = VALID_DECIMAL_PLACES;
286 MM_cpp_min_precision = 30;
287
288 MM_Zero = m_apm_init();
289 MM_One = m_apm_init();
290 MM_Two = m_apm_init();
291 MM_Three = m_apm_init();
292 MM_Four = m_apm_init();
293 MM_Five = m_apm_init();
294 MM_Ten = m_apm_init();
295 MM_0_5 = m_apm_init();
296 MM_LOG_2_BASE_E = m_apm_init();
297 MM_LOG_3_BASE_E = m_apm_init();
298 MM_E = m_apm_init();
299 MM_PI = m_apm_init();
300 MM_HALF_PI = m_apm_init();
301 MM_2_PI = m_apm_init();
302 MM_lc_PI = m_apm_init();
303 MM_lc_HALF_PI = m_apm_init();
304 MM_lc_2_PI = m_apm_init();
305 MM_lc_log2 = m_apm_init();
306 MM_lc_log10 = m_apm_init();
307 MM_lc_log10R = m_apm_init();
308 MM_0_85 = m_apm_init();
309 MM_5x_125R = m_apm_init();
310 MM_5x_64R = m_apm_init();
311 MM_5x_256R = m_apm_init();
312 MM_5x_Eight = m_apm_init();
313 MM_5x_Sixteen = m_apm_init();
314 MM_5x_Twenty = m_apm_init();
315 MM_LOG_E_BASE_10 = m_apm_init();
316 MM_LOG_10_BASE_E = m_apm_init();
317
318 m_apm_set_string(MM_One, "1");
319 m_apm_set_string(MM_Two, "2");
320 m_apm_set_string(MM_Three, "3");
321 m_apm_set_string(MM_Four, "4");
322 m_apm_set_string(MM_Five, "5");
323 m_apm_set_string(MM_Ten, "10");
324 m_apm_set_string(MM_0_5, "0.5");
325 m_apm_set_string(MM_0_85, "0.85");
326
327 m_apm_set_string(MM_5x_125R, "8.0E-3");
328 m_apm_set_string(MM_5x_64R, "1.5625E-2");
329 m_apm_set_string(MM_5x_256R, "3.90625E-3");
330 m_apm_set_string(MM_5x_Eight, "8");
331 m_apm_set_string(MM_5x_Sixteen, "16");
332 m_apm_set_string(MM_5x_Twenty, "20");
333
334 m_apm_set_string(MM_LOG_2_BASE_E, MM_cnst_log_2);
335 m_apm_set_string(MM_LOG_3_BASE_E, MM_cnst_log_3);
336 m_apm_set_string(MM_LOG_10_BASE_E, MM_cnst_log_10);
337 m_apm_set_string(MM_LOG_E_BASE_10, MM_cnst_1_log_10);
338
339 m_apm_set_string(MM_lc_log2, MM_cnst_log_2);
340 m_apm_set_string(MM_lc_log10, MM_cnst_log_10);
341 m_apm_set_string(MM_lc_log10R, MM_cnst_1_log_10);
342
343 m_apm_set_string(MM_E, MM_cnst_E);
344 m_apm_set_string(MM_PI, MM_cnst_PI);
345 m_apm_multiply(MM_HALF_PI, MM_PI, MM_0_5);
346 m_apm_multiply(MM_2_PI, MM_PI, MM_Two);
347
348 m_apm_copy(MM_lc_PI, MM_PI);
349 m_apm_copy(MM_lc_HALF_PI, MM_HALF_PI);
350 m_apm_copy(MM_lc_2_PI, MM_2_PI);
351 }
352 /****************************************************************************/
m_apm_cpp_precision(int digits)353 void m_apm_cpp_precision(int digits)
354 {
355 if (MM_lc_PI_digits == 0)
356 {
357 m_apm_free(m_apm_init());
358 }
359
360 if (digits >= 2)
361 MM_cpp_min_precision = digits;
362 else
363 MM_cpp_min_precision = 2;
364 }
365 /****************************************************************************/
366