Class: Float
| Relationships & Source Files | |
| Super Chains via Extension / Inclusion / Inheritance | |
| Class Chain: 
          self,
           ::Numeric | |
| Instance Chain: 
          self,
           ::Numeric,::Comparable | |
| Inherits: | Numeric | 
| Defined in: | numeric.c, complex.c, rational.c | 
Overview
Float objects represent inexact real numbers using the native architecture’s double-precision floating point representation.
Floating point has a different arithmetic and is an inexact number. So you should know its esoteric system. See following:
Constant Summary
- 
    DIG =
    # File 'numeric.c', line 5733The minimum number of significant decimal digits in a double-precision floating point. Usually defaults to 15. INT2FIX(DBL_DIG) 
- 
    EPSILON =
    # File 'numeric.c', line 5785The difference between 1 and the smallest double-precision floating point number greater than 1. Usually defaults to 2.2204460492503131e-16. DBL2NUM(DBL_EPSILON) 
- 
    INFINITY =
    # File 'numeric.c', line 5789An expression representing positive infinity. DBL2NUM(HUGE_VAL) 
- 
    MANT_DIG =
    # File 'numeric.c', line 5726The number of base digits for the doubledata type.Usually defaults to 53. INT2FIX(DBL_MANT_DIG) 
- 
    MAX =
    # File 'numeric.c', line 5778The largest possible integer in a double-precision floating point number. Usually defaults to 1.7976931348623157e+308. DBL2NUM(DBL_MAX) 
- 
    MAX_10_EXP =
    # File 'numeric.c', line 5761The largest positive exponent in a double-precision floating point where 10 raised to this power minus 1. Usually defaults to 308. INT2FIX(DBL_MAX_10_EXP) 
- 
    MAX_EXP =
    # File 'numeric.c', line 5747The largest possible exponent value in a double-precision floating point. Usually defaults to 1024. INT2FIX(DBL_MAX_EXP) 
- 
    MIN =
    # File 'numeric.c', line 5772:MIN. 0.0.next_float returns the smallest positive floating point number including denormalized numbers.The smallest positive normalized number in a double-precision floating point. Usually defaults to 2.2250738585072014e-308. If the platform supports denormalized numbers, there are numbers between zero and Float 
- 
    MIN_10_EXP =
    # File 'numeric.c', line 5754The smallest negative exponent in a double-precision floating point where 10 raised to this power minus 1. Usually defaults to -307. INT2FIX(DBL_MIN_10_EXP) 
- 
    MIN_EXP =
    # File 'numeric.c', line 5740The smallest possible exponent value in a double-precision floating point. Usually defaults to -1021. INT2FIX(DBL_MIN_EXP) 
- 
    NAN =
    # File 'numeric.c', line 5793An expression representing a value which is “not a number”. DBL2NUM(nan("")) 
- 
    RADIX =
    # File 'numeric.c', line 5720The base of the floating point, or number of unique digits used to represent the number. Usually defaults to 2 on most systems, which would represent a base-10 decimal. INT2FIX(FLT_RADIX) 
- 
    ROUNDS =
    # File 'numeric.c', line 5712Deprecated, do not use. Represents the rounding mode for floating point addition at the start time. Usually defaults to 1, rounding to the nearest number. Other modes include: - -1
- 
Indeterminable 
- 0
- 
Rounding towards zero 
- 1
- 
Rounding to the nearest number 
- 2
- 
Rounding towards positive infinity 
- 3
- 
Rounding towards negative infinity 
 INT2FIX(FLT_ROUNDS) 
Instance Attribute Summary
- 
    
      #finite?  ⇒ Boolean 
    
    readonly
    Returns trueiffloatis a valid IEEE floating point number, i.e.
- 
    
      #infinite?  ⇒ Boolean 
    
    readonly
    Returns nil, -1, or 1 depending on whether the value is finite,-Infinity, or+Infinity.
- 
    
      #nan?  ⇒ Boolean 
    
    readonly
    Returns trueiffloatis an invalid IEEE floating point number.
- 
    
      #negative?  ⇒ Boolean 
    
    readonly
    Returns trueiffloatis less than 0.
- 
    
      #positive?  ⇒ Boolean 
    
    readonly
    Returns trueiffloatis greater than 0.
- 
    
      #zero?  ⇒ Boolean 
    
    readonly
    Returns trueiffloatis 0.0.
