Skip to content

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

Type Name
int float_numeric_db_value_add (const DB_VALUE * dbv1, const DB_VALUE * dbv2, DB_VALUE * answer)
int float_numeric_db_value_div (const DB_VALUE * dbv1, const DB_VALUE * dbv2, DB_VALUE * answer)
int float_numeric_db_value_mod (const DB_VALUE * value1, const DB_VALUE * value2, DB_VALUE * result)
int float_numeric_db_value_mul (const DB_VALUE * dbv1, const DB_VALUE * dbv2, DB_VALUE * answer)
int float_numeric_db_value_sub (const DB_VALUE * dbv1, const DB_VALUE * dbv2, DB_VALUE * answer)
void float_numeric_normalize_for_hash (DB_C_NUMERIC num, uint8_t * calc_buf, int precision, int scale)
void numeric_coerce_bigint_to_num (DB_BIGINT arg, DB_C_NUMERIC answer, bool * is_value_negative)
void numeric_coerce_dec_str_to_num (const char * dec_str, DB_C_NUMERIC result, bool * is_value_negative)
void numeric_coerce_int_to_num (int arg, DB_C_NUMERIC answer, bool * is_value_negative)
int numeric_coerce_num_to_bigint (DB_C_NUMERIC arg, int scale, DB_BIGINT * answer, const bool is_value_negative)
void numeric_coerce_num_to_dec_str (const DB_VALUE * num_value, char * dec_str)
void numeric_coerce_num_to_double (const DB_VALUE * num_value, int scale, double * adouble)
void numeric_coerce_num_to_int (DB_C_NUMERIC arg, int * answer, const bool is_value_negative)
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)
int numeric_coerce_string_to_num (const char * astring, int astring_length, INTL_CODESET codeset, DB_VALUE * result)
int numeric_db_value_add (const DB_VALUE * dbv1, const DB_VALUE * dbv2, DB_VALUE * answer)
int numeric_db_value_coerce_from_num (DB_VALUE * src, DB_VALUE * dest, DB_DATA_STATUS * data_status)
int numeric_db_value_coerce_from_num_strict (DB_VALUE * src, DB_VALUE * dest)
int numeric_db_value_coerce_to_num (DB_VALUE * src, DB_VALUE * dest, DB_DATA_STATUS * data_status)
int numeric_db_value_compare (const DB_VALUE * dbv1, const DB_VALUE * dbv2, DB_VALUE * answer)
int numeric_db_value_div (const DB_VALUE * dbv1, const DB_VALUE * dbv2, DB_VALUE * answer)
int numeric_db_value_is_positive (const DB_VALUE * dbvalue)
bool numeric_db_value_is_zero (const DB_VALUE * arg)
int numeric_db_value_mul (const DB_VALUE * dbv1, const DB_VALUE * dbv2, DB_VALUE * answer)
char * numeric_db_value_print (const DB_VALUE * val, char * buf)
int numeric_db_value_sub (const DB_VALUE * dbv1, const DB_VALUE * dbv2, DB_VALUE * answer)
int numeric_get_precision_digits (uint8_t * calc_buf)
int numeric_internal_double_to_num (double adouble, int dst_scale, DB_C_NUMERIC num, int * prec, int * scale, bool * is_value_negative)
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

