php-internal-docs 8.4.8
Unofficial docs for php/php-src
Loading...
Searching...
No Matches
bcmath.h
Go to the documentation of this file.
1/* bcmath.h: bcmath library header. */
2/*
3 Copyright (C) 1991, 1992, 1993, 1994, 1997 Free Software Foundation, Inc.
4 Copyright (C) 2000 Philip A. Nelson
5
6 This library is free software; you can redistribute it and/or
7 modify it under the terms of the GNU Lesser General Public
8 License as published by the Free Software Foundation; either
9 version 2 of the License, or (at your option) any later version.
10
11 This library 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 GNU
14 Lesser General Public License for more details. (LICENSE)
15
16 You should have received a copy of the GNU Lesser General Public
17 License along with this library; if not, write to:
18
19 The Free Software Foundation, Inc.
20 59 Temple Place, Suite 330
21 Boston, MA 02111-1307 USA.
22
23 You may contact the author by:
24 e-mail: philnelson@acm.org
25 us-mail: Philip A. Nelson
26 Computer Science Department, 9062
27 Western Washington University
28 Bellingham, WA 98226-9062
29
30*************************************************************************/
31
32#ifndef _BCMATH_H_
33#define _BCMATH_H_
34
35#include <stddef.h>
36
37typedef enum {PLUS, MINUS} sign;
38
39typedef struct bc_struct *bc_num;
40
41typedef struct bc_struct {
42 size_t n_len; /* The number of digits before the decimal point. */
43 size_t n_scale; /* The number of digits after the decimal point. */
44 char *n_value; /* The number. Not zero char terminated. */
45 unsigned int n_refs; /* The number of pointers to this number. */
48
49#ifdef HAVE_CONFIG_H
50#include "config.h"
51#endif
52
53#include "zend.h"
54#include <stdbool.h>
55#include "zend_string.h"
56
57/* Needed for BCG() macro and PHP_ROUND_XXX */
58#include "../../php_bcmath.h"
59
60/* The base used in storing the numbers in n_value above.
61 Currently, this MUST be 10. */
62
63#define BASE 10
64
65/* Some useful macros and constants. */
66
67#define CH_VAL(c) (c - '0')
68#define BCD_CHAR(d) (d + '0')
69
70#ifdef MIN
71#undef MIN
72#undef MAX
73#endif
74#define MAX(a, b) ((a)>(b)?(a):(b))
75#define MIN(a, b) ((a)>(b)?(b):(a))
76
77#ifndef LONG_MAX
78#define LONG_MAX 0x7fffffff
79#endif
80
81
82/* Function Prototypes */
83
84void bc_init_numbers(void);
85
87
88bc_num _bc_new_num_ex(size_t length, size_t scale, bool persistent);
89
90bc_num _bc_new_num_nonzeroed_ex(size_t length, size_t scale, bool persistent);
91
92void _bc_free_num_ex(bc_num *num, bool persistent);
93
94/* Make a copy of a number! Just increments the reference count! */
95static inline bc_num bc_copy_num(bc_num num)
96{
97 num->n_refs++;
98 return num;
99}
100
101void bc_init_num(bc_num *num);
102
103bool bc_str2num(bc_num *num, const char *str, const char *end, size_t scale, size_t *full_scale, bool auto_scale);
104
106
107zend_string *bc_num2str_ex(bc_num num, size_t scale);
108
109void bc_int2num(bc_num *num, int val);
110
111long bc_num2long(bc_num num);
112
118
119bcmath_compare_result bc_compare(bc_num n1, bc_num n2, size_t scale);
120
121bool bc_is_zero(bc_num num);
122
123bool bc_is_zero_for_scale(bc_num num, size_t scale);
124
125bool bc_is_near_zero(bc_num num, size_t scale);
126
127bool bc_is_neg(bc_num num);
128
130
131bc_num bc_add(bc_num n1, bc_num n2, size_t scale_min);
132
133#define bc_add_ex(n1, n2, result, scale_min) do { \
134 bc_num add_ex = bc_add(n1, n2, scale_min); \
135 bc_free_num (result); \
136 *(result) = add_ex; \
137} while (0)
138
139bc_num bc_sub(bc_num n1, bc_num n2, size_t scale_min);
140
141#define bc_sub_ex(n1, n2, result, scale_min) do { \
142 bc_num sub_ex = bc_sub(n1, n2, scale_min); \
143 bc_free_num (result); \
144 *(result) = sub_ex; \
145} while (0)
146
147bc_num bc_multiply(bc_num n1, bc_num n2, size_t scale);
148
149#define bc_multiply_ex(n1, n2, result, scale_min) do { \
150 bc_num mul_ex = bc_multiply(n1, n2, scale_min); \
151 bc_free_num (result); \
152 *(result) = mul_ex; \
153} while (0)
154
155bc_num bc_square(bc_num n1, size_t scale);
156
157bool bc_divide(bc_num n1, bc_num n2, bc_num *quot, size_t scale);
158
159bool bc_modulo(bc_num num1, bc_num num2, bc_num *resul, size_t scale);
160
161bool bc_divmod(bc_num num1, bc_num num2, bc_num *quo, bc_num *rem, size_t scale);
162
163bc_num bc_floor_or_ceil(bc_num num, bool is_floor);
164
165void bc_round(bc_num num, zend_long places, zend_long mode, bc_num *result);
166
175
176raise_mod_status bc_raisemod(bc_num base, bc_num exponent, bc_num mod, bc_num *result, size_t scale);
177
178bool bc_raise(bc_num base, long exponent, bc_num *result, size_t scale);
179
180void bc_raise_bc_exponent(bc_num base, bc_num exponent, bc_num *resul, size_t scale);
181
182bool bc_sqrt(bc_num *num, size_t scale);
183
184/* Prototypes needed for external utility routines. */
185#define bc_new_num(length, scale) _bc_new_num_ex((length), (scale), 0)
186#define bc_new_num_nonzeroed(length, scale) _bc_new_num_nonzeroed_ex((length), (scale), 0)
187#define bc_free_num(num) _bc_free_num_ex((num), 0)
188#define bc_num2str(num) bc_num2str_ex((num), (num->n_scale))
189
190#endif
bool bc_str2num(bc_num *num, const char *str, const char *end, size_t scale, size_t *full_scale, bool auto_scale)
Definition str2num.c:109
bc_num _bc_new_num_nonzeroed_ex(size_t length, size_t scale, bool persistent)
Definition init.c:69
bool bc_modulo(bc_num num1, bc_num num2, bc_num *resul, size_t scale)
Definition divmod.c:86
bool bc_is_zero_for_scale(bc_num num, size_t scale)
Definition zero.c:38
void bc_rm_trailing_zeros(bc_num num)
Definition rmzero.c:48
bc_num _bc_new_num_ex(size_t length, size_t scale, bool persistent)
Definition init.c:62
void bc_init_num(bc_num *num)
Definition init.c:108
bool bc_sqrt(bc_num *num, size_t scale)
Definition sqrt.c:39
bc_num bc_square(bc_num n1, size_t scale)
Definition recmul.c:271
bool bc_is_neg(bc_num num)
Definition neg.c:36
long bc_num2long(bc_num num)
Definition num2long.c:40
bc_num bc_multiply(bc_num n1, bc_num n2, size_t scale)
Definition recmul.c:243
bc_num bc_long2num(zend_long lval)
Definition long2num.c:23
raise_mod_status
Definition bcmath.h:167
@ MOD_HAS_FRACTIONAL
Definition bcmath.h:172
@ OK
Definition bcmath.h:168
@ BASE_HAS_FRACTIONAL
Definition bcmath.h:169
@ EXPO_HAS_FRACTIONAL
Definition bcmath.h:170
@ EXPO_IS_NEGATIVE
Definition bcmath.h:171
@ MOD_IS_ZERO
Definition bcmath.h:173
bool bc_divmod(bc_num num1, bc_num num2, bc_num *quo, bc_num *rem, size_t scale)
Definition divmod.c:44
bool bc_is_zero(bc_num num)
Definition zero.c:58
bool bc_divide(bc_num n1, bc_num n2, bc_num *quot, size_t scale)
Definition div.c:331
struct bc_struct * bc_num
Definition bcmath.h:39
bc_num bc_add(bc_num n1, bc_num n2, size_t scale_min)
Definition add.c:42
bc_num bc_floor_or_ceil(bc_num num, bool is_floor)
void bc_raise_bc_exponent(bc_num base, bc_num exponent, bc_num *resul, size_t scale)
Definition raise.c:111
void bc_force_free_number(bc_num *num)
Definition init.c:100
sign
Definition bcmath.h:37
@ PLUS
Definition bcmath.h:37
@ MINUS
Definition bcmath.h:37
bc_num bc_sub(bc_num n1, bc_num n2, size_t scale_min)
Definition sub.c:42
void bc_int2num(bc_num *num, int val)
Definition int2num.c:36
bcmath_compare_result
Definition bcmath.h:113
@ BCMATH_EQUAL
Definition bcmath.h:114
@ BCMATH_RIGHT_GREATER
Definition bcmath.h:116
@ BCMATH_LEFT_GREATER
Definition bcmath.h:115
void bc_round(bc_num num, zend_long places, zend_long mode, bc_num *result)
Definition round.c:21
void bc_init_numbers(void)
Definition init.c:91
void _bc_free_num_ex(bc_num *num, bool persistent)
Definition init.c:76
raise_mod_status bc_raisemod(bc_num base, bc_num exponent, bc_num mod, bc_num *result, size_t scale)
Definition raisemod.c:37
bool bc_raise(bc_num base, long exponent, bc_num *result, size_t scale)
Definition raise.c:46
bcmath_compare_result bc_compare(bc_num n1, bc_num n2, size_t scale)
Definition compare.c:154
zend_string * bc_num2str_ex(bc_num num, size_t scale)
Definition num2str.c:37
bool bc_is_near_zero(bc_num num, size_t scale)
Definition nearzero.c:40
zval * val
Definition ffi.c:4262
ffi persistent
Definition ffi.c:3633
char * mode
unsigned const char * end
Definition php_ffi.h:51
sign n_sign
Definition bcmath.h:46
size_t n_len
Definition bcmath.h:42
unsigned int n_refs
Definition bcmath.h:45
size_t n_scale
Definition bcmath.h:43
char * n_value
Definition bcmath.h:44
int32_t zend_long
Definition zend_long.h:42
struct _zend_string zend_string
bool result