Source code

Revision control

Copy as Markdown

Other Tools

use rand::rngs::{SmallRng, SysRng};
use rand::{Rng as _, SeedableRng as _};
const N: usize = if cfg!(miri) {
500
} else if let b"0" = opt_level::OPT_LEVEL.as_bytes() {
1_000_000
} else {
100_000_000
};
#[test]
fn ryu_comparison() {
let mut ryu_buffer = ryu::Buffer::new();
let mut zmij_buffer = zmij::Buffer::new();
let mut rng = SmallRng::try_from_rng(&mut SysRng).unwrap();
let mut fail = 0;
for _ in 0..N {
let bits = rng.next_u64();
let float = f64::from_bits(bits);
let ryu = ryu_buffer.format(float);
let zmij = zmij_buffer.format(float);
let matches = if ryu.contains('e') && !ryu.contains("e-") {
ryu.split_once('e') == zmij.split_once("e+")
} else {
ryu == zmij
};
if !matches {
eprintln!("RYU={ryu} ZMIJ={zmij}");
fail += 1;
}
}
assert!(fail == 0, "{fail} mismatches");
}