Type Name
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)
int compare_mantissa_same_exponent (uint64_t * dividend_word, uint64_t * divisor_word, int calc_words, int calc_nbytes, int prec1, int prec2)
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)
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)
void float_numeric_add (const uint64_t * dbv1_word, const uint64_t * dbv2_word, uint64_t * result_word, int calc_words)
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)
int float_numeric_check_overflow_and_adjust_scale (int * result_prec, int * result_scale, DB_VALUE * answer)
int float_numeric_compare (uint8_t * arg1, uint8_t * arg2, int prec1, int scale1, int prec2, int scale2, bool arg1_sign, bool arg2_sign)
int float_numeric_compare_rem_round_up (const uint64_t * rem, const uint64_t * div, int calc_words)
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)
int float_numeric_div_normalize (uint64_t * dbv_buf, int calc_words, int calc_bytes, int exponent)
uint64_t float_numeric_div_pow10 (uint64_t * dbv_buf, int calc_words, int calc_bytes, uint64_t divisor)
int float_numeric_find_first_nz_idx_msb (const uint64_t * word_buf, int calc_words)
int float_numeric_get_decimal_digit (const uint64_t * word_buf, int calc_words)
void float_numeric_increment (uint64_t * calc_buf, int calc_words, uint64_t val)
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)
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)
void float_numeric_mul (const uint64_t * dbv1_word, const uint64_t * dbv2_word, uint64_t * result_word, int calc_words, int calc_nbytes)
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)
void float_numeric_mul_normalize (uint64_t * dbv_buf, int calc_words, int calc_bytes, int exponent)
void float_numeric_mul_pow10 (uint64_t * dbv_buf, int calc_words, int calc_bytes, uint64_t multiplier)
int float_numeric_operation_compare (const uint64_t * arg1_word, const uint64_t * arg2_word, int calc_words)
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)
void float_numeric_sub (const uint64_t * arg1_word, const uint64_t * arg2_word, uint64_t * result_word, int calc_words)
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)
FP_VALUE_TYPE get_fp_value_type (double d)
int get_significant_digit (DB_BIGINT i)
unsigned int knuth_count_leading_zero_bits (knuth_digit_t value)
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)
int knuth_find_first_nz_idx (const knuth_digit_t * digit_buf, int total_digits)
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)
void knuth_normalize_left_shift_msb (knuth_digit_t * buffer, int buffer_size, unsigned int k_bit)
void knuth_normalize_right_shift_msb (knuth_digit_t * buffer, int buffer_size, unsigned int k_bit)
void numeric_add (DB_C_NUMERIC arg1, DB_C_NUMERIC arg2, DB_C_NUMERIC answer, int size)
void numeric_bytes_to_words (const uint8_t * src, int src_bytes, uint64_t * dest, int dest_words, int dest_bytes)
numeric_magnitude_t numeric_classify_magnitude (DB_C_NUMERIC arg, bool is_value_negative)
void numeric_coerce_big_num_to_dec_str (unsigned char * num, char * dec_str)
int numeric_common_prec_scale (const DB_VALUE * dbv1, const DB_VALUE * dbv2, DB_VALUE * dbv1_common, DB_VALUE * dbv2_common)
int numeric_compare_pos (DB_C_NUMERIC arg1, DB_C_NUMERIC arg2)
void numeric_copy (DB_C_NUMERIC dest, DB_C_NUMERIC source)
void numeric_copy_long (DB_C_NUMERIC dest, DB_C_NUMERIC source, bool is_long_num)
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)
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)
uint32_t numeric_get_digits4_ascii (uint32_t val)
void numeric_get_fractional_part (const DB_C_NUMERIC num, const int src_scale, const int dst_prec, DB_C_NUMERIC dest)
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)
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)
void numeric_get_pow_of_10 (int exp, uint8_t * result)
uint64_t numeric_get_uint64_from_be (const void * ptr)
void numeric_increase (DB_C_NUMERIC answer)
void numeric_increase_long (DB_C_NUMERIC answer, bool is_long_num)
void numeric_init_digits4_ascii_helper (void)
void numeric_init_pow_of_10_helper (void)
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)
bool numeric_is_fraction_part_zero (const DB_VALUE * num_value, const int scale)
bool numeric_is_longnum_value (DB_C_NUMERIC arg)
bool numeric_is_negative (const DB_VALUE * value)
bool numeric_is_zero (DB_C_NUMERIC arg)
void numeric_long_div (DB_C_NUMERIC a1, DB_C_NUMERIC a2, DB_C_NUMERIC answer, DB_C_NUMERIC remainder, bool is_long_num)
int numeric_longnum_to_shortnum (DB_C_NUMERIC answer, DB_C_NUMERIC long_arg)
void numeric_mul (DB_C_NUMERIC a1, DB_C_NUMERIC a2, DB_C_NUMERIC answer, bool * is_value_negative)
int numeric_operation_compare (const uint8_t * dbv1_buf, const uint8_t * dbv2_buf, int calc_bytes)
bool numeric_overflow (DB_C_NUMERIC arg, int exp)
void numeric_pack_digits4_ascii (char * buf, uint64_t val)
int numeric_prec_scale_when_overflow (const DB_VALUE * dbv1, const DB_VALUE * dbv2, DB_VALUE * dbv1_common, DB_VALUE * dbv2_common)
void numeric_put_uint64_to_be (void * ptr, uint64_t val)
int numeric_scale_by_ten (DB_C_NUMERIC arg, bool is_long_num)
int numeric_scale_dec (const DB_C_NUMERIC arg, int dscale, DB_C_NUMERIC answer)
int numeric_scale_dec_long (DB_C_NUMERIC answer, int dscale, bool is_long_num)
void numeric_shift_byte (DB_C_NUMERIC arg, int numbytes, DB_C_NUMERIC answer, int length)
void numeric_shortnum_to_longnum (DB_C_NUMERIC long_answer, DB_C_NUMERIC arg)
void numeric_sub (DB_C_NUMERIC arg1, DB_C_NUMERIC arg2, DB_C_NUMERIC answer, int size)
void numeric_words_to_bytes (const uint64_t * src, int src_words, uint8_t * dest)
void numeric_zero (DB_C_NUMERIC answer, int size)

