Open abiriadev opened 1 year ago
Hm yeah. Not even sure why this happens. It would make sense to warn the user, but I'm not sure there's a way to do that currently, while still giving a result. If we figure out when exactly this happens, it might make sense to simply return an error if the input is too large (for now at least). It seems to be when both are a certain size, but I haven't found a more specific pattern yet.
I'd be happy to help or contribute in any way if I can (and have enough time).
Could you please point me to where the gcd
implementation is located? I think it might be a good starting point to identify the issue.
Great! That might speed things up, since I also have limited time right now. The function is implemented here: https://github.com/PaddiM8/kalker/blob/9b55f894427b84b43065579bbf3900eb7d46daf6/kalk/src/prelude/mod.rs#L612
KalkValue represents a value in kalk, usually a number. Normally, this is a heap allocated big float, but for the web version it's just an f64, since the big float library doesn't support WebAssembly. To be able to write generic code despite this, there is a float! macro that turns a number into the relevant type.
How can float!
be useful here? I don't think it will resolve issue regarding number not being able to stored in heap with precision. Am I missing something here?
I would love to contribute if I understand the issue completely.
The purpose of float!
is to create a rug::Float or f64, depending on if the rug
feature is enabled. Unfortunately it doesn't get the configured precision.
I believe it has something to do with the fact that float!
macro always get an f64 value because parsing of Literals was done with f64
.
https://github.com/PaddiM8/kalker/blob/e9c9e81d078d1adacde7168ed318fa44b612b7c9/kalk/src/ast.rs#L22
So no matter what you do with float!(), you will always be passing it f64 with less precision and hence value may be different than what it was asked to parse originally.
I don't know if I am right on this, but it is a best guess about the source of "error" I could make as a newbie.
Hm yeah that sounds about right yeah. It should probably be a rug float when the rug feature is enabled.
I have changed a lot of things in codebase to fix this. Everything compiles and test out just fine with rug
feature enabled as well as disabled. Making a PR for the same.
This would parse strings with correct precision instead of loading them into f64
and then making them Float
. Tested with the input 500000000000000002
which works fine now. You may want to rearrange the codebase to accommodate some functions I added, and rename/remove some existing functions.
Unfortunately for without rug
crate, it would use f64
.
Actual Behavior
Expected result
Suggestion
I think it would be more helpful to warn a user if the input value is larger than some amount. And I am willing to contribute or send PR if needed.
Regards.