项目作者: mauriciopoppe

项目描述 :
An implementation of an algebraically closed interval system of the extended real number set
高级语言: TypeScript
项目地址: git://github.com/mauriciopoppe/interval-arithmetic.git
创建时间: 2015-05-12T04:50:59Z
项目社区:https://github.com/mauriciopoppe/interval-arithmetic

开源协议:Boost Software License 1.0

下载


interval-arithmetic

NPM
codecov
js-standard-style

An implementation of an algebraically closed interval system of the extended real number set

Description

An interval is a pair of numbers which represents all the numbers between them, closed
means that the bounds are also included in the representation, extended real because the
real number system is extended with two elements: -∞ and +∞ representing negative infinity
and positive infinity respectively.

The implementation is a modified port of the Boost’s interval arithmetic library,
the modifications are based on some guidelines from the following papers/presentations:

floating point operations

Floating point is a way to represent a real number in an approximate way (due to the finite
space existing on a computer), most calculations with real numbers will produce quantities that
cannot be exactly represented with the space allocated and therefore this operation needs
to be rounded in order to fit back into its finite representation, such errors are described in
more detail here

Interval arithmetic

Instead of using a single floating point number as an approximation of a real number, interval
arithmetic represents the approximated value as a set of possible values (considering the numbers
that floating point cannot represent), let’s say we want to represent the number 1 / 3, as a single
floating point number it’s approximated as 0.333333333333..., in the end there will be some 333...
decimals that will be lost due to the nature of floating point, instead we can represent this
number with the interval [0.2, 0.4], with this interval we’re completely sure that 1 / 3 is within
the interval (although the interval is also representing many more numbers), to improve the scope
of the interval we have to understand that numbers in JavaScript are represented with 64 bits,
therefore to get the next floating point number of a single precision number the last bit
needs to be incremented to get the upper bound, and the last bit also needs to be decremented
to get the lower point

Notable modifications

  • next/previous IEEE754 floating point number implementation based on Typed Arrays
  • division when both intervals contain zero creates a whole interval
  • cosine, tangent works with positive/negative values out of the box

Interval arithmetic evaluator

Due to the expressive nature of the way the methods interact with intervals it’s sad that even the simplest
operation needs a lot of characters to be typed, let’s consider evaluating the result of 1 + 2 expressed
with intervals

  1. Interval.add(new Interval(1, 1), new Interval(2, 2))

This gets worse when the expression to be evaluated becomes complex like sin(exp(x)) + tan(x) - 1/cos(PI) * [1, 3]^2:

  1. const x = Interval(0, 1);
  2. Interval.add(
  3. Interval.sin(Interval.exp(x)),
  4. Interval.sub(
  5. Interval.tan(x),
  6. Interval.mul(
  7. Interval.div(Interval.ONE, Interval.cos(Interval.PI)),
  8. Interval.pow(Interval(1, 3), 2)
  9. )
  10. )
  11. );

To avoid this ‘expressiveness’ mess there’s an interval arithmetic evaluator module
which I’ve created to deal with all the work of parsing/evaluating expressions like the one above

  1. const compile = require('interval-arithmetic-eval');
  2. compile('sin(exp(x)) + tan(x) - 1/cos(PI) * [1, 3]^2').eval({ x: [0, 1] })

Installation & Usage

  1. $ npm install --save interval-arithmetic
  1. import Interval from 'interval-arithmetic'
  2. Interval.add(Interval(1), Interval(2))

API

See the homepage

Development

  1. npm test

Deployment steps

  1. // after the working directory is clean
  2. npm test
  3. npm run build
  4. npm version (major|minor|patch)
  5. git push origin master
  6. // if everything went well
  7. npm publish
  8. npm run deploy

2015-2022 © Mauricio Poppe

License

FOSSA Status