1 /* $Id$ */
2 /*
3  * Copyright (C) 2008-2011 Teluu Inc. (http://www.teluu.com)
4  * Copyright (C) 2003-2008 Benny Prijono <benny@prijono.org>
5  *
6  * This program is free software; you can redistribute it and/or modify
7  * it under the terms of the GNU General Public License as published by
8  * the Free Software Foundation; either version 2 of the License, or
9  * (at your option) any later version.
10  *
11  * This program is distributed in the hope that it will be useful,
12  * but WITHOUT ANY WARRANTY; without even the implied warranty of
13  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
14  * GNU General Public License for more details.
15  *
16  * You should have received a copy of the GNU General Public License
17  * along with this program; if not, write to the Free Software
18  * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
19  */
20 #ifndef __PJ_COMPAT_HIGH_PRECISION_H__
21 #define __PJ_COMPAT_HIGH_PRECISION_H__
22 
23 
24 #if defined(PJ_HAS_FLOATING_POINT) && PJ_HAS_FLOATING_POINT != 0
25     /*
26      * The first choice for high precision math is to use double.
27      */
28 #   include <math.h>
29     typedef double pj_highprec_t;
30 
31 #   define PJ_HIGHPREC_VALUE_IS_ZERO(a)     (a==0)
32 #   define pj_highprec_mod(a,b)             (a=fmod(a,b))
33 
34 #elif defined(PJ_HAS_INT64) && PJ_HAS_INT64 != 0
35     /*
36      * Next choice is to use 64-bit arithmatics.
37      */
38     typedef pj_int64_t pj_highprec_t;
39 
40 #else
41 #   warning "High precision math is not available"
42 
43     /*
44      * Last, fallback to 32-bit arithmetics.
45      */
46     typedef pj_int32_t pj_highprec_t;
47 
48 #endif
49 
50 /**
51  * @def pj_highprec_mul
52  * pj_highprec_mul(a1, a2) - High Precision Multiplication
53  * Multiply a1 and a2, and store the result in a1.
54  */
55 #ifndef pj_highprec_mul
56 #   define pj_highprec_mul(a1,a2)   (a1 = a1 * a2)
57 #endif
58 
59 /**
60  * @def pj_highprec_div
61  * pj_highprec_div(a1, a2) - High Precision Division
62  * Divide a2 from a1, and store the result in a1.
63  */
64 #ifndef pj_highprec_div
65 #   define pj_highprec_div(a1,a2)   (a1 = a1 / a2)
66 #endif
67 
68 /**
69  * @def pj_highprec_mod
70  * pj_highprec_mod(a1, a2) - High Precision Modulus
71  * Get the modulus a2 from a1, and store the result in a1.
72  */
73 #ifndef pj_highprec_mod
74 #   define pj_highprec_mod(a1,a2)   (a1 = a1 % a2)
75 #endif
76 
77 
78 /**
79  * @def PJ_HIGHPREC_VALUE_IS_ZERO(a)
80  * Test if the specified high precision value is zero.
81  */
82 #ifndef PJ_HIGHPREC_VALUE_IS_ZERO
83 #   define PJ_HIGHPREC_VALUE_IS_ZERO(a)     (a==0)
84 #endif
85 
86 
87 #endif	/* __PJ_COMPAT_HIGH_PRECISION_H__ */
88 
89