File numeric_opfunc.c¶
FileList > cubrid > src > query > numeric_opfunc.c
Go to the source code of this file
#include <float.h>#include <math.h>#include <assert.h>#include <stdio.h>#include <string.h>#include <cstdint>#include "mprec.h"#include "numeric_opfunc.h"#include "tz_support.h"#include "db_date.h"#include "memory_alloc.h"#include "system_parameter.h"#include "byte_order.h"#include "object_primitive.h"#include "object_representation.h"#include <cmath>#include "dbtype.h"#include "memory_wrapper.hpp"
Public Types¶
| Type | Name |
|---|---|
| typedef enum fp_value_type | FP_VALUE_TYPE |
| enum | fp_value_type |
| enum | numeric_magnitude_t |
Public Static Attributes¶
| Type | Name |
|---|---|
| uint32_t | _gv_digits4_ascii_lut |
| const uint64_t | _gv_mul_normalize_pow10_lookup = /* multi line expression */ |
| const int | _gv_numeric_precision_to_bytes_lookup = /* multi line expression */ |
| const double | numeric_Pow_of_10 = /* multi line expression */ |
| uint64_t | powers_of_10 |
Public Functions¶
Public Static Functions¶
Macros¶
| Type | Name |
|---|---|
| define | BORROW_NEXT (minuend, subtrahend, borrow) (([**unsigned**](broker__monitor_8c.md#function-timeout))([**minuend**](broker__monitor_8c.md#function-timeout)) < ([**unsigned**](broker__monitor_8c.md#function-timeout))(([**subtrahend**](broker__monitor_8c.md#function-timeout)) + ([**borrow**](broker__monitor_8c.md#function-timeout)))) |
| define | CARRYOVER (arg) ((arg) >> 8) |
| define | DB_LONG_NUMERIC_MULTIPLIER 2 |
| define | GET_LOWER_BYTE (arg) ((arg) & 0xff) |
| define | NUMERIC_ABS (a) (([**a**](broker__monitor_8c.md#function-timeout)) >= 0 ? [**a**](broker__monitor_8c.md#function-timeout) : -[**a**](broker__monitor_8c.md#function-timeout)) |
| define | NUMERIC_AS_WORDS (3) /\* ([**DB\_NUMERIC\_BUF\_SIZE**](dbtype__def_8h.md#define-db_numeric_buf_size)(17) + 7) / 8 \*/ |
| define | NUMERIC_AS_WORD_BYTES (24) /\* [**NUMERIC\_AS\_WORDS**](numeric__opfunc_8c.md#define-numeric_as_words) \* 8 \*/ |
| define | NUMERIC_GET_BYTE_COUNT (words) (([**words**](broker__monitor_8c.md#function-timeout)) << 3) /\* [**Convert**](broker__monitor_8c.md#function-timeout) [**words**](broker__monitor_8c.md#function-timeout) to [**byte**](broker__monitor_8c.md#function-timeout) count \*/ |
| define | NUMERIC_GET_FULL_WORDS (bytes) ((bytes) >> 3) /\* [**Convert**](broker__monitor_8c.md#function-timeout) bytes to [**full**](broker__monitor_8c.md#function-timeout) [**words**](broker__monitor_8c.md#function-timeout) ([**floor**](broker__monitor_8c.md#function-timeout)) \*/ |
| define | NUMERIC_GET_REM_BYTES (bytes) ((bytes) & 7) /\* [**Remaining**](broker__monitor_8c.md#function-timeout) bytes after word alignment \*/ |
| define | NUMERIC_GET_WORD_COUNT (bytes) (((bytes) + 7) >> 3) /\* [**Total**](broker__monitor_8c.md#function-timeout) word count to [**cover**](broker__monitor_8c.md#function-timeout) bytes ([**ceiling**](broker__monitor_8c.md#function-timeout)) \*/ |
| define | POW10_BUF_SIZE ([**POW10\_BUF\_WORDS**](numeric__opfunc_8c.md#define-pow10_buf_words) \* [**sizeof**](broker__monitor_8c.md#function-timeout)([**uint64\_t**](broker__monitor_8c.md#function-timeout))) |
| define | POW10_BUF_WORDS (27) |
| define | POW10_MAX_INDEX ((([**DB\_MAX\_NUMERIC\_PRECISION**](dbtype__def_8h.md#define-db_max_numeric_precision) - [**DB\_MIN\_NUMERIC\_SCALE**](dbtype__def_8h.md#define-db_min_numeric_scale)) + [**DB\_MAX\_NUMERIC\_SCALE**](dbtype__def_8h.md#define-db_max_numeric_scale)) + 6) |
| define | ROUND (x) (([**x**](broker__monitor_8c.md#function-timeout)) > 0 ? (([**x**](broker__monitor_8c.md#function-timeout)) + .5) : (([**x**](broker__monitor_8c.md#function-timeout)) - .5)) |
| define | ROUND_HALF_UP_DIGIT (5) |
| define | SECONDS_IN_A_DAY ([**int**](broker__monitor_8c.md#function-timeout))(24[**L**](broker__monitor_8c.md#function-timeout) \* 60L \* 60L) |
| define | TWICE_NUM_MAX_PREC (([**DB\_MAX\_NUMERIC\_PRECISION**](dbtype__def_8h.md#define-db_max_numeric_precision) - [**DB\_MIN\_NUMERIC\_SCALE**](dbtype__def_8h.md#define-db_min_numeric_scale)) + 2) |
Public Types Documentation¶
typedef FP_VALUE_TYPE¶
enum fp_value_type¶
enum fp_value_type {
FP_VALUE_TYPE_NUMBER,
FP_VALUE_TYPE_INFINITE,
FP_VALUE_TYPE_NAN,
FP_VALUE_TYPE_ZERO
};
enum numeric_magnitude_t¶
enum numeric_magnitude_t {
NUMERIC_MAG_ZERO,
NUMERIC_MAG_INT,
NUMERIC_MAG_BIGINT,
NUMERIC_MAG_NUMERIC
};
Public Static Attributes Documentation¶
variable _gv_digits4_ascii_lut¶
variable _gv_mul_normalize_pow10_lookup¶
variable _gv_numeric_precision_to_bytes_lookup¶
variable numeric_Pow_of_10¶
variable powers_of_10¶
uint64_t powers_of_10[(((DB_MAX_NUMERIC_PRECISION - DB_MIN_NUMERIC_SCALE)+DB_MAX_NUMERIC_SCALE)+6)+1][(27)];
Public Functions Documentation¶
function float_numeric_db_value_add¶
function float_numeric_db_value_div¶
function float_numeric_db_value_mod¶
int float_numeric_db_value_mod (
const DB_VALUE * value1,
const DB_VALUE * value2,
DB_VALUE * result
)
function float_numeric_db_value_mul¶
function float_numeric_db_value_sub¶
function float_numeric_normalize_for_hash¶
void float_numeric_normalize_for_hash (
DB_C_NUMERIC num,
uint8_t * calc_buf,
int precision,
int scale
)
function numeric_coerce_bigint_to_num¶
function numeric_coerce_dec_str_to_num¶
void numeric_coerce_dec_str_to_num (
const char * dec_str,
DB_C_NUMERIC result,
bool * is_value_negative
)
function numeric_coerce_int_to_num¶
function numeric_coerce_num_to_bigint¶
int numeric_coerce_num_to_bigint (
DB_C_NUMERIC arg,
int scale,
DB_BIGINT * answer,
const bool is_value_negative
)
function numeric_coerce_num_to_dec_str¶
function numeric_coerce_num_to_double¶
function numeric_coerce_num_to_int¶
function numeric_coerce_num_to_num¶
int numeric_coerce_num_to_num (
const DB_VALUE * src_value,
int src_prec,
int src_scale,
int dest_prec,
int dest_scale,
DB_C_NUMERIC dest_num,
bool * dest_num_is_negative
)
function numeric_coerce_string_to_num¶
int numeric_coerce_string_to_num (
const char * astring,
int astring_length,
INTL_CODESET codeset,
DB_VALUE * result
)
function numeric_db_value_add¶
function numeric_db_value_coerce_from_num¶
int numeric_db_value_coerce_from_num (
DB_VALUE * src,
DB_VALUE * dest,
DB_DATA_STATUS * data_status
)
function numeric_db_value_coerce_from_num_strict¶
function numeric_db_value_coerce_to_num¶
int numeric_db_value_coerce_to_num (
DB_VALUE * src,
DB_VALUE * dest,
DB_DATA_STATUS * data_status
)
function numeric_db_value_compare¶
function numeric_db_value_div¶
function numeric_db_value_is_positive¶
function numeric_db_value_is_zero¶
function numeric_db_value_mul¶
function numeric_db_value_print¶
function numeric_db_value_sub¶
function numeric_get_precision_digits¶
function numeric_internal_double_to_num¶
int numeric_internal_double_to_num (
double adouble,
int dst_scale,
DB_C_NUMERIC num,
int * prec,
int * scale,
bool * is_value_negative
)
function numeric_internal_float_to_num¶
int numeric_internal_float_to_num (
float afloat,
int dst_scale,
DB_C_NUMERIC num,
int * prec,
int * scale,
bool * is_value_negative
)
Public Static Functions Documentation¶
function analyze_numeric_string¶
static int analyze_numeric_string (
const char * astring,
int astring_length,
INTL_CODESET codeset,
bool * negate_value,
char * int_digits,
int * int_len,
char * frac_digits,
int * frac_len,
int * frac_first_sig_digit,
int * frac_last_sig_digit,
bool * is_zero
)
function compare_mantissa_same_exponent¶
static int compare_mantissa_same_exponent (
uint64_t * dividend_word,
uint64_t * divisor_word,
int calc_words,
int calc_nbytes,
int prec1,
int prec2
)
function determine_prec_scale¶
static void determine_prec_scale (
const char * int_digits,
int int_len,
const char * frac_digits,
int frac_len,
int frac_first_sig_digit,
int frac_last_sig_digit,
char * num_string,
int * out_prec,
int * out_scale
)
function determine_round¶
static void determine_round (
char * out_str,
int * out_prec,
int * out_scale,
int tmp_int_len,
int tmp_frac_len,
int frac_zero_cnt,
char next_digit
)
function float_numeric_add¶
static void float_numeric_add (
const uint64_t * dbv1_word,
const uint64_t * dbv2_word,
uint64_t * result_word,
int calc_words
)
function float_numeric_add_fast¶
static int float_numeric_add_fast (
const uint64_t * dbv1_word,
const uint64_t * dbv2_word,
uint64_t * result_word,
int calc_words,
bool dbv1_sign,
bool dbv2_sign,
bool * result_sign,
uint8_t * result_buf
)
function float_numeric_check_overflow_and_adjust_scale¶
static int float_numeric_check_overflow_and_adjust_scale (
int * result_prec,
int * result_scale,
DB_VALUE * answer
)
function float_numeric_compare¶
static int float_numeric_compare (
uint8_t * arg1,
uint8_t * arg2,
int prec1,
int scale1,
int prec2,
int scale2,
bool arg1_sign,
bool arg2_sign
)
function float_numeric_compare_rem_round_up¶
static int float_numeric_compare_rem_round_up (
const uint64_t * rem,
const uint64_t * div,
int calc_words
)
function float_numeric_div_fast¶
static void float_numeric_div_fast (
uint64_t dividend_val,
uint64_t divisor_val,
int prec1,
int scale1,
int prec2,
int scale2,
int exponent_diff,
uint8_t * result_buf,
int * result_prec_out,
int * result_scale_out,
bool * result_sign
)
function float_numeric_div_normalize¶
static int float_numeric_div_normalize (
uint64_t * dbv_buf,
int calc_words,
int calc_bytes,
int exponent
)
function float_numeric_div_pow10¶
static uint64_t float_numeric_div_pow10 (
uint64_t * dbv_buf,
int calc_words,
int calc_bytes,
uint64_t divisor
)
function float_numeric_find_first_nz_idx_msb¶
function float_numeric_get_decimal_digit¶
function float_numeric_increment¶
function float_numeric_knuth_div¶
static void float_numeric_knuth_div (
knuth_digit_t * dbv1_buf,
knuth_digit_t * dbv2_buf,
knuth_digit_t * quo_buf,
knuth_digit_t * rem_buf,
knuth_digit_t calc_words
)
function float_numeric_mod_fast¶
static void float_numeric_mod_fast (
uint64_t dividend_val,
uint64_t divisor_val,
uint8_t * result_buf,
int * result_prec_out,
int * result_scale_out,
bool * result_sign
)
function float_numeric_mul¶
static void float_numeric_mul (
const uint64_t * dbv1_word,
const uint64_t * dbv2_word,
uint64_t * result_word,
int calc_words,
int calc_nbytes
)
function float_numeric_mul_fast¶
static int float_numeric_mul_fast (
const uint64_t * dbv1_word,
const uint64_t * dbv2_word,
uint64_t * result_word,
int calc_words,
uint8_t * result_buf,
int * result_scale
)
function float_numeric_mul_normalize¶
static void float_numeric_mul_normalize (
uint64_t * dbv_buf,
int calc_words,
int calc_bytes,
int exponent
)
function float_numeric_mul_pow10¶
static void float_numeric_mul_pow10 (
uint64_t * dbv_buf,
int calc_words,
int calc_bytes,
uint64_t multiplier
)
function float_numeric_operation_compare¶
static int float_numeric_operation_compare (
const uint64_t * arg1_word,
const uint64_t * arg2_word,
int calc_words
)
function float_numeric_round_and_pack¶
static int float_numeric_round_and_pack (
uint64_t * word_buf,
int calc_words,
int calc_nbytes,
uint8_t * result_buf,
int * result_prec,
int * result_scale
)
function float_numeric_sub¶
static void float_numeric_sub (
const uint64_t * arg1_word,
const uint64_t * arg2_word,
uint64_t * result_word,
int calc_words
)
function float_numeric_sub_fast¶
static int float_numeric_sub_fast (
const uint64_t * dbv1_word,
const uint64_t * dbv2_word,
uint64_t * result_word,
int calc_words,
bool dbv1_sign,
bool dbv2_sign,
bool * result_sign,
uint8_t * result_buf
)
function get_fp_value_type¶
function get_significant_digit¶
function knuth_count_leading_zero_bits¶
function knuth_estimate_quotient_digit¶
static knuth_digit_t knuth_estimate_quotient_digit (
const knuth_digit_t * u_work,
const knuth_digit_t * v_work,
int window_offset,
int dividend_words,
int divisor_words,
knuth_digit_t * out_trial_remainder
)
function knuth_find_first_nz_idx¶
function knuth_multiply_and_subtract¶
static knuth_digit_t knuth_multiply_and_subtract (
knuth_digit_t * u_work,
const knuth_digit_t * v_work,
int window_offset,
int divisor_words,
knuth_digit_t trial_quotient
)
function knuth_normalize_left_shift_msb¶
static void knuth_normalize_left_shift_msb (
knuth_digit_t * buffer,
int buffer_size,
unsigned int k_bit
)
function knuth_normalize_right_shift_msb¶
static void knuth_normalize_right_shift_msb (
knuth_digit_t * buffer,
int buffer_size,
unsigned int k_bit
)
function numeric_add¶
function numeric_bytes_to_words¶
static void numeric_bytes_to_words (
const uint8_t * src,
int src_bytes,
uint64_t * dest,
int dest_words,
int dest_bytes
)
function numeric_classify_magnitude¶
function numeric_coerce_big_num_to_dec_str¶
function numeric_common_prec_scale¶
static int numeric_common_prec_scale (
const DB_VALUE * dbv1,
const DB_VALUE * dbv2,
DB_VALUE * dbv1_common,
DB_VALUE * dbv2_common
)
function numeric_compare_pos¶
function numeric_copy¶
function numeric_copy_long¶
function numeric_div¶
static void numeric_div (
DB_C_NUMERIC arg1,
DB_C_NUMERIC arg2,
DB_C_NUMERIC answer,
DB_C_NUMERIC remainder,
bool arg1_value_is_negative,
bool arg2_value_is_negative
)
function numeric_double_shift_bit¶
static void numeric_double_shift_bit (
DB_C_NUMERIC arg1,
DB_C_NUMERIC arg2,
int numbits,
DB_C_NUMERIC lsb,
DB_C_NUMERIC msb,
bool is_long_num
)
function numeric_get_digits4_ascii¶
function numeric_get_fractional_part¶
static void numeric_get_fractional_part (
const DB_C_NUMERIC num,
const int src_scale,
const int dst_prec,
DB_C_NUMERIC dest
)
function numeric_get_integral_part¶
static void numeric_get_integral_part (
const DB_C_NUMERIC num,
const int src_prec,
const int src_scale,
const int dst_prec,
DB_C_NUMERIC dest
)
function numeric_get_msb_for_dec¶
static int numeric_get_msb_for_dec (
int src_prec,
int src_scale,
unsigned char * src,
int * dest_prec,
int * dest_scale,
DB_C_NUMERIC dest
)
function numeric_get_pow_of_10¶
function numeric_get_uint64_from_be¶
function numeric_increase¶
function numeric_increase_long¶
function numeric_init_digits4_ascii_helper¶
function numeric_init_pow_of_10_helper¶
function numeric_internal_real_to_num¶
static int numeric_internal_real_to_num (
double adouble,
int dst_scale,
DB_C_NUMERIC num,
int * prec,
int * scale,
bool is_float,
bool * is_value_negative
)
function numeric_is_fraction_part_zero¶
function numeric_is_longnum_value¶
function numeric_is_negative¶
function numeric_is_zero¶
function numeric_long_div¶
static void numeric_long_div (
DB_C_NUMERIC a1,
DB_C_NUMERIC a2,
DB_C_NUMERIC answer,
DB_C_NUMERIC remainder,
bool is_long_num
)
function numeric_longnum_to_shortnum¶
function numeric_mul¶
static void numeric_mul (
DB_C_NUMERIC a1,
DB_C_NUMERIC a2,
DB_C_NUMERIC answer,
bool * is_value_negative
)
function numeric_operation_compare¶
static int numeric_operation_compare (
const uint8_t * dbv1_buf,
const uint8_t * dbv2_buf,
int calc_bytes
)
function numeric_overflow¶
function numeric_pack_digits4_ascii¶
function numeric_prec_scale_when_overflow¶
static int numeric_prec_scale_when_overflow (
const DB_VALUE * dbv1,
const DB_VALUE * dbv2,
DB_VALUE * dbv1_common,
DB_VALUE * dbv2_common
)
function numeric_put_uint64_to_be¶
function numeric_scale_by_ten¶
function numeric_scale_dec¶
function numeric_scale_dec_long¶
function numeric_shift_byte¶
function numeric_shortnum_to_longnum¶
function numeric_sub¶
function numeric_words_to_bytes¶
function numeric_zero¶
Macro Definition Documentation¶
define BORROW_NEXT¶
#define BORROW_NEXT (
minuend,
subtrahend,
borrow
) `(( unsigned )( minuend ) < ( unsigned )(( subtrahend ) + ( borrow )))`
define CARRYOVER¶
define DB_LONG_NUMERIC_MULTIPLIER¶
define GET_LOWER_BYTE¶
define NUMERIC_ABS¶
define NUMERIC_AS_WORDS¶
define NUMERIC_AS_WORD_BYTES¶
define NUMERIC_GET_BYTE_COUNT¶
define NUMERIC_GET_FULL_WORDS¶
#define NUMERIC_GET_FULL_WORDS (
bytes
) `((bytes) >> 3) /* Convert bytes to full words ( floor ) */`
define NUMERIC_GET_REM_BYTES¶
define NUMERIC_GET_WORD_COUNT¶
#define NUMERIC_GET_WORD_COUNT (
bytes
) `(((bytes) + 7) >> 3) /* Total word count to cover bytes ( ceiling ) */`
define POW10_BUF_SIZE¶
define POW10_BUF_WORDS¶
define POW10_MAX_INDEX¶
#define POW10_MAX_INDEX `((( DB_MAX_NUMERIC_PRECISION - DB_MIN_NUMERIC_SCALE ) + DB_MAX_NUMERIC_SCALE ) + 6)`
define ROUND¶
define ROUND_HALF_UP_DIGIT¶
define SECONDS_IN_A_DAY¶
define TWICE_NUM_MAX_PREC¶
The documentation for this class was generated from the following file cubrid/src/query/numeric_opfunc.c