зеркало из https://github.com/github/ruby.git
bigdecimal: version 1.3.2
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:
Родитель
ea7af54e73
Коммит
65285fbdb8
|
@ -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
|
||||
|
|
Загрузка…
Ссылка в новой задаче