mirror of
https://github.com/MariaDB/server.git
synced 2025-01-18 13:02:28 +01:00
218e00ac68
Lots of small fixes to multi-precision-math path Give Note for '123.4e' Added helper functions type 'val_string_from_real() Don't give warnings for end space for string2decimal() Changed storage of values for SP so that we can detect length of argument without strlen() Changed interface for str2dec() so that we must supple the pointer to the last character in the buffer
104 lines
3.8 KiB
C
104 lines
3.8 KiB
C
/* Copyright (C) 2000 MySQL AB
|
|
|
|
This program is free software; you can redistribute it and/or modify
|
|
it under the terms of the GNU General Public License as published by
|
|
the Free Software Foundation; either version 2 of the License, or
|
|
(at your option) any later version.
|
|
|
|
This program is distributed in the hope that it will be useful,
|
|
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
GNU General Public License for more details.
|
|
|
|
You should have received a copy of the GNU General Public License
|
|
along with this program; if not, write to the Free Software
|
|
Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA */
|
|
|
|
#ifndef _decimal_h
|
|
#define _decimal_h
|
|
|
|
typedef enum
|
|
{TRUNCATE=0, HALF_EVEN, HALF_UP, CEILING, FLOOR}
|
|
decimal_round_mode;
|
|
typedef int32 decimal_digit;
|
|
|
|
typedef struct st_decimal {
|
|
int intg, frac, len;
|
|
my_bool sign;
|
|
decimal_digit *buf;
|
|
} decimal;
|
|
|
|
int internal_str2dec(const char *from, decimal *to, char **end, my_bool fixed);
|
|
int decimal2string(decimal *from, char *to, int *to_len,
|
|
int fixed_precision, int fixed_decimals,
|
|
char filler);
|
|
int decimal2ulonglong(decimal *from, ulonglong *to);
|
|
int ulonglong2decimal(ulonglong from, decimal *to);
|
|
int decimal2longlong(decimal *from, longlong *to);
|
|
int longlong2decimal(longlong from, decimal *to);
|
|
int decimal2double(decimal *from, double *to);
|
|
int double2decimal(double from, decimal *to);
|
|
void decimal_optimize_fraction(decimal *from);
|
|
int decimal2bin(decimal *from, char *to, int precision, int scale);
|
|
int bin2decimal(char *from, decimal *to, int precision, int scale);
|
|
|
|
int decimal_size(int precision, int scale);
|
|
int decimal_bin_size(int precision, int scale);
|
|
int decimal_result_size(decimal *from1, decimal *from2, char op, int param);
|
|
|
|
int decimal_add(decimal *from1, decimal *from2, decimal *to);
|
|
int decimal_sub(decimal *from1, decimal *from2, decimal *to);
|
|
int decimal_cmp(decimal *from1, decimal *from2);
|
|
int decimal_mul(decimal *from1, decimal *from2, decimal *to);
|
|
int decimal_div(decimal *from1, decimal *from2, decimal *to, int scale_incr);
|
|
int decimal_mod(decimal *from1, decimal *from2, decimal *to);
|
|
int decimal_round(decimal *from, decimal *to, int new_scale,
|
|
decimal_round_mode mode);
|
|
int decimal_is_zero(decimal *from);
|
|
void max_decimal(int precision, int frac, decimal *to);
|
|
|
|
#define string2decimal(A,B,C) internal_str2dec((A), (B), (C), 0)
|
|
#define string2decimal_fixed(A,B,C) internal_str2dec((A), (B), (C), 1)
|
|
|
|
/* set a decimal to zero */
|
|
|
|
#define decimal_make_zero(dec) do { \
|
|
(dec)->buf[0]=0; \
|
|
(dec)->intg=1; \
|
|
(dec)->frac=0; \
|
|
(dec)->sign=0; \
|
|
} while(0)
|
|
|
|
/*
|
|
returns the length of the buffer to hold string representation
|
|
of the decimal (including decimal dot, possible sign and \0)
|
|
*/
|
|
|
|
#define decimal_string_size(dec) (((dec)->intg ? (dec)->intg : 1) + \
|
|
(dec)->frac + ((dec)->frac > 0) + 2)
|
|
|
|
/* negate a decimal */
|
|
#define decimal_neg(dec) do { (dec)->sign^=1; } while(0)
|
|
|
|
/*
|
|
conventions:
|
|
|
|
decimal_smth() == 0 -- everything's ok
|
|
decimal_smth() <= 1 -- result is usable, but precision loss is possible
|
|
decimal_smth() <= 2 -- result can be unusable, most significant digits
|
|
could've been lost
|
|
decimal_smth() > 2 -- no result was generated
|
|
*/
|
|
|
|
#define E_DEC_OK 0
|
|
#define E_DEC_TRUNCATED 1
|
|
#define E_DEC_OVERFLOW 2
|
|
#define E_DEC_DIV_ZERO 4
|
|
#define E_DEC_BAD_NUM 8
|
|
#define E_DEC_OOM 16
|
|
|
|
#define E_DEC_ERROR 31
|
|
#define E_DEC_FATAL_ERROR 30
|
|
|
|
#endif
|
|
|