Comments (1)
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)
- Is this maintained? HOT 9
- Thank you! HOT 5
- panic with SetString(".-400000000000000000000000000000000000000") HOT 1
- Precision clarification HOT 1
- Inconsistent (or buggy) Quantize behavior HOT 2
- please drop github.com/pkg/errors HOT 2
- rfc: release tags HOT 3
- clarify .Text 'g' docs
- Proper way to set a apd.NullDecimal? HOT 10
- NewWithBigInt doesn't set negative correctly
- Version v1.1.0 included by default when using Go modules HOT 1
- request for new tag HOT 2
- Function remainder returns division impossible HOT 2
- format weirdness with a non-pointer Decimal HOT 3
- Inconsistent behaviour for negative zero HOT 3
- How to use Quantize with limited precision context HOT 5
- Inconsistent negative flag behavior HOT 2
- cos and friends HOT 1
- Add small precision fast-path to Quo HOT 2
- precision, scale HOT 6
Recommend Projects
-
React
A declarative, efficient, and flexible JavaScript library for building user interfaces.
-
Vue.js
🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.
-
Typescript
TypeScript is a superset of JavaScript that compiles to clean JavaScript output.
-
TensorFlow
An Open Source Machine Learning Framework for Everyone
-
Django
The Web framework for perfectionists with deadlines.
-
Laravel
A PHP framework for web artisans
-
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.
-
Visualization
Some thing interesting about visualization, use data art
-
Game
Some thing interesting about game, make everyone happy.
Recommend Org
-
Facebook
We are working to build community through open source technology. NB: members must have two-factor auth.
-
Microsoft
Open source projects and samples from Microsoft.
-
Google
Google ❤️ Open Source for everyone.
-
Alibaba
Alibaba Open Source for everyone
-
D3
Data-Driven Documents codes.
-
Tencent
China tencent open source team.
from apd.