1#ifndef INTERNAL_NUMERIC_H
2#define INTERNAL_NUMERIC_H
19#define ROUND_TO(mode, even, up, down) \
20 ((mode) == RUBY_NUM_ROUND_HALF_EVEN ? even : \
21 (mode) == RUBY_NUM_ROUND_HALF_UP ? up : down)
22#define ROUND_FUNC(mode, name) \
23 ROUND_TO(mode, name##_half_even, name##_half_up, name##_half_down)
24#define ROUND_CALL(mode, name, args) \
25 ROUND_TO(mode, name##_half_even args, \
26 name##_half_up args, name##_half_down args)
29# define ROUND_DEFAULT RUBY_NUM_ROUND_HALF_UP
44#define RFLOAT(obj) ((struct RFloat *)(obj))
85static inline int rb_num_positive_int_p(
VALUE num);
86static inline int rb_num_negative_int_p(
VALUE num);
87static inline double rb_float_flonum_value(
VALUE v);
88static inline double rb_float_noflonum_value(
VALUE v);
89static inline double rb_float_value_inline(
VALUE v);
90static inline VALUE rb_float_new_inline(
double d);
91static inline bool INT_POSITIVE_P(
VALUE num);
92static inline bool INT_NEGATIVE_P(
VALUE num);
93static inline bool FLOAT_ZERO_P(
VALUE num);
94#define rb_float_value rb_float_value_inline
95#define rb_float_new rb_float_new_inline
97RUBY_SYMBOL_EXPORT_BEGIN
100RUBY_SYMBOL_EXPORT_END
122 return FIXNUM_POSITIVE_P(
num);
125 return BIGNUM_POSITIVE_P(
num);
133 return FIXNUM_NEGATIVE_P(
num);
136 return BIGNUM_NEGATIVE_P(
num);
164 return FIXNUM_POSITIVE_P(
num);
168 return BIGNUM_POSITIVE_P(
num);
170 return RTEST(rb_num_compare_with_zero(
num, mid));
180 return FIXNUM_NEGATIVE_P(
num);
184 return BIGNUM_NEGATIVE_P(
num);
186 return RTEST(rb_num_compare_with_zero(
num, mid));
190rb_float_flonum_value(
VALUE v)
193 if (v != (
VALUE)0x8000000000000002) {
199 VALUE b63 = (v >> 63);
203 t.v = RUBY_BIT_ROTR((2 - b63) | (v & ~(
VALUE)0x03), 3);
211rb_float_noflonum_value(
VALUE v)
213 return RFLOAT(v)->float_value;
217rb_float_value_inline(
VALUE v)
220 return rb_float_flonum_value(v);
222 return rb_float_noflonum_value(v);
226rb_float_new_inline(
double d)
242 if (
t.v != 0x3000000000000000 &&
243 !((
bits-3) & ~0x01)) {
244 return (RUBY_BIT_ROTL(
t.v, 3) & ~(
VALUE)0x01) | 0x02;
246 else if (
t.v == (
VALUE)0) {
248 return 0x8000000000000002;
Internal header for bitwise integer algorithms.
int bits(struct state *s, int need)
void rb_cmperr(VALUE x, VALUE y)
#define MJIT_SYMBOL_EXPORT_END
#define MJIT_SYMBOL_EXPORT_BEGIN
VALUE rb_float_new_in_heap(double)
VALUE rb_check_funcall(VALUE, ID, int, const VALUE *)
Internal header for Bignums.
Internal header for Fixnums.
int rb_int_negative_p(VALUE num)
VALUE rb_int_modulo(VALUE x, VALUE y)
VALUE rb_fix_aref(VALUE fix, VALUE idx)
VALUE rb_num_pow(VALUE x, VALUE y)
VALUE rb_int_comp(VALUE num)
VALUE rb_int_abs(VALUE num)
VALUE rb_float_floor(VALUE x, int ndigits)
VALUE rb_int_div(VALUE x, VALUE y)
VALUE rb_int_zero_p(VALUE num)
VALUE rb_float_pow(VALUE x, VALUE y)
VALUE rb_int_pow(VALUE x, VALUE y)
VALUE rb_int2str(VALUE num, int base)
VALUE rb_float_equal(VALUE x, VALUE y)
VALUE rb_int_uminus(VALUE num)
VALUE rb_float_mul(VALUE x, VALUE y)
VALUE rb_int_equal(VALUE x, VALUE y)
VALUE rb_float_plus(VALUE x, VALUE y)
VALUE rb_int_positive_pow(long x, unsigned long y)
VALUE rb_flo_div_flo(VALUE x, VALUE y)
VALUE rb_int_cmp(VALUE x, VALUE y)
double ruby_float_mod(double x, double y)
VALUE rb_float_eql(VALUE x, VALUE y)
VALUE rb_int_and(VALUE x, VALUE y)
VALUE rb_float_abs(VALUE flt)
VALUE rb_int_even_p(VALUE num)
VALUE rb_float_uminus(VALUE num)
VALUE rb_int_lshift(VALUE x, VALUE y)
double ruby_float_step_size(double beg, double end, double unit, int excl)
VALUE rb_float_gt(VALUE x, VALUE y)
int rb_num_negative_p(VALUE)
VALUE rb_float_ceil(VALUE num, int ndigits)
double rb_int_fdiv_double(VALUE x, VALUE y)
int rb_int_positive_p(VALUE num)
VALUE ruby_num_interval_step_size(VALUE from, VALUE to, VALUE step, int excl)
int ruby_float_step(VALUE from, VALUE to, VALUE step, int excl, int allow_endless)
enum ruby_num_rounding_mode rb_num_get_rounding_option(VALUE opts)
VALUE rb_int_ge(VALUE x, VALUE y)
VALUE rb_float_div(VALUE x, VALUE y)
VALUE rb_int_minus(VALUE x, VALUE y)
VALUE rb_int_odd_p(VALUE num)
int rb_num_to_uint(VALUE val, unsigned int *ret)
@ RUBY_NUM_ROUND_HALF_EVEN
@ RUBY_NUM_ROUND_HALF_DOWN
VALUE rb_fix_plus(VALUE x, VALUE y)
VALUE rb_int_divmod(VALUE x, VALUE y)
int rb_float_cmp(VALUE x, VALUE y)
VALUE rb_int_bit_length(VALUE num)
VALUE rb_int_idiv(VALUE x, VALUE y)
VALUE rb_float_minus(VALUE x, VALUE y)
VALUE rb_int_plus(VALUE x, VALUE y)
VALUE rb_int_gt(VALUE x, VALUE y)
VALUE rb_int_succ(VALUE num)
VALUE rb_int_mul(VALUE x, VALUE y)
Internal header for RubyVM.
#define rb_method_basic_definition_p(...)
typedef int(ZCALLBACK *close_file_func) OF((voidpf opaque