::Numeric - Inherited
| #finite? | Returns  | 
| #infinite? | Returns  | 
| #integer? | Returns  | 
| #negative? | Returns  | 
| #nonzero? | Returns  | 
| #positive? | Returns  | 
| #real | Returns self. | 
| #real? | Returns  | 
| #zero? | Returns  | 
Instance Method Summary
- 
    
      #%(other)  ⇒ Float 
      (also: #modulo)
    
    Returns the modulo after division of floatbyother.
- 
    
      #*(other)  ⇒ Float 
    
    Returns a new Floatwhich is the product offloatandother.
- 
    
      #**(other)  ⇒ Float 
    
    Raises floatto the power ofother.
- 
    
      #+(other)  ⇒ Float 
    
    Returns a new Floatwhich is the sum offloatandother.
- 
    
      #-(other)  ⇒ Float 
    
    Returns a new Floatwhich is the difference offloatandother.
- 
    
      #-  ⇒ Float 
    
    Returns float, negated.
- 
    
      #/(other)  ⇒ Float 
    
    Returns a new Floatwhich is the result of dividingfloatbyother.
- 
    
      #<(real)  ⇒ Boolean 
    
    Returns trueiffloatis less thanreal.
- 
    
      #<=(real)  ⇒ Boolean 
    
    Returns trueiffloatis less than or equal toreal.
- 
    
      #<=>(real)  ⇒ 1, ... 
    
    Returns -1, 0, or +1 depending on whether floatis less than, equal to, or greater thanreal.
- #==
- #===
- 
    
      #>(real)  ⇒ Boolean 
    
    Returns trueiffloatis greater thanreal.
- 
    
      #>=(real)  ⇒ Boolean 
    
    Returns trueiffloatis greater than or equal toreal.
- 
    
      #abs  ⇒ Float 
      (also: #magnitude)
    
    Returns the absolute value of float.
- 
    
      #angle  ⇒ 0, Float 
    
    Alias for #arg. 
- 
    
      #arg  ⇒ 0, Float 
      (also: #angle, #phase)
    
    Returns 0 if the value is positive, pi otherwise. 
- 
    
      #ceil([ndigits])  ⇒ Integer, Float 
    
    Returns the smallest number greater than or equal to floatwith a precision ofndigitsdecimal digits (default: 0).
- 
    
      #coerce(numeric)  ⇒ Array 
    
    Returns an array with both numericandfloatrepresented asFloatobjects.
- 
    
      #denominator  ⇒ Integer 
    
    Returns the denominator (always positive). 
- 
    
      #divmod(numeric)  ⇒ Array 
    
    See Numeric#divmod. 
- #eql? ⇒ Boolean
- 
    
      #fdiv(numeric)  ⇒ Float 
    
    Alias for #quo. 
- 
    
      #floor([ndigits])  ⇒ Integer, Float 
    
    Returns the largest number less than or equal to floatwith a precision ofndigitsdecimal digits (default: 0).
- 
    
      #hash  ⇒ Integer 
    
    Returns a hash code for this float. 
- 
    
      #inspect  ⇒ String 
    
    Alias for #to_s. 
- 
    
      #magnitude  ⇒ Float 
    
    Alias for #abs. 
- 
    
      #modulo(other)  ⇒ Float 
    
    Alias for #%. 
- 
    
      #next_float  ⇒ Float 
    
    Returns the next representable floating point number. 
- 
    
      #numerator  ⇒ Integer 
    
    Returns the numerator. 
- 
    
      #phase  ⇒ 0, Float 
    
    Alias for #arg. 
- 
    
      #prev_float  ⇒ Float 
    
    Returns the previous representable floating point number. 
- 
    
      #quo(numeric)  ⇒ Float 
      (also: #fdiv)
    
    Returns float / numeric, same as #/.
- 
    
      #rationalize([eps])  ⇒ Rational 
    
    Returns a simpler approximation of the value (flt-|eps| <= result <= flt+|eps|). 
- 
    
      #round([ndigits] [, half: mode])  ⇒ Integer, Float 
    
    Returns floatrounded to the nearest value with a precision ofndigitsdecimal digits (default: 0).
- 
    
      #to_f  ⇒ self 
    
    Since floatis already aFloat, returnsself.
- 
    
      #to_i  ⇒ Integer 
      (also: #to_int)
    
    Returns the floattruncated to an::Integer.
- 
    
      #to_int  ⇒ Integer 
    
    Alias for #to_i. 
- 
    
      #to_r  ⇒ Rational 
    
    Returns the value as a rational. 
- 
    
      #to_s  ⇒ String 
      (also: #inspect)
    
    Returns a string containing a representation of self.
- 
    
      #truncate([ndigits])  ⇒ Integer, Float 
    
    Returns floattruncated (toward zero) to a precision ofndigitsdecimal digits (default: 0).
::Numeric - Inherited
| #% | 
 | 
| #+@ | Unary Plus—Returns the receiver. | 
| #-@ | Unary Minus—Returns the receiver, negated. | 
| #<=> | Returns zero if  | 
| #abs | Returns the absolute value of  | 
| #abs2 | Returns square of self. | 
| #angle | Alias for Numeric#arg. | 
| #arg | Returns 0 if the value is positive, pi otherwise. | 
| #ceil | Returns the smallest number greater than or equal to  | 
| #clone | Returns the receiver. | 
| #coerce | If  | 
| #conj | Returns self. | 
| #conjugate | Alias for Numeric#conj. | 
| #denominator | Returns the denominator (always positive). | 
| #div | Uses  | 
| #divmod | Returns an array containing the quotient and modulus obtained by dividing  | 
| #dup | Returns the receiver. | 
| #eql? | Returns  | 
| #fdiv | Returns float division. | 
| #floor | Returns the largest number less than or equal to  | 
| #i | Returns the corresponding imaginary number. | 
| #imag | Returns zero. | 
| #imaginary | Alias for Numeric#imag. | 
| #magnitude | Alias for Numeric#abs. | 
| #modulo | Alias for Numeric#%. | 
| #numerator | Returns the numerator. | 
| #phase | Alias for Numeric#arg. | 
| #polar | Returns an array; [num.abs, num.arg]. | 
| #quo | Returns the most exact division (rational for integers, float for floats). | 
| #rect | Returns an array; [num, 0]. | 
| #rectangular | Alias for Numeric#rect. | 
| #remainder | 
 | 
| #round | Returns  | 
| #step | Invokes the given block with the sequence of numbers starting at  | 
| #to_c | Returns the value as a complex. | 
| #to_int | Invokes the child class’s #to_i method to convert  | 
| #truncate | Returns  | 
| #singleton_method_added | Trap attempts to add methods to  | 
::Comparable - Included
| #< | Compares two objects based on the receiver’s #<=> method, returning true if it returns a value less than 0. | 
| #<= | Compares two objects based on the receiver’s #<=> method, returning true if it returns a value less than or equal to 0. | 
| #== | Compares two objects based on the receiver’s #<=> method, returning true if it returns 0. | 
| #> | Compares two objects based on the receiver’s #<=> method, returning true if it returns a value greater than 0. | 
| #>= | Compares two objects based on the receiver’s #<=> method, returning true if it returns a value greater than or equal to 0. | 
| #between? | |
| #clamp | 
Instance Attribute Details
    #finite?  ⇒ Boolean  (readonly)  
Returns true if float is a valid IEEE floating point number, i.e. it is not infinite and #nan? is false.
# File 'numeric.c', line 1769
VALUE
rb_flo_is_finite_p(VALUE num)
{
    double value = RFLOAT_VALUE(num);
#ifdef HAVE_ISFINITE
    if (!isfinite(value))
	return Qfalse;
#else
    if (isinf(value) || isnan(value))
	return Qfalse;
#endif
    return Qtrue;
}
  
    #infinite?  ⇒ Boolean  (readonly)  
Returns nil, -1, or 1 depending on whether the value is finite, -Infinity, or +Infinity.
(0.0).infinite?        #=> nil
(-1.0/0.0).infinite?   #=> -1
(+1.0/0.0).infinite?   #=> 1# File 'numeric.c', line 1749
VALUE
rb_flo_is_infinite_p(VALUE num)
{
    double value = RFLOAT_VALUE(num);
    if (isinf(value)) {
	return INT2FIX( value < 0 ? -1 : 1 );
    }
    return Qnil;
}
  
    #nan?  ⇒ Boolean  (readonly)  
Returns true if float is an invalid IEEE floating point number.
a = -1.0      #=> -1.0
a.nan?        #=> false
a = 0.0/0.0   #=> NaN
a.nan?        #=> true# File 'numeric.c', line 1729
static VALUE
flo_is_nan_p(VALUE num)
{
    double value = RFLOAT_VALUE(num);
    return isnan(value) ? Qtrue : Qfalse;
}
  
    #negative?  ⇒ Boolean  (readonly)  
Returns true if float is less than 0.
# File 'numeric.c', line 2424
static VALUE
flo_negative_p(VALUE num)
{
    double f = RFLOAT_VALUE(num);
    return f < 0.0 ? Qtrue : Qfalse;
}
  
    #positive?  ⇒ Boolean  (readonly)  
Returns true if float is greater than 0.
# File 'numeric.c', line 2410
static VALUE
flo_positive_p(VALUE num)
{
    double f = RFLOAT_VALUE(num);
    return f > 0.0 ? Qtrue : Qfalse;
}
  
    #zero?  ⇒ Boolean  (readonly)  
Returns true if float is 0.0.
# File 'numeric.c', line 1711
static VALUE
flo_zero_p(VALUE num)
{
    return flo_iszero(num) ? Qtrue : Qfalse;
}
  Instance Method Details
    
      #%(other)  ⇒ Float 
      #modulo(other)  ⇒ Float 
    
    Also known as: #modulo
  
Float 
      #modulo(other)  ⇒ Float 
    # File 'numeric.c', line 1225
static VALUE
flo_mod(VALUE x, VALUE y)
{
    double fy;
    if (RB_TYPE_P(y, T_FIXNUM)) {
	fy = (double)FIX2LONG(y);
    }
    else if (RB_TYPE_P(y, T_BIGNUM)) {
	fy = rb_big2dbl(y);
    }
    else if (RB_TYPE_P(y, T_FLOAT)) {
	fy = RFLOAT_VALUE(y);
    }
    else {
	return rb_num_coerce_bin(x, y, '%');
    }
    return DBL2NUM(ruby_float_mod(RFLOAT_VALUE(x), fy));
}
  
    #*(other)  ⇒ Float   
Returns a new Float which is the product of float and other.
# File 'numeric.c', line 1071
VALUE
rb_float_mul(VALUE x, VALUE y)
{
    if (RB_TYPE_P(y, T_FIXNUM)) {
	return DBL2NUM(RFLOAT_VALUE(x) * (double)FIX2LONG(y));
    }
    else if (RB_TYPE_P(y, T_BIGNUM)) {
	return DBL2NUM(RFLOAT_VALUE(x) * rb_big2dbl(y));
    }
    else if (RB_TYPE_P(y, T_FLOAT)) {
	return DBL2NUM(RFLOAT_VALUE(x) * RFLOAT_VALUE(y));
    }
    else {
	return rb_num_coerce_bin(x, y, '*');
    }
}
  
    #**(other)  ⇒ Float   
Raises float to the power of other.
2.0**3   #=> 8.0# File 'numeric.c', line 1297
VALUE
rb_float_pow(VALUE x, VALUE y)
{
    double dx, dy;
    if (RB_TYPE_P(y, T_FIXNUM)) {
	dx = RFLOAT_VALUE(x);
	dy = (double)FIX2LONG(y);
    }
    else if (RB_TYPE_P(y, T_BIGNUM)) {
	dx = RFLOAT_VALUE(x);
	dy = rb_big2dbl(y);
    }
    else if (RB_TYPE_P(y, T_FLOAT)) {
	dx = RFLOAT_VALUE(x);
	dy = RFLOAT_VALUE(y);
	if (dx < 0 && dy != round(dy))
            return rb_dbl_complex_new_polar_pi(pow(-dx, dy), dy);
    }
    else {
	return rb_num_coerce_bin(x, y, idPow);
    }
    return DBL2NUM(pow(dx, dy));
}
  
    #+(other)  ⇒ Float   
Returns a new Float which is the sum of float and other.
# File 'numeric.c', line 1023
VALUE
rb_float_plus(VALUE x, VALUE y)
{
    if (RB_TYPE_P(y, T_FIXNUM)) {
	return DBL2NUM(RFLOAT_VALUE(x) + (double)FIX2LONG(y));
    }
    else if (RB_TYPE_P(y, T_BIGNUM)) {
	return DBL2NUM(RFLOAT_VALUE(x) + rb_big2dbl(y));
    }
    else if (RB_TYPE_P(y, T_FLOAT)) {
	return DBL2NUM(RFLOAT_VALUE(x) + RFLOAT_VALUE(y));
    }
    else {
	return rb_num_coerce_bin(x, y, '+');
    }
}
  
    #-(other)  ⇒ Float   
Returns a new Float which is the difference of float and other.
# File 'numeric.c', line 1047
VALUE
rb_float_minus(VALUE x, VALUE y)
{
    if (RB_TYPE_P(y, T_FIXNUM)) {
	return DBL2NUM(RFLOAT_VALUE(x) - (double)FIX2LONG(y));
    }
    else if (RB_TYPE_P(y, T_BIGNUM)) {
	return DBL2NUM(RFLOAT_VALUE(x) - rb_big2dbl(y));
    }
    else if (RB_TYPE_P(y, T_FLOAT)) {
	return DBL2NUM(RFLOAT_VALUE(x) - RFLOAT_VALUE(y));
    }
    else {
	return rb_num_coerce_bin(x, y, '-');
    }
}
  
    #-  ⇒ Float   
Returns float, negated.
# File 'numeric.c', line 1010
VALUE
rb_float_uminus(VALUE flt)
{
    return DBL2NUM(-RFLOAT_VALUE(flt));
}
  
    #/(other)  ⇒ Float   
Returns a new Float which is the result of dividing float by other.
# File 'numeric.c', line 1125
VALUE
rb_float_div(VALUE x, VALUE y)
{
    double num = RFLOAT_VALUE(x);
    double den;
    double ret;
    if (RB_TYPE_P(y, T_FIXNUM)) {
        den = FIX2LONG(y);
    }
    else if (RB_TYPE_P(y, T_BIGNUM)) {
        den = rb_big2dbl(y);
    }
    else if (RB_TYPE_P(y, T_FLOAT)) {
        den = RFLOAT_VALUE(y);
    }
    else {
	return rb_num_coerce_bin(x, y, '/');
    }
    ret = double_div_double(num, den);
    return DBL2NUM(ret);
}
  
    #<(real)  ⇒ Boolean   
Returns true if float is less than real.
The result of NaN < NaN is undefined, so an implementation-dependent value is returned.
# File 'numeric.c', line 1576
static VALUE
flo_lt(VALUE x, VALUE y)
{
    double a, b;
    a = RFLOAT_VALUE(x);
    if (RB_TYPE_P(y, T_FIXNUM) || RB_TYPE_P(y, T_BIGNUM)) {
        VALUE rel = rb_integer_float_cmp(y, x);
        if (FIXNUM_P(rel))
            return -FIX2LONG(rel) < 0 ? Qtrue : Qfalse;
        return Qfalse;
    }
    else if (RB_TYPE_P(y, T_FLOAT)) {
	b = RFLOAT_VALUE(y);
#if defined(_MSC_VER) && _MSC_VER < 1300
	if (isnan(b)) return Qfalse;
#endif
    }
    else {
	return rb_num_coerce_relop(x, y, '<');
    }
#if defined(_MSC_VER) && _MSC_VER < 1300
    if (isnan(a)) return Qfalse;
#endif
    return (a < b)?Qtrue:Qfalse;
}
  
    #<=(real)  ⇒ Boolean   
Returns true if float is less than or equal to real.
The result of NaN <= NaN is undefined, so an implementation-dependent value is returned.
# File 'numeric.c', line 1613
static VALUE
flo_le(VALUE x, VALUE y)
{
    double a, b;
    a = RFLOAT_VALUE(x);
    if (RB_TYPE_P(y, T_FIXNUM) || RB_TYPE_P(y, T_BIGNUM)) {
        VALUE rel = rb_integer_float_cmp(y, x);
        if (FIXNUM_P(rel))
            return -FIX2LONG(rel) <= 0 ? Qtrue : Qfalse;
        return Qfalse;
    }
    else if (RB_TYPE_P(y, T_FLOAT)) {
	b = RFLOAT_VALUE(y);
#if defined(_MSC_VER) && _MSC_VER < 1300
	if (isnan(b)) return Qfalse;
#endif
    }
    else {
	return rb_num_coerce_relop(x, y, idLE);
    }
#if defined(_MSC_VER) && _MSC_VER < 1300
    if (isnan(a)) return Qfalse;
#endif
    return (a <= b)?Qtrue:Qfalse;
}
  
    #<=>(real)  ⇒ 1, ...   
Returns -1, 0, or +1 depending on whether float is less than, equal to, or greater than real. This is the basis for the tests in the ::Comparable module.
The result of NaN <=> NaN is undefined, so an implementation-dependent value is returned.
nil is returned if the two values are incomparable.
# File 'numeric.c', line 1454
static VALUE
flo_cmp(VALUE x, VALUE y)
{
    double a, b;
    VALUE i;
    a = RFLOAT_VALUE(x);
    if (isnan(a)) return Qnil;
    if (RB_TYPE_P(y, T_FIXNUM) || RB_TYPE_P(y, T_BIGNUM)) {
        VALUE rel = rb_integer_float_cmp(y, x);
        if (FIXNUM_P(rel))
            return LONG2FIX(-FIX2LONG(rel));
        return rel;
    }
    else if (RB_TYPE_P(y, T_FLOAT)) {
	b = RFLOAT_VALUE(y);
    }
    else {
	if (isinf(a) && (i = rb_check_funcall(y, rb_intern("infinite?"), 0, 0)) != Qundef) {
	    if (RTEST(i)) {
		int j = rb_cmpint(i, x, y);
		j = (a > 0.0) ? (j > 0 ? 0 : +1) : (j < 0 ? 0 : -1);
		return INT2FIX(j);
	    }
	    if (a > 0.0) return INT2FIX(1);
	    return INT2FIX(-1);
	}
	return rb_num_coerce_cmp(x, y, id_cmp);
    }
    return rb_dbl_cmp(a, b);
}
  #==
[ GitHub ]#===
[ GitHub ]
    #>(real)  ⇒ Boolean   
Returns true if float is greater than real.
The result of NaN > NaN is undefined, so an implementation-dependent value is returned.
# File 'numeric.c', line 1502
VALUE
rb_float_gt(VALUE x, VALUE y)
{
    double a, b;
    a = RFLOAT_VALUE(x);
    if (RB_TYPE_P(y, T_FIXNUM) || RB_TYPE_P(y, T_BIGNUM)) {
        VALUE rel = rb_integer_float_cmp(y, x);
        if (FIXNUM_P(rel))
            return -FIX2LONG(rel) > 0 ? Qtrue : Qfalse;
        return Qfalse;
    }
    else if (RB_TYPE_P(y, T_FLOAT)) {
	b = RFLOAT_VALUE(y);
#if defined(_MSC_VER) && _MSC_VER < 1300
	if (isnan(b)) return Qfalse;
#endif
    }
    else {
	return rb_num_coerce_relop(x, y, '>');
    }
#if defined(_MSC_VER) && _MSC_VER < 1300
    if (isnan(a)) return Qfalse;
#endif
    return (a > b)?Qtrue:Qfalse;
}
  
    #>=(real)  ⇒ Boolean   
Returns true if float is greater than or equal to real.
The result of NaN >= NaN is undefined, so an implementation-dependent value is returned.
# File 'numeric.c', line 1539
static VALUE
flo_ge(VALUE x, VALUE y)
{
    double a, b;
    a = RFLOAT_VALUE(x);
    if (RB_TYPE_P(y, T_FIXNUM) || RB_TYPE_P(y, T_BIGNUM)) {
        VALUE rel = rb_integer_float_cmp(y, x);
        if (FIXNUM_P(rel))
            return -FIX2LONG(rel) >= 0 ? Qtrue : Qfalse;
        return Qfalse;
    }
    else if (RB_TYPE_P(y, T_FLOAT)) {
	b = RFLOAT_VALUE(y);
#if defined(_MSC_VER) && _MSC_VER < 1300
	if (isnan(b)) return Qfalse;
#endif
    }
    else {
	return rb_num_coerce_relop(x, y, idGE);
    }
#if defined(_MSC_VER) && _MSC_VER < 1300
    if (isnan(a)) return Qfalse;
#endif
    return (a >= b)?Qtrue:Qfalse;
}
  
    
      #abs  ⇒ Float 
      #magnitude  ⇒ Float 
    
    Also known as: #magnitude
  
Float 
      #magnitude  ⇒ Float 
    Returns the absolute value of float.
(-34.56).abs   #=> 34.56
-34.56.abs     #=> 34.56
34.56.abs      #=> 34.56#magnitude is an alias for abs.
# File 'numeric.c', line 1697
VALUE
rb_float_abs(VALUE flt)
{
    double val = fabs(RFLOAT_VALUE(flt));
    return DBL2NUM(val);
}
  
    
      #arg  ⇒ 0, Float 
      #angle  ⇒ 0, Float 
      #phase  ⇒ 0, Float 
    
  
0, Float 
      #angle  ⇒ 0, Float 
      #phase  ⇒ 0, Float 
    Alias for #arg.
    
      #arg  ⇒ 0, Float 
      #angle  ⇒ 0, Float 
      #phase  ⇒ 0, Float 
    
    Also known as: #angle, #phase
  
0, Float 
      #angle  ⇒ 0, Float 
      #phase  ⇒ 0, Float 
    Returns 0 if the value is positive, pi otherwise.
# File 'complex.c', line 2265
static VALUE
float_arg(VALUE self)
{
    if (isnan(RFLOAT_VALUE(self)))
	return self;
    if (f_tpositive_p(self))
	return INT2FIX(0);
    return rb_const_get(rb_mMath, id_PI);
}
  
    #ceil([ndigits])  ⇒ Integer, Float   
Returns the smallest number greater than or equal to float with a precision of ndigits decimal digits (default: 0).
When the precision is negative, the returned value is an integer with at least ndigits.abs trailing zeros.
Returns a floating point number when ndigits is positive, otherwise returns an integer.
1.2.ceil      #=> 2
2.0.ceil      #=> 2
(-1.2).ceil   #=> -1
(-2.0).ceil   #=> -2
1.234567.ceil(2)   #=> 1.24
1.234567.ceil(3)   #=> 1.235
1.234567.ceil(4)   #=> 1.2346
1.234567.ceil(5)   #=> 1.23457
34567.89.ceil(-5)  #=> 100000
34567.89.ceil(-4)  #=> 40000
34567.89.ceil(-3)  #=> 35000
34567.89.ceil(-2)  #=> 34600
34567.89.ceil(-1)  #=> 34570
34567.89.ceil(0)   #=> 34568
34567.89.ceil(1)   #=> 34567.9
34567.89.ceil(2)   #=> 34567.89
34567.89.ceil(3)   #=> 34567.89Note that the limited precision of floating point arithmetic might lead to surprising results:
(2.1 / 0.7).ceil  #=> 4 (!)# File 'numeric.c', line 2010
static VALUE
flo_ceil(int argc, VALUE *argv, VALUE num)
{
    int ndigits = 0;
    if (rb_check_arity(argc, 0, 1)) {
	ndigits = NUM2INT(argv[0]);
    }
    return rb_float_ceil(num, ndigits);
}
  #coerce(numeric) ⇒ Array
Returns an array with both numeric and float represented as Float objects.
This is achieved by converting numeric to a Float.
1.2.coerce(3)       #=> [3.0, 1.2]
2.5.coerce(1.1)     #=> [1.1, 2.5]# File 'numeric.c', line 997
static VALUE
flo_coerce(VALUE x, VALUE y)
{
    return rb_assoc_new(rb_Float(y), x);
}
  #denominator ⇒ Integer
Returns the denominator (always positive). The result is machine dependent.
See also #numerator.
# File 'rational.c', line 2115
VALUE
rb_float_denominator(VALUE self)
{
    double d = RFLOAT_VALUE(self);
    VALUE r;
    if (isinf(d) || isnan(d))
	return INT2FIX(1);
    r = float_to_r(self);
    if (canonicalization && k_integer_p(r)) {
	return ONE;
    }
    return nurat_denominator(r);
}
  #divmod(numeric) ⇒ Array
See Numeric#divmod.
42.0.divmod(6)   #=> [7, 0.0]
42.0.divmod(5)   #=> [8, 2.0]# File 'numeric.c', line 1264
static VALUE
flo_divmod(VALUE x, VALUE y)
{
    double fy, div, mod;
    volatile VALUE a, b;
    if (RB_TYPE_P(y, T_FIXNUM)) {
	fy = (double)FIX2LONG(y);
    }
    else if (RB_TYPE_P(y, T_BIGNUM)) {
	fy = rb_big2dbl(y);
    }
    else if (RB_TYPE_P(y, T_FLOAT)) {
	fy = RFLOAT_VALUE(y);
    }
    else {
	return rb_num_coerce_bin(x, y, id_divmod);
    }
    flodivmod(RFLOAT_VALUE(x), fy, &div, &mod);
    a = dbl2ival(div);
    b = DBL2NUM(mod);
    return rb_assoc_new(a, b);
}
  
    #eql?  ⇒ Boolean 
  
    
      #fdiv(numeric)  ⇒ Float 
      #quo(numeric)  ⇒ Float 
    
  
Float 
      #quo(numeric)  ⇒ Float 
    Alias for #quo.
    #floor([ndigits])  ⇒ Integer, Float   
Returns the largest number less than or equal to float with a precision of ndigits decimal digits (default: 0).
When the precision is negative, the returned value is an integer with at least ndigits.abs trailing zeros.
Returns a floating point number when ndigits is positive, otherwise returns an integer.
1.2.floor      #=> 1
2.0.floor      #=> 2
(-1.2).floor   #=> -2
(-2.0).floor   #=> -2
1.234567.floor(2)   #=> 1.23
1.234567.floor(3)   #=> 1.234
1.234567.floor(4)   #=> 1.2345
1.234567.floor(5)   #=> 1.23456
34567.89.floor(-5)  #=> 0
34567.89.floor(-4)  #=> 30000
34567.89.floor(-3)  #=> 34000
34567.89.floor(-2)  #=> 34500
34567.89.floor(-1)  #=> 34560
34567.89.floor(0)   #=> 34567
34567.89.floor(1)   #=> 34567.8
34567.89.floor(2)   #=> 34567.89
34567.89.floor(3)   #=> 34567.89Note that the limited precision of floating point arithmetic might lead to surprising results:
(0.3 / 0.1).floor  #=> 2 (!)# File 'numeric.c', line 1961
static VALUE
flo_floor(int argc, VALUE *argv, VALUE num)
{
    int ndigits = 0;
    if (rb_check_arity(argc, 0, 1)) {
	ndigits = NUM2INT(argv[0]);
    }
    return rb_float_floor(num, ndigits);
}
  #hash ⇒ Integer
Returns a hash code for this float.
See also Object#hash.
# File 'numeric.c', line 1418
static VALUE
flo_hash(VALUE num)
{
    return rb_dbl_hash(RFLOAT_VALUE(num));
}
  Alias for #to_s.
    
      #abs  ⇒ Float 
      #magnitude  ⇒ Float 
    
  
Float 
      #magnitude  ⇒ Float 
    Alias for #abs.
    
      #%(other)  ⇒ Float 
      #modulo(other)  ⇒ Float 
    
  
Float 
      #modulo(other)  ⇒ Float 
    Alias for #%.
    #next_float  ⇒ Float   
Returns the next representable floating point number.
Float::MAX.next_float and Float::INFINITY.next_float is INFINITY.
Float::NAN.next_float is NAN.
For example:
0.01.next_float    #=> 0.010000000000000002
1.0.next_float     #=> 1.0000000000000002
100.0.next_float   #=> 100.00000000000001
0.01.next_float - 0.01     #=> 1.734723475976807e-18
1.0.next_float - 1.0       #=> 2.220446049250313e-16
100.0.next_float - 100.0   #=> 1.4210854715202004e-14
f = 0.01; 20.times { printf "%-20a %s\n", f, f.to_s; f = f.next_float }
#=> 0x1.47ae147ae147bp-7 0.01
#   0x1.47ae147ae147cp-7 0.010000000000000002
#   0x1.47ae147ae147dp-7 0.010000000000000004
#   0x1.47ae147ae147ep-7 0.010000000000000005
#   0x1.47ae147ae147fp-7 0.010000000000000007
#   0x1.47ae147ae148p-7  0.010000000000000009
#   0x1.47ae147ae1481p-7 0.01000000000000001
#   0x1.47ae147ae1482p-7 0.010000000000000012
#   0x1.47ae147ae1483p-7 0.010000000000000014
#   0x1.47ae147ae1484p-7 0.010000000000000016
#   0x1.47ae147ae1485p-7 0.010000000000000018
#   0x1.47ae147ae1486p-7 0.01000000000000002
#   0x1.47ae147ae1487p-7 0.010000000000000021
#   0x1.47ae147ae1488p-7 0.010000000000000023
#   0x1.47ae147ae1489p-7 0.010000000000000024
#   0x1.47ae147ae148ap-7 0.010000000000000026
#   0x1.47ae147ae148bp-7 0.010000000000000028
#   0x1.47ae147ae148cp-7 0.01000000000000003
#   0x1.47ae147ae148dp-7 0.010000000000000031
#   0x1.47ae147ae148ep-7 0.010000000000000033
f = 0.0
100.times { f += 0.1 }
f                           #=> 9.99999999999998       # should be 10.0 in the ideal world.
10-f                        #=> 1.9539925233402755e-14 # the floating point error.
10.0.next_float-10          #=> 1.7763568394002505e-15 # 1 ulp (unit in the last place).
(10-f)/(10.0.next_float-10) #=> 11.0                   # the error is 11 ulp.
(10-f)/(10*Float::EPSILON)  #=> 8.8                    # approximation of the above.
"%a" % 10                   #=> "0x1.4p+3"
"%a" % f                    #=> "0x1.3fffffffffff5p+3" # the last hex digit is 5.  16 - 5 = 11 ulp.# File 'numeric.c', line 1837
static VALUE
flo_next_float(VALUE vx)
{
    double x, y;
    x = NUM2DBL(vx);
    y = nextafter(x, HUGE_VAL);
    return DBL2NUM(y);
}
  #numerator ⇒ Integer
Returns the numerator. The result is machine dependent.
n = 0.3.numerator    #=> 5404319552844595
d = 0.3.denominator  #=> 18014398509481984
n.fdiv(d)            #=> 0.3See also #denominator.
# File 'rational.c', line 2092
VALUE
rb_float_numerator(VALUE self)
{
    double d = RFLOAT_VALUE(self);
    VALUE r;
    if (isinf(d) || isnan(d))
	return self;
    r = float_to_r(self);
    if (canonicalization && k_integer_p(r)) {
	return r;
    }
    return nurat_numerator(r);
}
  
    
      #arg  ⇒ 0, Float 
      #angle  ⇒ 0, Float 
      #phase  ⇒ 0, Float 
    
  
0, Float 
      #angle  ⇒ 0, Float 
      #phase  ⇒ 0, Float 
    Alias for #arg.
    #prev_float  ⇒ Float   
Returns the previous representable floating point number.
(-Float::MAX).prev_float and (-Float::INFINITY).prev_float is -Float::INFINITY.
Float::NAN.prev_float is NAN.
For example:
0.01.prev_float    #=> 0.009999999999999998
1.0.prev_float     #=> 0.9999999999999999
100.0.prev_float   #=> 99.99999999999999
0.01 - 0.01.prev_float     #=> 1.734723475976807e-18
1.0 - 1.0.prev_float       #=> 1.1102230246251565e-16
100.0 - 100.0.prev_float   #=> 1.4210854715202004e-14
f = 0.01; 20.times { printf "%-20a %s\n", f, f.to_s; f = f.prev_float }
#=> 0x1.47ae147ae147bp-7 0.01
#   0x1.47ae147ae147ap-7 0.009999999999999998
#   0x1.47ae147ae1479p-7 0.009999999999999997
#   0x1.47ae147ae1478p-7 0.009999999999999995
#   0x1.47ae147ae1477p-7 0.009999999999999993
#   0x1.47ae147ae1476p-7 0.009999999999999992
#   0x1.47ae147ae1475p-7 0.00999999999999999
#   0x1.47ae147ae1474p-7 0.009999999999999988
#   0x1.47ae147ae1473p-7 0.009999999999999986
#   0x1.47ae147ae1472p-7 0.009999999999999985
#   0x1.47ae147ae1471p-7 0.009999999999999983
#   0x1.47ae147ae147p-7  0.009999999999999981
#   0x1.47ae147ae146fp-7 0.00999999999999998
#   0x1.47ae147ae146ep-7 0.009999999999999978
#   0x1.47ae147ae146dp-7 0.009999999999999976
#   0x1.47ae147ae146cp-7 0.009999999999999974
#   0x1.47ae147ae146bp-7 0.009999999999999972
#   0x1.47ae147ae146ap-7 0.00999999999999997
#   0x1.47ae147ae1469p-7 0.009999999999999969
#   0x1.47ae147ae1468p-7 0.009999999999999967# File 'numeric.c', line 1888
static VALUE
flo_prev_float(VALUE vx)
{
    double x, y;
    x = NUM2DBL(vx);
    y = nextafter(x, -HUGE_VAL);
    return DBL2NUM(y);
}
  
    
      #fdiv(numeric)  ⇒ Float 
      #quo(numeric)  ⇒ Float 
    
    Also known as: #fdiv
  
Float 
      #quo(numeric)  ⇒ Float 
    Returns float / numeric, same as #/.
# File 'numeric.c', line 1157
static VALUE
flo_quo(VALUE x, VALUE y)
{
    return num_funcall1(x, '/', y);
}
  #rationalize([eps]) ⇒ Rational
Returns a simpler approximation of the value (flt-|eps| <= result <= flt+|eps|).  If the optional argument eps is not given, it will be chosen automatically.
0.3.rationalize          #=> (3/10)
1.333.rationalize        #=> (1333/1000)
1.333.rationalize(0.01)  #=> (4/3)See also #to_r.
# File 'rational.c', line 2298
static VALUE
float_rationalize(int argc, VALUE *argv, VALUE self)
{
    double d = RFLOAT_VALUE(self);
    if (d < 0.0)
        return rb_rational_uminus(float_rationalize(argc, argv, DBL2NUM(-d)));
    if (rb_check_arity(argc, 0, 1)) {
        return rb_flt_rationalize_with_prec(self, argv[0]);
    }
    else {
        return rb_flt_rationalize(self);
    }
}
  
    #round([ndigits] [, half: mode])  ⇒ Integer, Float   
Returns float rounded to the nearest value with a precision of ndigits decimal digits (default: 0).
When the precision is negative, the returned value is an integer with at least ndigits.abs trailing zeros.
Returns a floating point number when ndigits is positive, otherwise returns an integer.
1.4.round      #=> 1
1.5.round      #=> 2
1.6.round      #=> 2
(-1.5).round   #=> -2
1.234567.round(2)   #=> 1.23
1.234567.round(3)   #=> 1.235
1.234567.round(4)   #=> 1.2346
1.234567.round(5)   #=> 1.23457
34567.89.round(-5)  #=> 0
34567.89.round(-4)  #=> 30000
34567.89.round(-3)  #=> 35000
34567.89.round(-2)  #=> 34600
34567.89.round(-1)  #=> 34570
34567.89.round(0)   #=> 34568
34567.89.round(1)   #=> 34567.9
34567.89.round(2)   #=> 34567.89
34567.89.round(3)   #=> 34567.89If the optional half keyword argument is given, numbers that are half-way between two possible rounded values will be rounded according to the specified tie-breaking mode:
- 
:upornil: round half away from zero (default)
- 
:down: round half toward zero
- 
:even: round half toward the nearest even number2.5.round(half: :up) #=> 3 2.5.round(half: :down) #=> 2 2.5.round(half: :even) #=> 2 3.5.round(half: :up) #=> 4 3.5.round(half: :down) #=> 3 3.5.round(half: :even) #=> 4 (-2.5).round(half: :up) #=> -3 (-2.5).round(half: :down) #=> -2 (-2.5).round(half: :even) #=> -2
# File 'numeric.c', line 2270
static VALUE
flo_round(int argc, VALUE *argv, VALUE num)
{
    double number, f, x;
    VALUE nd, opt;
    int ndigits = 0;
    enum ruby_num_rounding_mode mode;
    if (rb_scan_args(argc, argv, "01:", &nd, &opt)) {
	ndigits = NUM2INT(nd);
    }
    mode = rb_num_get_rounding_option(opt);
    number = RFLOAT_VALUE(num);
    if (number == 0.0) {
	return ndigits > 0 ? DBL2NUM(number) : INT2FIX(0);
    }
    if (ndigits < 0) {
	return rb_int_round(flo_to_i(num), ndigits, mode);
    }
    if (ndigits == 0) {
	x = ROUND_CALL(mode, round, (number, 1.0));
	return dbl2ival(x);
    }
    if (isfinite(number)) {
	int binexp;
	frexp(number, &binexp);
	if (float_round_overflow(ndigits, binexp)) return num;
	if (float_round_underflow(ndigits, binexp)) return DBL2NUM(0);
	f = pow(10, ndigits);
	x = ROUND_CALL(mode, round, (number, f));
	return DBL2NUM(x / f);
    }
    return num;
}
  
    #to_f  ⇒ self   
Since float is already a Float, returns self.
# File 'numeric.c', line 1677
static VALUE
flo_to_f(VALUE num)
{
    return num;
}
  Also known as: #to_int
# File 'numeric.c', line 2360
static VALUE
flo_to_i(VALUE num)
{
    double f = RFLOAT_VALUE(num);
    if (f > 0.0) f = floor(f);
    if (f < 0.0) f = ceil(f);
    return dbl2ival(f);
}
  Alias for #to_i.
#to_r ⇒ Rational
Returns the value as a rational.
2.0.to_r    #=> (2/1)
2.5.to_r    #=> (5/2)
-0.75.to_r  #=> (-3/4)
0.0.to_r    #=> (0/1)
0.3.to_r    #=> (5404319552844595/18014398509481984)NOTE: 0.3.to_r isn’t the same as “0.3”.to_r. The latter is equivalent to “3/10”.to_r, but the former isn’t so.
0.3.to_r   == 3/10r  #=> false
"0.3".to_r == 3/10r  #=> trueSee also #rationalize.
# File 'rational.c', line 2215
static VALUE
float_to_r(VALUE self)
{
    VALUE f;
    int n;
    float_decode_internal(self, &f, &n);
#if FLT_RADIX == 2
    if (n == 0)
        return rb_rational_new1(f);
    if (n > 0)
        return rb_rational_new1(rb_int_lshift(f, INT2FIX(n)));
    n = -n;
    return rb_rational_new2(f, rb_int_lshift(ONE, INT2FIX(n)));
#else
    f = rb_int_mul(f, rb_int_pow(INT2FIX(FLT_RADIX), n));
    if (RB_TYPE_P(f, T_RATIONAL))
	return f;
    return rb_rational_new1(f);
#endif
}
  #to_s ⇒ String Also known as: #inspect
Returns a string containing a representation of self. As well as a fixed or exponential form of the float, the call may return NaN, Infinity, and -Infinity.
# File 'numeric.c', line 913
static VALUE
flo_to_s(VALUE flt)
{
    enum {decimal_mant = DBL_MANT_DIG-DBL_DIG};
    enum {float_dig = DBL_DIG+1};
    char buf[float_dig + (decimal_mant + CHAR_BIT - 1) / CHAR_BIT + 10];
    double value = RFLOAT_VALUE(flt);
    VALUE s;
    char *p, *e;
    int sign, decpt, digs;
    if (isinf(value)) {
	static const char minf[] = "-Infinity";
	const int pos = (value > 0); /* skip "-" */
	return rb_usascii_str_new(minf+pos, strlen(minf)-pos);
    }
    else if (isnan(value))
	return rb_usascii_str_new2("NaN");
    p = ruby_dtoa(value, 0, 0, &decpt, &sign, &e);
    s = sign ? rb_usascii_str_new_cstr("-") : rb_usascii_str_new(0, 0);
    if ((digs = (int)(e - p)) >= (int)sizeof(buf)) digs = (int)sizeof(buf) - 1;
    memcpy(buf, p, digs);
    xfree(p);
    if (decpt > 0) {
	if (decpt < digs) {
	    memmove(buf + decpt + 1, buf + decpt, digs - decpt);
	    buf[decpt] = '.';
	    rb_str_cat(s, buf, digs + 1);
	}
	else if (decpt <= DBL_DIG) {
	    long len;
	    char *ptr;
	    rb_str_cat(s, buf, digs);
	    rb_str_resize(s, (len = RSTRING_LEN(s)) + decpt - digs + 2);
	    ptr = RSTRING_PTR(s) + len;
	    if (decpt > digs) {
		memset(ptr, '0', decpt - digs);
		ptr += decpt - digs;
	    }
	    memcpy(ptr, ".0", 2);
	}
	else {
	    goto exp;
	}
    }
    else if (decpt > -4) {
	long len;
	char *ptr;
	rb_str_cat(s, "0.", 2);
	rb_str_resize(s, (len = RSTRING_LEN(s)) - decpt + digs);
	ptr = RSTRING_PTR(s);
	memset(ptr += len, '0', -decpt);
	memcpy(ptr -= decpt, buf, digs);
    }
    else {
      exp:
	if (digs > 1) {
	    memmove(buf + 2, buf + 1, digs - 1);
	}
	else {
	    buf[2] = '0';
	    digs++;
	}
	buf[1] = '.';
	rb_str_cat(s, buf, digs + 1);
	rb_str_catf(s, "e%+03d", decpt - 1);
    }
    return s;
}
  
    #truncate([ndigits])  ⇒ Integer, Float   
Returns float truncated (toward zero) to a precision of ndigits decimal digits (default: 0).
When the precision is negative, the returned value is an integer with at least ndigits.abs trailing zeros.
Returns a floating point number when ndigits is positive, otherwise returns an integer.
2.8.truncate           #=> 2
(-2.8).truncate        #=> -2
1.234567.truncate(2)   #=> 1.23
34567.89.truncate(-2)  #=> 34500Note that the limited precision of floating point arithmetic might lead to surprising results:
(0.3 / 0.1).truncate  #=> 2 (!)# File 'numeric.c', line 2394
static VALUE
flo_truncate(int argc, VALUE *argv, VALUE num)
{
    if (signbit(RFLOAT_VALUE(num)))
	return flo_ceil(argc, argv, num);
    else
	return flo_floor(argc, argv, num);
}