Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Add explicit and unified interface for approximation #100

Open
cmpute opened this issue Jan 9, 2022 · 1 comment
Open

Add explicit and unified interface for approximation #100

cmpute opened this issue Jan 9, 2022 · 1 comment

Comments

@cmpute
Copy link

cmpute commented Jan 9, 2022

I propose to add a trait to explicitly allow rational approximation for various types. This is motivated by my crate for irrational numbers where I would like to have a unified interface for approximation (see #35 (comment)).

Here's a draft:

pub enum Approximation<T> {
    Approximated(T),
    Exact(T)
}

pub trait RationalApproximation<T: Integer> {
    // Here `limit` determines the (absolute?) maximum of the numerator and denumerator 
    fn approx_rational(&self, limit: &T) -> Approximation<Ratio<T>>;
}

There're several benefits to define this interface:

  1. If we implement RationalApproximation for Ratio<T> itself, then we can have an explicit method to limit the precision of the fraction. (related to Feature request: Limiting precision #99)
  2. Other number types can use this interface to provide approximation ability (such as my irrational number types)
  3. The existing from_float and approximate_float functions seem messy to me. I would suggest to keep the from_float method, while implements RationalApproximation for f32 and f64.

Thanks!

@cmpute
Copy link
Author

cmpute commented Jan 11, 2022

Besides, from_float could be implemented as a TryFrom trait. And as we have From<T: Integer>, from_integer seems unnecessary for me. It makes user confusing.

Another option might be deprecate from_float as well, this functionality will be only available through FromPrimitive::{from_f32, from_f64}.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

No branches or pull requests

1 participant