Macros

Type Name
define BORROW_NEXT (minuend, subtrahend, borrow) (([**unsigned**](broker__monitor_8c.md#function-timeout))([**minuend**](broker__monitor_8c.md#function-timeout)) &lt; ([**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) &gt;&gt; 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)) &gt;= 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)) &lt;&lt; 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) &gt;&gt; 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) &gt;&gt; 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)) &gt; 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

typedef enum fp_value_type 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

uint32_t _gv_digits4_ascii_lut[10000];

variable _gv_mul_normalize_pow10_lookup

const uint64_t _gv_mul_normalize_pow10_lookup[19];

variable _gv_numeric_precision_to_bytes_lookup

const int _gv_numeric_precision_to_bytes_lookup[513];

variable numeric_Pow_of_10

const double numeric_Pow_of_10[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

int float_numeric_db_value_add (
    const  DB_VALUE * dbv1,
    const  DB_VALUE * dbv2,
    DB_VALUE * answer
) 

function float_numeric_db_value_div

int float_numeric_db_value_div (
    const  DB_VALUE * dbv1,
    const  DB_VALUE * dbv2,
    DB_VALUE * answer
) 

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

int float_numeric_db_value_mul (
    const  DB_VALUE * dbv1,
    const  DB_VALUE * dbv2,
    DB_VALUE * answer
) 

function float_numeric_db_value_sub

int float_numeric_db_value_sub (
    const  DB_VALUE * dbv1,
    const  DB_VALUE * dbv2,
    DB_VALUE * answer
) 

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

void numeric_coerce_bigint_to_num (
    DB_BIGINT arg,
    DB_C_NUMERIC answer,
    bool * is_value_negative
) 

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

void numeric_coerce_int_to_num (
    int arg,
    DB_C_NUMERIC answer,
    bool * is_value_negative
) 

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

void numeric_coerce_num_to_dec_str (
    const  DB_VALUE * num_value,
    char * dec_str
) 

function numeric_coerce_num_to_double

void numeric_coerce_num_to_double (
    const  DB_VALUE * num_value,
    int scale,
    double * adouble
) 

function numeric_coerce_num_to_int

void numeric_coerce_num_to_int (
    DB_C_NUMERIC arg,
    int * answer,
    const  bool is_value_negative
) 

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

int numeric_db_value_add (
    const  DB_VALUE * dbv1,
    const  DB_VALUE * dbv2,
    DB_VALUE * answer
) 

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

int numeric_db_value_coerce_from_num_strict (
    DB_VALUE * src,
    DB_VALUE * dest
) 

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

int numeric_db_value_compare (
    const  DB_VALUE * dbv1,
    const  DB_VALUE * dbv2,
    DB_VALUE * answer
) 

function numeric_db_value_div

int numeric_db_value_div (
    const  DB_VALUE * dbv1,
    const  DB_VALUE * dbv2,
    DB_VALUE * answer
) 

function numeric_db_value_is_positive

int numeric_db_value_is_positive (
    const  DB_VALUE * dbvalue
) 

function numeric_db_value_is_zero

bool numeric_db_value_is_zero (
    const  DB_VALUE * arg
) 

function numeric_db_value_mul

int numeric_db_value_mul (
    const  DB_VALUE * dbv1,
    const  DB_VALUE * dbv2,
    DB_VALUE * answer
) 

function numeric_db_value_print

char * numeric_db_value_print (
    const  DB_VALUE * val,
    char * buf
) 

function numeric_db_value_sub

int numeric_db_value_sub (
    const  DB_VALUE * dbv1,
    const  DB_VALUE * dbv2,
    DB_VALUE * answer
) 

function numeric_get_precision_digits

int numeric_get_precision_digits (
    uint8_t * calc_buf
) 

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

static int float_numeric_find_first_nz_idx_msb (
    const  uint64_t * word_buf,
    int calc_words
) 

function float_numeric_get_decimal_digit

static inline int float_numeric_get_decimal_digit (
    const  uint64_t * word_buf,
    int calc_words
) 

function float_numeric_increment

static void float_numeric_increment (
    uint64_t * calc_buf,
    int calc_words,
    uint64_t val
) 

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

static FP_VALUE_TYPE get_fp_value_type (
    double d
) 

function get_significant_digit

static int get_significant_digit (
    DB_BIGINT i
) 

function knuth_count_leading_zero_bits

static unsigned  int knuth_count_leading_zero_bits (
    knuth_digit_t value
) 

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

static int knuth_find_first_nz_idx (
    const  knuth_digit_t * digit_buf,
    int total_digits
) 

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

static void numeric_add (
    DB_C_NUMERIC arg1,
    DB_C_NUMERIC arg2,
    DB_C_NUMERIC answer,
    int size
) 

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

static numeric_magnitude_t numeric_classify_magnitude (
    DB_C_NUMERIC arg,
    bool is_value_negative
) 

function numeric_coerce_big_num_to_dec_str

static void numeric_coerce_big_num_to_dec_str (
    unsigned  char * num,
    char * 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

static int numeric_compare_pos (
    DB_C_NUMERIC arg1,
    DB_C_NUMERIC arg2
) 

function numeric_copy

static void numeric_copy (
    DB_C_NUMERIC dest,
    DB_C_NUMERIC source
) 

function numeric_copy_long

static void numeric_copy_long (
    DB_C_NUMERIC dest,
    DB_C_NUMERIC source,
    bool is_long_num
) 

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

static inline uint32_t numeric_get_digits4_ascii (
    uint32_t val
) 

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

static void numeric_get_pow_of_10 (
    int exp,
    uint8_t * result
) 

function numeric_get_uint64_from_be

static inline uint64_t numeric_get_uint64_from_be (
    const  void * ptr
) 

function numeric_increase

static void numeric_increase (
    DB_C_NUMERIC answer
) 

function numeric_increase_long

static void numeric_increase_long (
    DB_C_NUMERIC answer,
    bool is_long_num
) 

function numeric_init_digits4_ascii_helper

static void numeric_init_digits4_ascii_helper (
    void
) 

function numeric_init_pow_of_10_helper

static void numeric_init_pow_of_10_helper (
    void
) 

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

static bool numeric_is_fraction_part_zero (
    const  DB_VALUE * num_value,
    const  int scale
) 

function numeric_is_longnum_value

static bool numeric_is_longnum_value (
    DB_C_NUMERIC arg
) 

function numeric_is_negative

static inline bool numeric_is_negative (
    const  DB_VALUE * value
) 

function numeric_is_zero

static bool numeric_is_zero (
    DB_C_NUMERIC arg
) 

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

static int numeric_longnum_to_shortnum (
    DB_C_NUMERIC answer,
    DB_C_NUMERIC long_arg
) 

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

static bool numeric_overflow (
    DB_C_NUMERIC arg,
    int exp
) 

function numeric_pack_digits4_ascii

static inline void numeric_pack_digits4_ascii (
    char * buf,
    uint64_t val
) 

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

static inline void numeric_put_uint64_to_be (
    void * ptr,
    uint64_t val
) 

function numeric_scale_by_ten

static int numeric_scale_by_ten (
    DB_C_NUMERIC arg,
    bool is_long_num
) 

function numeric_scale_dec

static int numeric_scale_dec (
    const  DB_C_NUMERIC arg,
    int dscale,
    DB_C_NUMERIC answer
) 

function numeric_scale_dec_long

static int numeric_scale_dec_long (
    DB_C_NUMERIC answer,
    int dscale,
    bool is_long_num
) 

function numeric_shift_byte

static void numeric_shift_byte (
    DB_C_NUMERIC arg,
    int numbytes,
    DB_C_NUMERIC answer,
    int length
) 

function numeric_shortnum_to_longnum

static void numeric_shortnum_to_longnum (
    DB_C_NUMERIC long_answer,
    DB_C_NUMERIC arg
) 

function numeric_sub

static void numeric_sub (
    DB_C_NUMERIC arg1,
    DB_C_NUMERIC arg2,
    DB_C_NUMERIC answer,
    int size
) 

function numeric_words_to_bytes

static void numeric_words_to_bytes (
    const  uint64_t * src,
    int src_words,
    uint8_t * dest
) 

function numeric_zero

static void numeric_zero (
    DB_C_NUMERIC answer,
    int size
) 

Macro Definition Documentation

define BORROW_NEXT

#define BORROW_NEXT (
    minuend,
    subtrahend,
    borrow
) `(( unsigned )( minuend ) < ( unsigned )(( subtrahend ) + ( borrow )))`

define CARRYOVER

#define CARRYOVER (
    arg
) `((arg) >> 8)`

define DB_LONG_NUMERIC_MULTIPLIER

#define DB_LONG_NUMERIC_MULTIPLIER `2`

define GET_LOWER_BYTE

#define GET_LOWER_BYTE (
    arg
) `((arg) & 0xff)`

define NUMERIC_ABS

#define NUMERIC_ABS (
    a
) `(( a ) >= 0 ? a : - a )`

define NUMERIC_AS_WORDS

#define NUMERIC_AS_WORDS `(3)   /* ( DB_NUMERIC_BUF_SIZE (17) + 7) / 8 */`

define NUMERIC_AS_WORD_BYTES

#define NUMERIC_AS_WORD_BYTES `(24) /* NUMERIC_AS_WORDS * 8 */`

define NUMERIC_GET_BYTE_COUNT

#define NUMERIC_GET_BYTE_COUNT (
    words
) `(( words ) << 3) /* Convert  words to 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_REM_BYTES (
    bytes
) `((bytes) & 7)    /* Remaining bytes after word alignment */`

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_SIZE `( POW10_BUF_WORDS * sizeof ( uint64_t ))`

define POW10_BUF_WORDS

#define POW10_BUF_WORDS `(27)`

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 (
    x
) `(( x ) > 0 ? (( x ) + .5) : (( x ) - .5))`

define ROUND_HALF_UP_DIGIT

#define ROUND_HALF_UP_DIGIT `(5)`

define SECONDS_IN_A_DAY

#define SECONDS_IN_A_DAY `( int )(24 L * 60L * 60L)`

define TWICE_NUM_MAX_PREC

#define TWICE_NUM_MAX_PREC `(( DB_MAX_NUMERIC_PRECISION - DB_MIN_NUMERIC_SCALE ) + 2)`


The documentation for this class was generated from the following file cubrid/src/query/numeric_opfunc.c