Git Product home page Git Product logo

Comments (1)

mjibson avatar mjibson commented on June 21, 2024

You say:

I usually want the most precise value during a series of operations and then I will round at the end of the series

So let's do that example. Say we are attempting to compute 1 + 2 / 3 with 5 digits of precision, using the above proposal. We start with the 2 / 3, so you run a division. But 2 / 3 produces a result with a repeating decimal, so its most precise value is an infinite number of digits long. Clearly we cannot represent that, and so we must instead choose some precision at which to perform the operation, and thus the proposal as worded there can't work in the general case.

You could argue that apd can just choose a high-enough precision so the end result will be within some error bound, but that would require apd to understand entire computations and be able to determine how precise the end result would be based, and then compute the desired precision from that. This to me sounds incredibly complicated (especially considering we support sqrt, ln, exp, etc.). Until then we just require users to specify precision.

Contrast this to other projects where the precision is a global variable (and thus unsafe to change during concurrent operations):
https://github.com/shopspring/decimal/blob/aed1bfe463fa3c9cc268d60dcc1491db613bff7e/decimal.go#L45
or a global const, making it not possible to configure:
https://github.com/ericlagergren/decimal/blob/522450d1e655d86ef13b0bfad42d090a0240ce03/const.go#L19

All of the decimal packages must have this precision specified. Some just hide it from the user more than apd.

You can use apd.BaseContext, which is a 0-precision context, and will thus provide exact operations where possible, and error on any operation that requires a precision (like division, or any more complicated operation that uses division underneath). Or just use apd.BaseContext.WithPrecision(20) like we do for most stuff and that's pretty good.

Also see python, which has a really similar API as apd, and requires precision to be specified: https://docs.python.org/2/library/decimal.html

from apd.

Related Issues (20)

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.