use std::str::FromStr;
use hexf_parse::{parse_hexf32, parse_hexf64};
fn hexf32(s: &str) -> f32 {
parse_hexf32(s, false).unwrap()
}
fn hexf64(s: &str) -> f64 {
parse_hexf64(s, false).unwrap()
}
macro_rules! check {
($ty:ident, $s:expr) => {{
check!($ty, stringify!($s), $s)
}};
($ty:ident, $s:expr, inf) => {{
check!($ty, $s, core::$ty::INFINITY)
}};
($ty:ident, $s:expr, neg_inf) => {{
check!($ty, $s, core::$ty::NEG_INFINITY)
}};
($ty:ident, $s:expr, $e:expr) => {{
let string = String::from($s);
let s = string.as_bytes();
let expected: $ty = $e;
let result = fast_float::parse::<$ty, _>(s).unwrap();
assert_eq!(result, expected);
let lex = lexical_core::parse::<$ty>(s).unwrap();
assert_eq!(result, lex);
let std = <$ty>::from_str(string.as_str());
if let Ok(std) = std {
if std.is_finite() && result.is_finite() {
assert_eq!(result, std);
}
}
}};
}
macro_rules! check_lex {
($ty:ident, $s:expr) => {{
let v = lexical_core::parse::<$ty>($s.as_bytes()).unwrap();
check!($ty, $s, v);
}};
}
macro_rules! check_f32 {
($($tt:tt)+) => {
check!(f32, $($tt)+)
}
}
macro_rules! check_f64 {
($($tt:tt)+) => {
check!(f64, $($tt)+)
}
}
macro_rules! check_f32_lex {
($s:expr) => {
check_lex!(f32, $s)
};
}
macro_rules! check_f64_lex {
($s:expr) => {
check_lex!(f64, $s)
};
}
macro_rules! check_f32_inf {
($s:expr) => {
check!(f32, $s, inf)
};
}
macro_rules! check_f32_neg_inf {
($s:expr) => {
check!(f32, $s, neg_inf)
};
}
macro_rules! check_f64_inf {
($s:expr) => {
check!(f64, $s, inf)
};
}
macro_rules! check_f64_neg_inf {
($s:expr) => {
check!(f64, $s, neg_inf)
};
}
fn append_zeros(s: impl AsRef<str>, n: usize) -> String {
let mut s = String::from(s.as_ref());
for _ in 0..n {
s.push('0');
}
s
}
#[test]
fn test_f64_inf() {
check_f64_inf!("INF");
check_f64_inf!("INFINITY");
check_f64_inf!("infinity");
check_f64_inf!("inf");
check_f64_inf!("1234456789012345678901234567890e9999999999999999999999999999");
check_f64_inf!("1.832312213213213232132132143451234453123412321321312e308");
check_f64_inf!("2e30000000000000000");
check_f64_inf!("2e3000");
check_f64_inf!("1.8e308");
check_f64_inf!("1.9e308");
check_f64_neg_inf!("-INF");
check_f64_neg_inf!("-INFINITY");
check_f64_neg_inf!("-infinity");
check_f64_neg_inf!("-inf");
check_f64_neg_inf!("-2139879401095466344511101915470454744.9813888656856943E+272");
}
#[test]
fn test_f64_long() {
check_f64!(
"\
9355950000000000000.000000000000000000000000000000000018446744073709551616000001\
84467440737095516161844674407370955161407370955161618446744073709551616000184467\
44073709551616600000184467440737095516161844674407370955161407370955161618446744\
07370955161600018446744073709551616018446744073709556744516161844674407370955161\
40737095516161844674407370955161600018446744073709551616018446744073709551611616\
00018446744073709500184467440737095516160018446744073709551616001844674407370955\
11681644674407370955161600018440737095516160184467440737095516161844674407370955\
16160001844674407536910751601611616000184467440737095001844674407370955161600184\
46744073709551616001844674407370955161618446744073709551616000184495516161844674\
4073709551616000184467440753691075160018446744073709",
hexf64("0x1.03ae05e8fca1cp+63")
);
check_f64!(
"\
2.225073858507202124188701479202220329072405282794390378143031338374351073192441\
94686754406432563881851382188218502438069999947733013005649884107791928741341929\
29720097048195199306799329096904278406473168204156592672863293363047467012331685\
29834221527445172608358596545663192828352447877877998943107797838336991592885945\
55213714181128458251145584319223079897504395086859412457230891738946169368372321\
19137365897797772328669884035639025104444303545739673370658398105542045669382465\
84137476071559811765738776267476659123871999319040063173347090030127901881752034\
47190250028061277777916798391090578584006464715943810511489154282775041174682194\
13395246668250343130618158782937900420539237507208336669324158000275839111885418\
8641513168478436313080237596295773983001708984375e-308",
hexf64("0x1.0000000000002p-1022")
);
check_f64_inf!(
"\
14384566631413902735261182076422355811832278452463312311626366537903681520913941\
96930365828634687637948157940776599182791387527135353034738357134110310609455693\
90082419354977279201654318268051974058035436546798544018359870131225762454556233\
13970183299286131961255902741877200739148180625308303165331580986249841188892982\
81371812288789537310599037529113415438738954894752124724983067241108764488346454\
37669901867307840475112141480493722424080599312381693232622368309077056159757045\
77939329858261626042558845291341263962822021265262533893834218067279545885255961\
14379801269094096329805054803089299736996870951258573010877404407451953846698609\
19821392688269207855703322826525930548119852605981316446918758669325733577952202\
04076454986842633399219052275566166981299674128912822316855046606712779271982900\
09824680186319750978665734576683784255802269708917361719466043175201158849097881\
37047711185017157986905601606166617302905958843377601564443970505037755427769614\
39282780934537928038462527159660167332226464423828921239400524413468224297215938\
84378212558701004356924243030059517489346646577724622498919752597382095222500311\
12418182351225107135618176937657765139002829779615620881537508915912839494571051\
58613344862671017974971111259092725051947928708896171797587034426080161433432621\
59998149700606597792535574457560429226974273443630323818747730771316763398572110\
87495998192373246307688452867739265415001026982223940199342748237651323138921235\
35835735663769155726509168665536123661873789595549835667127670933729060301889762\
20169058025354973622211666504549316958271880975697143546564469806791358707318873\
07570838334500409015197406832583817753126695417740666139222980134999469594150993\
5655355652985723782153570084089560139142231.738475042362596875449154552392299548\
94713816208169416867534067784380761312978044932336375902701297246698737092181681\
31626587547265451210905455072402670004565947865409496052607224619378706306348749\
91729398208026467698131898691830012167897399682179601734569071423681e-733"
);
check_f64_lex!(
"\
0.000000000000000000000000000000000000000000000000000000000000000000000000000000\
00000000000000000000000000000000000000000000000000000000000000000000000000000000\
00000000000000000000000000000000000000000000000000000000000000000000000000000000\
00000000000000000000000000000000000000000000000000000000000000000000044501477170\
14402272114819593418263951869639092703291296046852219449644444042153891033059047\
81627017582829831782607924221374017287738918929105531441481564124348675997628212\
65346585071045737627442980259622449029037796981144446145705102663115100318287949\
52795966823603998647925096578034214163701381261333311989876551545144031526125381\
32666529513060001849177663286607555958373922409899478075565940981010216121988146\
05258742579179000071675999344145086087205681577915435923018910334964869420614052\
18289243144579760516365090360651414037721744226256159024466852576737244643007551\
33324500796506867194913776884780053099639677097589658441378944337966219939673169\
36280457084866613206797017728916080020698679408551343728867675409720757232455434\
770912461317493580281734466552734375"
);
check_f64_lex!(
"\
0.000000000000000000000000000000000000000000000000000000000000000000000000000000\
00000000000000000000000000000000000000000000000000000000000000000000000000000000\
00000000000000000000000000000000000000000000000000000000000000000000000000000000\
00000000000000000000000000000000000000000000000000000000000000000000022250738585\
07200889024586876085859887650423112240959465493524802562440009228235695178775888\
80375915526423097809504343120858773871583572918219930202943792242235598198275012\
42041788969571311791082261043971979604000454897391938079198936081525613113376149\
84204327175103362739154978273159414382813627511383860409424946494228631669542910\
50802018159266421349966065178030950759130587198464239060686371020051087232827846\
78843631944515866135041223479014792369585208321597621066375401613736583044193603\
71477835530668283453563400507407304013560296804637591858316312422452159926254649\
43008368518617194224176464551371354201322170313704965832101546540680353974179060\
22589503023501937519773030945763173210852507299305089761582519159720757232455434\
770912461317493580281734466552734375"
);
}
#[test]
fn test_f64_general() {
check_f64!("9007199254740993.0", hexf64("0x1.p+53"));
check_f64!(append_zeros("9007199254740993.0", 1000), hexf64("0x1.p+53"));
check_f64!("10000000000000000000", hexf64("0x1.158e460913dp+63"));
check_f64!(
"10000000000000000000000000000001000000000000",
hexf64("0x1.cb2d6f618c879p+142")
);
check_f64!(
"10000000000000000000000000000000000000000001",
hexf64("0x1.cb2d6f618c879p+142")
);
check_f64!(1.1920928955078125e-07);
check_f64!("-0", -0.0);
check_f64!(
"1.0000000000000006661338147750939242541790008544921875",
1.0000000000000007
);
check_f64!(
"1090544144181609348835077142190",
hexf64("0x1.b8779f2474dfbp+99")
);
check_f64!(2.2250738585072013e-308);
check_f64!(-92666518056446206563E3);
check_f64!(-92666518056446206563E3);
check_f64!(-42823146028335318693e-128);
check_f64!(90054602635948575728E72);
check_f64_lex!(
"\
1.000000000000001885589208702234638701745660206917535153946435506630705583683732\
21972569761144603605635692374830246134201063722058e-309"
);
check_f64!("0e9999999999999999999999999999", 0.0);
check_f64!(-2402844368454405395.2);
check_f64!(2402844368454405395.2);
check_f64!(7.0420557077594588669468784357561207962098443483187940792729600000e+59);
check_f64!(7.0420557077594588669468784357561207962098443483187940792729600000e+59);
check_f64!(-1.7339253062092163730578609458683877051596800000000000000000000000e+42);
check_f64!(-2.0972622234386619214559824785284023792871122537545728000000000000e+52);
check_f64!(-1.0001803374372191849407179462120053338028379051879898808320000000e+57);
check_f64!(-1.8607245283054342363818436991534856973992070520151142825984000000e+58);
check_f64!(-1.9189205311132686907264385602245237137907390376574976000000000000e+52);
check_f64!(-2.8184483231688951563253238886553506793085187889855201280000000000e+54);
check_f64!(-1.7664960224650106892054063261344555646357024359107788800000000000e+53);
check_f64!(-2.1470977154320536489471030463761883783915110400000000000000000000e+45);
check_f64!(-4.4900312744003159009338275160799498340862630046359789166919680000e+61);
check_f64!("+1", 1.0);
check_f64!(
"1.797693134862315700000000000000001e308",
1.7976931348623157e308
);
check_f64!("3e-324", hexf64("0x0.0000000000001p-1022"));
check_f64!("1.00000006e+09", hexf64("0x1.dcd651ep+29"));
check_f64!("4.9406564584124653e-324", hexf64("0x0.0000000000001p-1022"));
check_f64!("4.9406564584124654e-324", hexf64("0x0.0000000000001p-1022"));
check_f64!("2.2250738585072009e-308", hexf64("0x0.fffffffffffffp-1022"));
check_f64!("2.2250738585072014e-308", hexf64("0x1.p-1022"));
check_f64!("1.7976931348623157e308", hexf64("0x1.fffffffffffffp+1023"));
check_f64!("1.7976931348623158e308", hexf64("0x1.fffffffffffffp+1023"));
check_f64!(4503599627370496.5);
check_f64!(4503599627475352.5);
check_f64!(4503599627475353.5);
check_f64!(2251799813685248.25);
check_f64!(1125899906842624.125);
check_f64!(1125899906842901.875);
check_f64!(2251799813685803.75);
check_f64!(4503599627370497.5);
check_f64!(45035996.273704995);
check_f64!(45035996.273704985);
}
#[test]
fn test_f32_inf() {
check_f32_inf!("INF");
check_f32_inf!("INFINITY");
check_f32_inf!("infinity");
check_f32_inf!("inf");
check_f32_inf!("1234456789012345678901234567890e9999999999999999999999999999");
check_f32_inf!("2e3000");
check_f32_inf!("3.5028234666e38");
check_f32_neg_inf!("-INF");
check_f32_neg_inf!("-INFINITY");
check_f32_neg_inf!("-infinity");
check_f32_neg_inf!("-inf");
}
#[test]
fn test_f32_basic() {
let f1 = "\
1.175494140627517859246175898662808184331245864732796240031385942718174675986064\
7699724722770042717456817626953125";
check_f32!(f1, hexf32("0x1.2ced3p+0"));
check_f32!(format!("{}e-38", f1), hexf32("0x1.fffff8p-127"));
check_f32!(
format!("{}e-38", append_zeros(f1, 655)),
hexf32("0x1.fffff8p-127")
);
check_f32!(
format!("{}e-38", append_zeros(f1, 656)),
hexf32("0x1.fffff8p-127")
);
check_f32!(
format!("{}e-38", append_zeros(f1, 1000)),
hexf32("0x1.fffff8p-127")
);
check_f32!(1.00000006e+09);
check_f32!(1.4012984643e-45);
check_f32!(1.1754942107e-38);
check_f32!(1.1754943508e-45);
check_f32!("-0", -0.0);
check_f32!("1090544144181609348835077142190", hexf32("0x1.b877ap+99"));
check_f32!(1.1754943508e-38);
check_f32!(30219.0830078125);
check_f32!(16252921.5);
check_f32!(5322519.25);
check_f32!(3900245.875);
check_f32!(1510988.3125);
check_f32!(782262.28125);
check_f32!(328381.484375);
check_f32!(156782.0703125);
check_f32!(85003.24609375);
check_f32!(43827.048828125);
check_f32!(17419.6494140625);
check_f32!(15498.36376953125);
check_f32!(6318.580322265625);
check_f32!(2525.2840576171875);
check_f32!(1370.9265747070312);
check_f32!(936.3702087402344);
check_f32!(411.88682556152344);
check_f32!(206.50310516357422);
check_f32!(124.16878890991211);
check_f32!(50.811574935913086);
check_f32!(17.486443519592285);
check_f32!(13.91745138168335);
check_f32!("7.5464513301849365", hexf32("0x1.e2f90ep+2"));
check_f32!(2.687217116355896);
check_f32!("1.1877630352973938", hexf32("0x1.30113ep+0"));
check_f32!(0.7622503340244293);
check_f32!("0.30531780421733856", hexf32("0x1.38a53ap-2"));
check_f32!("0.21791061013936996", hexf32("0x1.be47eap-3"));
check_f32!("0.09289376810193062", hexf32("0x1.7c7e2ep-4"));
check_f32!(0.03706067614257336);
check_f32!(0.028068351559340954);
check_f32!("0.012114629615098238", hexf32("0x1.8cf8e2p-7"));
check_f32!("0.004221370676532388", hexf32("0x1.14a6dap-8"));
check_f32!(0.002153817447833717);
check_f32!("0.0015924838953651488", hexf32("0x1.a175cap-10"));
check_f32!(0.0008602388261351734);
check_f32!("0.00036393293703440577", hexf32("0x1.7d9c82p-12"));
check_f32!(0.00013746770127909258);
check_f32!(16407.9462890625);
check_f32!("1.1754947011469036e-38", hexf32("0x1.000006p-126"));
check_f32!("7.0064923216240854e-46", hexf32("0x1.p-149"));
check_f32!(8388614.5);
check_f32!("0e9999999999999999999999999999", 0.);
check_f32!(
"4.7019774032891500318749461488889827112746622270883500860350068251e-38",
4.7019774032891500318749461488889827112746622270883500860350068251e-38
);
check_f32_lex!(
"\
3.141592653589793238462643383279502884197169399375105820974944592307816406286208\
9986280348253421170679"
);
check_f32!(
"2.3509887016445750159374730744444913556373311135441750430175034126e-38",
2.3509887016445750159374730744444913556373311135441750430175034126e-38
);
check_f32!("+1", 1.);
check_f32!("7.0060e-46", 0.);
check_f32!("3.4028234664e38", hexf32("0x1.fffffep+127"));
check_f32!("3.4028234665e38", hexf32("0x1.fffffep+127"));
check_f32!("3.4028234666e38", hexf32("0x1.fffffep+127"));
check_f32_lex!(
"\
0.000000000000000000000000000000000000011754943508222875079687365372222456778186\
655567720875215087517062784172594547271728515625"
);
check_f32_lex!(
"\
0.000000000000000000000000000000000000000000001401298464324817070923729583289916\
13128026194187651577175706828388979108268586060148663818836212158203125"
);
check_f32_lex!(
"\
0.000000000000000000000000000000000000023509885615147285834557659820715330266457\
17985517980855365926236850006129930346077117064851336181163787841796875"
);
check_f32_lex!(
"\
0.000000000000000000000000000000000000011754942106924410754870294448492873488270\
52428745893333857174530571588870475618904265502351336181163787841796875"
);
}
#[test]
fn test_f64_pow10() {
for i in -308..=308 {
let s = format!("1e{}", i);
let v = f64::from_str(&s).unwrap();
assert_eq!(fast_float::parse::<f64, _>(s).unwrap(), v);
}
}
#[test]
fn test_f32_pow10() {
for i in -38..=38 {
let s = format!("1e{}", i);
let v = f32::from_str(&s).unwrap();
assert_eq!(fast_float::parse::<f32, _>(s).unwrap(), v);
}
}