Bug #2318 ยป big_decimal.diff
| bigdecimal.c (working copy) | ||
|---|---|---|
|
*/
|
||
|
#define DoSomeOne(x,y,f) rb_num_coerce_bin(x,y,f)
|
||
|
#if 0
|
||
|
/* BigDecimal provides arbitrary-precision floating point decimal arithmetic.
|
||
|
*
|
||
|
* Copyright (C) 2002 by Shigeo Kobayashi <shigeo@tinyforest.gr.jp>.
|
||
|
* You may distribute under the terms of either the GNU General Public
|
||
|
* License or the Artistic License, as specified in the README file
|
||
|
* of the BigDecimal distribution.
|
||
|
*
|
||
|
* Documented by mathew <meta@pobox.com>.
|
||
|
*
|
||
|
* = Introduction
|
||
|
*
|
||
|
* Ruby provides built-in support for arbitrary precision integer arithmetic.
|
||
|
* For example:
|
||
|
*
|
||
|
* 42**13 -> 1265437718438866624512
|
||
|
*
|
||
|
* BigDecimal provides similar support for very large or very accurate floating
|
||
|
* point numbers.
|
||
|
*
|
||
|
* Decimal arithmetic is also useful for general calculation, because it
|
||
|
* provides the correct answers people expect--whereas normal binary floating
|
||
|
* point arithmetic often introduces subtle errors because of the conversion
|
||
|
* between base 10 and base 2. For example, try:
|
||
|
*
|
||
|
* sum = 0
|
||
|
* for i in (1..10000)
|
||
|
* sum = sum + 0.0001
|
||
|
* end
|
||
|
* print sum
|
||
|
*
|
||
|
* and contrast with the output from:
|
||
|
*
|
||
|
* require 'bigdecimal'
|
||
|
*
|
||
|
* sum = BigDecimal.new("0")
|
||
|
* for i in (1..10000)
|
||
|
* sum = sum + BigDecimal.new("0.0001")
|
||
|
* end
|
||
|
* print sum
|
||
|
*
|
||
|
* Similarly:
|
||
|
*
|
||
|
* (BigDecimal.new("1.2") - BigDecimal("1.0")) == BigDecimal("0.2") -> true
|
||
|
*
|
||
|
* (1.2 - 1.0) == 0.2 -> false
|
||
|
*
|
||
|
* = Special features of accurate decimal arithmetic
|
||
|
*
|
||
|
* Because BigDecimal is more accurate than normal binary floating point
|
||
|
* arithmetic, it requires some special values.
|
||
|
*
|
||
|
* == Infinity
|
||
|
*
|
||
|
* BigDecimal sometimes needs to return infinity, for example if you divide
|
||
|
* a value by zero.
|
||
|
*
|
||
|
* BigDecimal.new("1.0") / BigDecimal.new("0.0") -> infinity
|
||
|
*
|
||
|
* BigDecimal.new("-1.0") / BigDecimal.new("0.0") -> -infinity
|
||
|
*
|
||
|
* You can represent infinite numbers to BigDecimal using the strings
|
||
|
* 'Infinity', '+Infinity' and '-Infinity' (case-sensitive)
|
||
|
*
|
||
|
* == Not a Number
|
||
|
*
|
||
|
* When a computation results in an undefined value, the special value NaN
|
||
|
* (for 'not a number') is returned.
|
||
|
*
|
||
|
* Example:
|
||
|
*
|
||
|
* BigDecimal.new("0.0") / BigDecimal.new("0.0") -> NaN
|
||
|
*
|
||
|
* You can also create undefined values. NaN is never considered to be the
|
||
|
* same as any other value, even NaN itself:
|
||
|
*
|
||
|
* n = BigDecimal.new('NaN')
|
||
|
*
|
||
|
* n == 0.0 -> nil
|
||
|
*
|
||
|
* n == n -> nil
|
||
|
*
|
||
|
* == Positive and negative zero
|
||
|
*
|
||
|
* If a computation results in a value which is too small to be represented as
|
||
|
* a BigDecimal within the currently specified limits of precision, zero must
|
||
|
* be returned.
|
||
|
*
|
||
|
* If the value which is too small to be represented is negative, a BigDecimal
|
||
|
* value of negative zero is returned. If the value is positive, a value of
|
||
|
* positive zero is returned.
|
||
|
*
|
||
|
* BigDecimal.new("1.0") / BigDecimal.new("-Infinity") -> -0.0
|
||
|
*
|
||
|
* BigDecimal.new("1.0") / BigDecimal.new("Infinity") -> 0.0
|
||
|
*
|
||
|
* (See BigDecimal.mode for how to specify limits of precision.)
|
||
|
*
|
||
|
* Note that -0.0 and 0.0 are considered to be the same for the purposes of
|
||
|
* comparison.
|
||
|
*
|
||
|
* Note also that in mathematics, there is no particular concept of negative
|
||
|
* or positive zero; true mathematical zero has no sign.
|
||
|
*/
|
||
|
void
|
||
|
Init_BigDecimal()
|
||
|
{
|
||
|
/* This is a #if-ed out function to fool Rdoc into documenting the class. */
|
||
|
/* The real init function is Init_bigdecimal() further down. */
|
||
|
}
|
||
|
#endif
|
||
|
/*
|
||
|
* Returns the BigDecimal version number.
|
||
|
*
|
||
| ... | ... | |
|
return INT2FIX(s);
|
||
|
}
|
||
|
/* Document-class: BigDecimal
|
||
|
* BigDecimal provides arbitrary-precision floating point decimal arithmetic.
|
||
|
*
|
||
|
* Copyright (C) 2002 by Shigeo Kobayashi <shigeo@tinyforest.gr.jp>.
|
||
|
* You may distribute under the terms of either the GNU General Public
|
||
|
* License or the Artistic License, as specified in the README file
|
||
|
* of the BigDecimal distribution.
|
||
|
*
|
||
|
* Documented by mathew <meta@pobox.com>.
|
||
|
*
|
||
|
* = Introduction
|
||
|
*
|
||
|
* Ruby provides built-in support for arbitrary precision integer arithmetic.
|
||
|
* For example:
|
||
|
*
|
||
|
* 42**13 -> 1265437718438866624512
|
||
|
*
|
||
|
* BigDecimal provides similar support for very large or very accurate floating
|
||
|
* point numbers.
|
||
|
*
|
||
|
* Decimal arithmetic is also useful for general calculation, because it
|
||
|
* provides the correct answers people expect--whereas normal binary floating
|
||
|
* point arithmetic often introduces subtle errors because of the conversion
|
||
|
* between base 10 and base 2. For example, try:
|
||
|
*
|
||
|
* sum = 0
|
||
|
* for i in (1..10000)
|
||
|
* sum = sum + 0.0001
|
||
|
* end
|
||
|
* print sum
|
||
|
*
|
||
|
* and contrast with the output from:
|
||
|
*
|
||
|
* require 'bigdecimal'
|
||
|
*
|
||
|
* sum = BigDecimal.new("0")
|
||
|
* for i in (1..10000)
|
||
|
* sum = sum + BigDecimal.new("0.0001")
|
||
|
* end
|
||
|
* print sum
|
||
|
*
|
||
|
* Similarly:
|
||
|
*
|
||
|
* (BigDecimal.new("1.2") - BigDecimal("1.0")) == BigDecimal("0.2") -> true
|
||
|
*
|
||
|
* (1.2 - 1.0) == 0.2 -> false
|
||
|
*
|
||
|
* = Special features of accurate decimal arithmetic
|
||
|
*
|
||
|
* Because BigDecimal is more accurate than normal binary floating point
|
||
|
* arithmetic, it requires some special values.
|
||
|
*
|
||
|
* == Infinity
|
||
|
*
|
||
|
* BigDecimal sometimes needs to return infinity, for example if you divide
|
||
|
* a value by zero.
|
||
|
*
|
||
|
* BigDecimal.new("1.0") / BigDecimal.new("0.0") -> infinity
|
||
|
*
|
||
|
* BigDecimal.new("-1.0") / BigDecimal.new("0.0") -> -infinity
|
||
|
*
|
||
|
* You can represent infinite numbers to BigDecimal using the strings
|
||
|
* 'Infinity', '+Infinity' and '-Infinity' (case-sensitive)
|
||
|
*
|
||
|
* == Not a Number
|
||
|
*
|
||
|
* When a computation results in an undefined value, the special value NaN
|
||
|
* (for 'not a number') is returned.
|
||
|
*
|
||
|
* Example:
|
||
|
*
|
||
|
* BigDecimal.new("0.0") / BigDecimal.new("0.0") -> NaN
|
||
|
*
|
||
|
* You can also create undefined values. NaN is never considered to be the
|
||
|
* same as any other value, even NaN itself:
|
||
|
*
|
||
|
* n = BigDecimal.new('NaN')
|
||
|
*
|
||
|
* n == 0.0 -> nil
|
||
|
*
|
||
|
* n == n -> nil
|
||
|
*
|
||
|
* == Positive and negative zero
|
||
|
*
|
||
|
* If a computation results in a value which is too small to be represented as
|
||
|
* a BigDecimal within the currently specified limits of precision, zero must
|
||
|
* be returned.
|
||
|
*
|
||
|
* If the value which is too small to be represented is negative, a BigDecimal
|
||
|
* value of negative zero is returned. If the value is positive, a value of
|
||
|
* positive zero is returned.
|
||
|
*
|
||
|
* BigDecimal.new("1.0") / BigDecimal.new("-Infinity") -> -0.0
|
||
|
*
|
||
|
* BigDecimal.new("1.0") / BigDecimal.new("Infinity") -> 0.0
|
||
|
*
|
||
|
* (See BigDecimal.mode for how to specify limits of precision.)
|
||
|
*
|
||
|
* Note that -0.0 and 0.0 are considered to be the same for the purposes of
|
||
|
* comparison.
|
||
|
*
|
||
|
* Note also that in mathematics, there is no particular concept of negative
|
||
|
* or positive zero; true mathematical zero has no sign.
|
||
|
*/
|
||
|
void
|
||
|
Init_bigdecimal(void)
|
||
|
{
|
||