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

assert_eq! output is very unhelpful for floats #20870

Closed
nagisa opened this issue Jan 10, 2015 · 3 comments
Closed

assert_eq! output is very unhelpful for floats #20870

nagisa opened this issue Jan 10, 2015 · 3 comments
Labels
A-diagnostics Area: Messages for errors, warnings, and lints A-macros Area: All kinds of macros (custom derive, macro_rules!, proc macros, ..)

Comments

@nagisa
Copy link
Member

nagisa commented Jan 10, 2015

assert_eq!(1E-7, 0.0);

will output

assertion failed: (left == right) && (right == left) (left: 0f64, right: 0f64)' …

Note that values displayed are pretty useless.

@kmcallister kmcallister added A-libs A-diagnostics Area: Messages for errors, warnings, and lints A-macros Area: All kinds of macros (custom derive, macro_rules!, proc macros, ..) labels Jan 11, 2015
@kmcallister
Copy link
Contributor

How about

trait DebugCompare<RHS> {
    pub describe_difference(&self, rhs: &RHS) -> Option<Cow<str>>;
}

macro_rules! assert_eq {
    ($left:expr, $right:expr) => {{
        match (&($left), &($right)) {
            (left_val, right_val) => if let Some(desc) = left_val.describe_difference(right_val) {
                panic!("assert_eq! failed: difference between {:?} and {:?} is {}",
                    *left_val, *right_val, desc);
            },
        }
    }}
}

Then DebugCompare for f64 can give the numerical difference, DebugCompare for Expr can do an AST diff (???), etc.

bors added a commit that referenced this issue May 9, 2015
This is a direct port of my prior work on the float formatting. The detailed description is available [here](https://github.com/lifthrasiir/rust-strconv#flt2dec). In brief,

* This adds a new hidden module `core::num::flt2dec` for testing from `libcoretest`. Why is it in `core::num` instead of `core::fmt`? Because I envision that the table used by `flt2dec` is directly applicable to `dec2flt` (cf. #24557) as well, which exceeds the realm of "formatting".
* This contains both Dragon4 algorithm (exact, complete but slow) and Grisu3 algorithm (exact, fast but incomplete).
* The code is accompanied with a large amount of self-tests and some exhaustive tests. In particular, `libcoretest` gets a new dependency on `librand`. For the external interface it relies on the existing test suite.
* It is known that, in the best case, the entire formatting code has about 30 KBs of binary overhead (judged from strconv experiments). Not too bad but there might be a potential room for improvements.

This is rather large code. I did my best to comment and annotate the code, but you have been warned.

For the maximal availability the original code was licensed in CC0, but I've also dual-licensed it in MIT/Apache as well so there should be no licensing concern.

This is [breaking-change] as it changes the float output slightly (and it also affects the casing of `inf` and `nan`). I hope this is not a big deal though :)

Fixes #7030, #18038 and #24556. Also related to #6220 and #20870.

## Known Issues

- [x] I've yet to finish `make check-stage1`. It does pass main test suites including `run-pass` but there might be some unknown edges on the doctests.
- [ ] Figure out how this PR affects rustc.
- [ ] Determine which internal routine is mapped to the formatting specifier. Depending on the decision, some internal routine can be safely removed (for instance, currently `to_shortest_str` is unused).
@lifthrasiir
Copy link
Contributor

With #24612 this prints the following, thus I believe this is fixed by now.

thread '<main>' panicked at 'assertion failed: `(left == right)` (left: `0.0000001`, right: `0`)', t.rs:1

@bstrie
Copy link
Contributor

bstrie commented May 10, 2015

Closed by #24612.

@bstrie bstrie closed this as completed May 10, 2015
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
A-diagnostics Area: Messages for errors, warnings, and lints A-macros Area: All kinds of macros (custom derive, macro_rules!, proc macros, ..)
Projects
None yet
Development

No branches or pull requests

4 participants