Uh oh!
There was an error while loading. Please reload this page.
- Notifications
You must be signed in to change notification settings - Fork 34k
gh-101410: Improve error messages in math module#101492
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
gh-101410: Improve error messages in math module #101492
Uh oh!
There was an error while loading. Please reload this page.
Conversation
CharlieZhao95 commented Feb 1, 2023 • edited by bedevere-bot
Loading Uh oh!
There was an error while loading. Please reload this page.
edited by bedevere-bot
Uh oh!
There was an error while loading. Please reload this page.
Modules/mathmodule.c Outdated
| "Return the square root of x.") | ||
| "Return the square root of x.", | ||
| "math.sqrt() expects a non-negative input, got '%R'.\n" | ||
| "See cmath.sqrt() for variation that supports complex numbers") |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Perhaps an a before variation would be more correct? Or
See cmath.sqrt(), which also supports negative inputs. I don't know what's better - just a suggestion (:
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Perhaps an
abeforevariationwould be more correct? Or
See cmath.sqrt(), which also supports negative inputs. I don't know what's better - just a suggestion (:
Thanks! It seems reasonable to me to add a. Let's wait for others to reply. :)
CharlieZhao95 commented Feb 3, 2023
I guess similar functions and macros can have the same changes (eg |
Uh oh!
There was an error while loading. Please reload this page.
| if (Py_IS_NAN(r) && !Py_IS_NAN(x)){ | ||
| PyErr_SetString(PyExc_ValueError, | ||
| "math domain error"); /* invalid arg */ | ||
| PyErr_Format(PyExc_ValueError, err_msg, arg); /* invalid arg */ |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Shouldn't same message be used below on the line 1076 as well (infinite r for finite input)? atanh(-1) is an example.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Shouldn't same message be used below on the line 1076 as well (infinite r for finite input)? atanh(-1) is an example.
I was wondering if there is a function that can have both input and output( NAN r for non-NAN x and infinite r for finite x).
If such a function exists, it may lead to confusing error messages, because one error message corresponds to two scenarios. I haven't thought of such a function yet, please suggest if it exists. :)
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Same atanh :)
atanh(2) - for the 1st scenario and atanh(1) - for the second. I doubt it will be confusing if you raise instead something like ValueError("atanh expects an argument from (-1, -1), got %R"). I don't think it does make sense to have a different descriptions for pole errors (like atanh(1)). @mdickinson ?
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
serhiy-storchaka left a comment
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Would not be better to output the converted C double value x instead of the original Python object arg? The repr of the Python object can be arbitrary long, unlike to the string representation of C double. Also, there may be some errors introduced at converting Python object to C double, not visible from its repr. Although it is much more cumbersome.
serhiy-storchaka commented Sep 23, 2023 • edited
Loading Uh oh!
There was an error while loading. Please reload this page.
edited
Uh oh!
There was an error while loading. Please reload this page.
For example, |
CharlieZhao95 commented Sep 26, 2023
Thanks for your suggestion! I forgot this PR while waiting for others to review it, and it’s time to pick it up :) IMO, it is better to use the C double variable. The only drawback is that we will lose some floating point precision in error message. Does this confuse others? Perhaps this minor flaw is acceptable. # Using double(%f), the default value is six decimal places.>>>math.sqrt(-math.pi) Traceback (mostrecentcalllast): File"<stdin>", line1, in<module>ValueError: math.sqrt() expectsanonnegativeinput, got'-3.141593'. Seecmath.sqrt() foravariationthatsupportscomplexnumbers>>>math.pi3.141592653589793>>>math.sqrt(-0.00000001) Traceback (mostrecentcalllast): File"<stdin>", line1, in<module>ValueError: math.sqrt() expectsanonnegativeinput, got'-0.000000'. Seecmath.sqrt() foravariationthatsupportscomplexnumbers |
AA-Turner commented Sep 26, 2023 • edited
Loading Uh oh!
There was an error while loading. Please reload this page.
edited
Uh oh!
There was an error while loading. Please reload this page.
Perhaps just append ' (rounded)' to the end of the line? A |
skirpichev commented Sep 26, 2023
In most cases functions in the module are 1-arg. I think that if we show the function domain (e.g. |
serhiy-storchaka commented Sep 26, 2023
Of course, the output should be more precise and consistent with Python representation, so do not use
Before writing code, wait to see if other core developers (in particular @mdickinson and @tim-one) have something to say about this idea. |
skirpichev commented Jul 21, 2024
FYI, @CharlieZhao95, this branch has unresolved conflicts. Are you planing to finish this? If not, I'll open a pr, based on this work. |
CharlieZhao95 commented Jul 22, 2024
Thanks for reminding! BTW, is it time to continue this PR? Maybe we can make this PR simpler (remove |
picnixz left a comment
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Can you add tests for checking the new messages?
Misc/NEWS.d/next/Library/2023-02-01-16-41-31.gh-issue-101410.Dt2aQE.rst Outdated Show resolvedHide resolved
Uh oh!
There was an error while loading. Please reload this page.
Uh oh!
There was an error while loading. Please reload this page.
Uh oh!
There was an error while loading. Please reload this page.
| returnNULL; | ||
| num=loghelper(args[0], m_log); | ||
| num=loghelper(args[0], m_log, "math.log() expects a positive input, got '%R'."); |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
I don't think using quotes around numbers is relevant. For instance, if it's a custom class of a float that overrides __repr__, then you don't necessarily want to surround the __repr__ by quotes.
| num=loghelper(args[0], m_log, "math.log() expects a positive input, got '%R'."); | |
| num=loghelper(args[0], m_log, "math.log() expects a positive input, got %R."); |
| /*[clinic end generated code: output=5425899a4d5d6acb input=08321262bae4f39b]*/ | ||
| { | ||
| returnloghelper(x, m_log2); | ||
| returnloghelper(x, m_log2, "math.log2() expects a positive input, got '%R'."); |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Ditto.
| /*[clinic end generated code: output=be72a64617df9c6f input=b2469d02c6469e53]*/ | ||
| { | ||
| returnloghelper(x, m_log10); | ||
| returnloghelper(x, m_log10, "math.log10() expects a positive input, got '%R'."); |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Ditto
…t2aQE.rst Co-authored-by: Bénédikt Tran <10796600+picnixz@users.noreply.github.com>
Co-authored-by: Bénédikt Tran <10796600+picnixz@users.noreply.github.com>
Co-authored-by: Bénédikt Tran <10796600+picnixz@users.noreply.github.com>
CharlieZhao95 commented Jul 22, 2024
Sure :) I'm waiting for other core developers to reply. I will add tests after they finalize the solution. |
skirpichev commented Oct 15, 2024
This work continued in #124299 |
Make several math functions support custom error messages.
math.sqrt()andmath.log()now provide more helpful error messages.