MySQL  8.0.16
Source Code Documentation
decimal.h
Go to the documentation of this file.
1 /* Copyright (c) 2000, 2018, Oracle and/or its affiliates. All rights reserved.
2 
3  This program is free software; you can redistribute it and/or modify
4  it under the terms of the GNU General Public License, version 2.0,
5  as published by the Free Software Foundation.
6 
7  This program is also distributed with certain software (including
8  but not limited to OpenSSL) that is licensed under separate terms,
9  as designated in a particular file or component or in included license
10  documentation. The authors of MySQL hereby grant you an additional
11  permission to link the program and your derivative works with the
12  separately licensed software that they have included with MySQL.
13 
14  This program is distributed in the hope that it will be useful,
15  but WITHOUT ANY WARRANTY; without even the implied warranty of
16  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
17  GNU General Public License, version 2.0, for more details.
18 
19  You should have received a copy of the GNU General Public License
20  along with this program; if not, write to the Free Software
21  Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA */
22 
23 #ifndef DECIMAL_INCLUDED
24 #define DECIMAL_INCLUDED
25 
26 #ifndef MYSQL_ABI_CHECK
27 #include <stdlib.h>
28 #endif
29 
30 #include "my_inttypes.h"
31 #include "my_macros.h"
32 
33 typedef enum {
34  TRUNCATE = 0,
40 typedef int32 decimal_digit_t;
41 
42 /**
43  intg is the number of *decimal* digits (NOT number of decimal_digit_t's !)
44  before the point
45  frac is the number of decimal digits after the point
46  len is the length of buf (length of allocated space) in decimal_digit_t's,
47  not in bytes
48  sign false means positive, true means negative
49  buf is an array of decimal_digit_t's
50  */
51 struct decimal_t {
52  int intg, frac, len;
53  bool sign;
55 };
56 
57 #ifndef MYSQL_ABI_CHECK
58 void widen_fraction(int new_frac, decimal_t *d);
59 int string2decimal(const char *from, decimal_t *to, const char **end);
60 int decimal2string(const decimal_t *from, char *to, int *to_len,
61  int fixed_precision, int fixed_decimals, char filler);
62 int decimal2ulonglong(decimal_t *from, ulonglong *to);
64 int decimal2longlong(decimal_t *from, longlong *to);
65 int longlong2decimal(longlong from, decimal_t *to);
66 int decimal2double(const decimal_t *from, double *to);
67 int double2decimal(double from, decimal_t *to);
68 int decimal_actual_fraction(const decimal_t *from);
69 int decimal2bin(decimal_t *from, uchar *to, int precision, int scale);
70 int bin2decimal(const uchar *from, decimal_t *to, int precision, int scale);
71 
72 /**
73  Convert decimal to lldiv_t.
74  The integer part is stored in to->quot.
75  The fractional part is multiplied to 10^9 and stored to to->rem.
76  @param from Decimal value
77  @param [out] to lldiv_t value
78  @retval 0 on success
79  @retval !0 in error
80 */
81 int decimal2lldiv_t(const decimal_t *from, lldiv_t *to);
82 
83 /**
84  Convert doube to lldiv_t.
85  The integer part is stored in to->quot.
86  The fractional part is multiplied to 10^9 and stored to to->rem.
87  @param nr Decimal value
88  @param [out] lld lldiv_t value
89  @retval 0 on success
90  @retval !0 in error
91 */
92 
93 int double2lldiv_t(double nr, lldiv_t *lld);
94 int decimal_size(int precision, int scale);
95 int decimal_bin_size(int precision, int scale);
96 int decimal_result_size(decimal_t *from1, decimal_t *from2, char op, int param);
97 
98 int decimal_intg(const decimal_t *from);
99 int decimal_add(const decimal_t *from1, const decimal_t *from2, decimal_t *to);
100 int decimal_sub(const decimal_t *from1, const decimal_t *from2, decimal_t *to);
101 int decimal_cmp(const decimal_t *from1, const decimal_t *from2);
102 int decimal_mul(const decimal_t *from1, const decimal_t *from2, decimal_t *to);
103 int decimal_div(const decimal_t *from1, const decimal_t *from2, decimal_t *to,
104  int scale_incr);
105 int decimal_mod(const decimal_t *from1, const decimal_t *from2, decimal_t *to);
106 int decimal_round(const decimal_t *from, decimal_t *to, int new_scale,
107  decimal_round_mode mode);
108 int decimal_is_zero(const decimal_t *from);
109 void max_decimal(int precision, int frac, decimal_t *to);
110 int decimal_shift(decimal_t *dec, int shift);
111 
112 /* set a decimal_t to zero */
113 static inline void decimal_make_zero(decimal_t *dec) {
114  dec->buf[0] = 0;
115  dec->intg = 1;
116  dec->frac = 0;
117  dec->sign = 0;
118 }
119 
120 /**
121  Returns the length of the buffer to hold string representation
122  of the decimal (including decimal dot, possible sign and \0)
123 */
124 static inline int decimal_string_size(const decimal_t *dec) {
125  return (dec->intg ? dec->intg : 1) + dec->frac + (dec->frac > 0) + 2;
126 }
127 
128  /*
129  conventions:
130 
131  decimal_smth() == 0 -- everything's ok
132  decimal_smth() <= 1 -- result is usable, but precision loss is
133  possible decimal_smth() <= 2 -- result can be unusable, most significant
134  digits could've been lost decimal_smth() > 2 -- no result was generated
135  */
136 
137 #define E_DEC_OK 0
138 #define E_DEC_TRUNCATED 1
139 #define E_DEC_OVERFLOW 2
140 #define E_DEC_DIV_ZERO 4
141 #define E_DEC_BAD_NUM 8
142 #define E_DEC_OOM 16
143 
144 #define E_DEC_ERROR 31
145 #define E_DEC_FATAL_ERROR 30
146 
147 #endif // MYSQL_ABI_CHECK
148 
149 #endif // DECIMAL_INCLUDED
Some common macros.
unsigned long long int ulonglong
Definition: my_inttypes.h:69
unsigned char uchar
Definition: my_inttypes.h:49
int intg
Definition: decimal.h:52
int decimal_shift(decimal_t *dec, int shift)
Definition: decimal.cc:697
int decimal_result_size(decimal_t *from1, decimal_t *from2, char op, int param)
Definition: decimal.cc:1814
int double2decimal(double from, decimal_t *to)
Definition: decimal.cc:1041
decimal_digit_t * buf
Definition: decimal.h:54
decimal_round_mode
Definition: decimal.h:33
void widen_fraction(int new_frac, decimal_t *d)
Add zeros behind comma to increase precision of decimal.
Definition: decimal.cc:985
Some integer typedefs for easier portability.
void max_decimal(int precision, int frac, decimal_t *to)
Definition: decimal.cc:392
int decimal_cmp(const decimal_t *from1, const decimal_t *from2)
Definition: decimal.cc:2037
int bin2decimal(const uchar *from, decimal_t *to, int precision, int scale)
Definition: decimal.cc:1442
int decimal2string(const decimal_t *from, char *to, int *to_len, int fixed_precision, int fixed_decimals, char filler)
Definition: decimal.cc:479
int frac
Definition: decimal.h:52
Definition: decimal.h:35
int decimal2lldiv_t(const decimal_t *from, lldiv_t *to)
Convert decimal to lldiv_t.
Definition: decimal.cc:1171
Definition: decimal.h:38
int32 decimal_digit_t
Definition: decimal.h:40
int decimal_mul(const decimal_t *from1, const decimal_t *from2, decimal_t *to)
Definition: decimal.cc:2076
int longlong2decimal(longlong from, decimal_t *to)
Definition: decimal.cc:1087
int decimal_mod(const decimal_t *from1, const decimal_t *from2, decimal_t *to)
Definition: decimal.cc:2503
int decimal_actual_fraction(const decimal_t *from)
Definition: decimal.cc:438
int decimal2double(const decimal_t *from, double *to)
Definition: decimal.cc:1012
int decimal_bin_size(int precision, int scale)
Definition: decimal.cc:1586
int decimal_div(const decimal_t *from1, const decimal_t *from2, decimal_t *to, int scale_incr)
Definition: decimal.cc:2471
Cursor end()
A past-the-end Cursor.
Definition: rules_table_service.cc:191
int decimal_add(const decimal_t *from1, const decimal_t *from2, decimal_t *to)
Definition: decimal.cc:2027
int decimal_round(const decimal_t *from, decimal_t *to, int new_scale, decimal_round_mode mode)
Definition: decimal.cc:1608
long long int longlong
Definition: my_inttypes.h:70
int decimal2longlong(decimal_t *from, longlong *to)
Definition: decimal.cc:1118
Definition: decimal.h:36
static void decimal_make_zero(decimal_t *dec)
Definition: decimal.h:113
int decimal_is_zero(const decimal_t *from)
Definition: decimal.cc:2047
int double2lldiv_t(double nr, lldiv_t *lld)
Convert doube to lldiv_t.
Definition: decimal.cc:1204
int decimal2ulonglong(decimal_t *from, ulonglong *to)
Definition: decimal.cc:1094
int decimal_sub(const decimal_t *from1, const decimal_t *from2, decimal_t *to)
Definition: decimal.cc:2032
int string2decimal(const char *from, decimal_t *to, const char **end)
Definition: decimal.cc:872
int decimal2bin(decimal_t *from, uchar *to, int precision, int scale)
Definition: decimal.cc:1311
Definition: decimal.h:34
int ulonglong2decimal(ulonglong from, decimal_t *to)
Definition: decimal.cc:1082
int decimal_size(int precision, int scale)
Definition: decimal.cc:1561
bool sign
Definition: decimal.h:53
intg is the number of decimal digits (NOT number of decimal_digit_t&#39;s !) before the point frac is the...
Definition: decimal.h:51
int len
Definition: decimal.h:52
static int decimal_string_size(const decimal_t *dec)
Returns the length of the buffer to hold string representation of the decimal (including decimal dot...
Definition: decimal.h:124
int decimal_intg(const decimal_t *from)
Definition: decimal.cc:2021
Definition: decimal.h:37