Import bigdecimal version 1.3.2.  The full commit log is here:

  https://github.com/ruby/bigdecimal/compare/v1.3.1...v1.3.2

This fixes [ruby-core:79603] [Bug #13232]

git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@57951 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
This commit is contained in:
mrkn 2017-03-13 06:03:18 +00:00
Родитель ea7af54e73
Коммит 65285fbdb8
6 изменённых файлов: 106 добавлений и 80 удалений

Просмотреть файл

@ -231,6 +231,7 @@ static inline VALUE BigDecimal_div2(VALUE, VALUE, VALUE);
static Real*
GetVpValueWithPrec(VALUE v, long prec, int must)
{
ENTER(1);
Real *pv;
VALUE num, bg;
char szD[128];
@ -295,6 +296,7 @@ again:
case T_BIGNUM:
bg = rb_big2str(v, 10);
PUSH(bg);
return VpCreateRbObject(strlen(RSTRING_PTR(bg)) + VpBaseFig() + 1,
RSTRING_PTR(bg));
default:
@ -1318,25 +1320,14 @@ BigDecimal_divide(Real **c, Real **res, Real **div, VALUE self, VALUE r)
return Qnil;
}
/* call-seq:
* div(value, digits)
* quo(value)
*
* Divide by the specified value.
*
* e.g.
* c = a.div(b,n)
*
* digits:: If specified and less than the number of significant digits of the
* result, the result is rounded to that number of digits, according
* to BigDecimal.mode.
*
* If digits is 0, the result is the same as the / operator. If not, the
* result is an integer BigDecimal, by analogy with Float#div.
*
* The alias quo is provided since <code>div(value, 0)</code> is the same as
* computing the quotient; see BigDecimal#divmod.
*/
/* call-seq:
* a / b -> bigdecimal
* quo(value) -> bigdecimal
*
* Divide by the specified value.
*
* See BigDecimal#div.
*/
static VALUE
BigDecimal_div(VALUE self, VALUE r)
/* For c = self/r: with round operation */
@ -1602,6 +1593,37 @@ BigDecimal_div2(VALUE self, VALUE b, VALUE n)
}
}
/*
* Document-method: BigDecimal#div
*
* call-seq:
* div(value, digits) -> bigdecimal or integer
*
* Divide by the specified value.
*
* digits:: If specified and less than the number of significant digits of the
* result, the result is rounded to that number of digits, according
* to BigDecimal.mode.
*
* If digits is 0, the result is the same as for the / operator
* or #quo.
*
* If digits is not specified, the result is an integer,
* by analogy with Float#div; see also BigDecimal#divmod.
*
* Examples:
*
* a = BigDecimal("4")
* b = BigDecimal("3")
*
* a.div(b, 3) # => 0.133e1
*
* a.div(b, 0) # => 0.1333333333333333333e1
* a / b # => 0.1333333333333333333e1
* a.quo(b) # => 0.1333333333333333333e1
*
* a.div(b) # => 1
*/
static VALUE
BigDecimal_div3(int argc, VALUE *argv, VALUE self)
{
@ -3193,6 +3215,19 @@ get_vp_value:
* Note also that in mathematics, there is no particular concept of negative
* or positive zero; true mathematical zero has no sign.
*
* == bigdecimal/util
*
* When you require +bigdecimal/util+, the #to_d method will be
* available on BigDecimal and the native Integer, Float, Rational,
* and String classes:
*
* require 'bigdecimal/util'
*
* 42.to_d # => 0.42e2
* 0.5.to_d # => 0.5e0
* (2/3r).to_d(3) # => 0.667e0
* "0.5".to_d # => 0.5e0
*
* == License
*
* Copyright (C) 2002 by Shigeo Kobayashi <shigeo@tinyforest.gr.jp>.

Просмотреть файл

@ -1,5 +1,5 @@
# coding: utf-8
_VERSION = '1.3.1'
_VERSION = '1.3.2'
Gem::Specification.new do |s|
s.name = "bigdecimal"
@ -33,4 +33,5 @@ Gem::Specification.new do |s|
s.add_development_dependency "rake", "~> 10.0"
s.add_development_dependency "rake-compiler", "~> 0.9"
s.add_development_dependency "minitest", "~> 4.7.5"
s.add_development_dependency "pry"
end

Просмотреть файл

@ -9,6 +9,8 @@
#ifndef RUBY_BIG_DECIMAL_H
#define RUBY_BIG_DECIMAL_H 1
#define RUBY_NO_OLD_COMPATIBILITY
#include "ruby/ruby.h"
#include <float.h>

Просмотреть файл

@ -15,12 +15,3 @@ have_func("rb_array_const_ptr", "ruby.h")
have_func("rb_sym2str", "ruby.h")
create_makefile('bigdecimal')
# Add additional dependencies
open('Makefile', 'a') do |io|
if RUBY_VERSION >= '2.4'
io.puts <<-MAKEFILE
bigdecimal.o: $(hdrdir)/ruby/backward.h
MAKEFILE
end
end

Просмотреть файл

@ -1,66 +1,68 @@
# frozen_string_literal: false
#
#--
# bigdecimal/util extends various native classes to provide the #to_d method,
# and provides BigDecimal#to_d and BigDecimal#to_digits.
#++
# bigdecimal/util extends the native Integer class to provide the #to_d method.
#
# When you require 'bigdecimal/util' in your application, this method will
# be available on Integer objects.
class Integer < Numeric
# call-seq:
# int.to_d -> bigdecimal
#
# Convert +int+ to a BigDecimal and return it.
# Returns the value of +int+ as a BigDecimal.
#
# require 'bigdecimal'
# require 'bigdecimal/util'
#
# 42.to_d
# # => 0.42e2
# 42.to_d # => 0.42e2
#
# See also BigDecimal::new.
#
def to_d
BigDecimal(self)
end
end
# bigdecimal/util extends the native Float class to provide the #to_d method.
#
# When you require 'bigdecimal/util' in your application, this method will be
# available on Float objects.
class Float < Numeric
# call-seq:
# flt.to_d -> bigdecimal
# float.to_d -> bigdecimal
# float.to_d(precision) -> bigdecimal
#
# Convert +flt+ to a BigDecimal and return it.
# Returns the value of +float+ as a BigDecimal.
# The +precision+ parameter is used to determine the number of
# significant digits for the result (the default is Float::DIG).
#
# require 'bigdecimal'
# require 'bigdecimal/util'
#
# 0.5.to_d
# # => 0.5e0
# 0.5.to_d # => 0.5e0
# 1.234.to_d(2) # => 0.12e1
#
# See also BigDecimal::new.
#
def to_d(precision=nil)
BigDecimal(self, precision || Float::DIG)
end
end
# bigdecimal/util extends the native String class to provide the #to_d method.
#
# When you require 'bigdecimal/util' in your application, this method will be
# available on String objects.
class String
# call-seq:
# string.to_d -> bigdecimal
# str.to_d -> bigdecimal
#
# Convert +string+ to a BigDecimal and return it.
# Returns the result of interpreting leading characters in +str+
# as a BigDecimal.
#
# require 'bigdecimal'
# require 'bigdecimal/util'
#
# "0.5".to_d
# # => 0.5e0
# "0.5".to_d # => 0.5e0
# "123.45e1".to_d # => 0.12345e4
# "45.67 degrees".to_d # => 0.4567e2
#
# See also BigDecimal::new.
#
def to_d
begin
@ -71,11 +73,7 @@ class String
end
end
# bigdecimal/util extends the BigDecimal class to provide the #to_digits and
# #to_d methods.
#
# When you require 'bigdecimal/util' in your application, these methods will be
# available on BigDecimal objects.
class BigDecimal < Numeric
# call-seq:
# a.to_digits -> string
@ -83,12 +81,11 @@ class BigDecimal < Numeric
# Converts a BigDecimal to a String of the form "nnnnnn.mmm".
# This method is deprecated; use BigDecimal#to_s("F") instead.
#
# require 'bigdecimal'
# require 'bigdecimal/util'
#
# d = BigDecimal.new("3.14")
# d.to_digits
# # => "3.14"
# d.to_digits # => "3.14"
#
def to_digits
if self.nan? || self.infinite? || self.zero?
self.to_s
@ -103,35 +100,35 @@ class BigDecimal < Numeric
# a.to_d -> bigdecimal
#
# Returns self.
#
# require 'bigdecimal/util'
#
# d = BigDecimal.new("3.14")
# d.to_d # => 0.314e1
#
def to_d
self
end
end
# bigdecimal/util extends the native Rational class to provide the #to_d method.
#
# When you require 'bigdecimal/util' in your application, this method will be
# available on Rational objects.
class Rational < Numeric
# call-seq:
# r.to_d(precision) -> bigdecimal
# rat.to_d(precision) -> bigdecimal
#
# Converts a Rational to a BigDecimal.
# Returns the value as a BigDecimal.
#
# The required +precision+ parameter is used to determine the amount of
# significant digits for the result. See BigDecimal#div for more information,
# as it is used along with the #denominator and the +precision+ for
# parameters.
# The required +precision+ parameter is used to determine the number of
# significant digits for the result.
#
# require 'bigdecimal'
# require 'bigdecimal/util'
#
# Rational(22, 7).to_d(3) # => 0.314e1
#
# See also BigDecimal::new.
#
# r = (22/7.0).to_r
# # => (7077085128725065/2251799813685248)
# r.to_d(3)
# # => 0.314e1
def to_d(precision)
if precision <= 0
raise ArgumentError, "negative precision"
end
num = self.numerator
BigDecimal(num).div(self.denominator, precision)
BigDecimal(self, precision)
end
end

Просмотреть файл

@ -42,7 +42,7 @@ class TestBigDecimalUtil < Test::Unit::TestCase
end
def test_Rational_to_d_with_zero_precision
assert_raise(ArgumentError) { 355.quo(113).to_d(0) }
assert_equal(BigDecimal(355.quo(113), 0), 355.quo(113).to_d(0))
end
def test_Rational_to_d_with_negative_precision