Flowdock

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.

Constants

BASE = INT2FIX((S_INT)VpBaseVal())

EXCEPTION_ALL = 0xff

EXCEPTION_NaN = 0x02

EXCEPTION_INFINITY = 0x01

EXCEPTION_UNDERFLOW = 0x04

EXCEPTION_OVERFLOW = 0x01

EXCEPTION_ZERODIVIDE = 0x01

ROUND_MODE = 0x100

ROUND_UP = 1

ROUND_DOWN = 2

ROUND_HALF_UP = 3

ROUND_HALF_DOWN = 4

ROUND_CEILING = 5

ROUND_FLOOR = 6

ROUND_HALF_EVEN = 7

SIGN_NaN = 0

SIGN_POSITIVE_ZERO = 1

SIGN_NEGATIVE_ZERO = -1

SIGN_POSITIVE_FINITE = 2

SIGN_NEGATIVE_FINITE = -2

SIGN_POSITIVE_INFINITE = 3

SIGN_NEGATIVE_INFINITE = -3

Attributes

Show files where this class is defined (2 files)
Register or log in to add new notes.