#![allow(
clippy::approx_constant,
clippy::excessive_precision,
clippy::type_complexity
)]
use super::complex::Complex;
use super::tests_util::{Report, check, check_c, finite_input};
#[test]
fn complex_exp_f64() {
let _report = Report;
const CASES: &[((f64, f64), (f64, f64))] = &[
((f64::NAN, f64::NAN), (f64::NAN, f64::NAN)),
((f64::NAN, f64::INFINITY), (f64::NAN, f64::NAN)),
((f64::NAN, f64::NEG_INFINITY), (f64::NAN, f64::NAN)),
((f64::NAN, 0.0), (f64::NAN, 0.0)),
((f64::NAN, -0.0), (f64::NAN, -0.0)),
((f64::NAN, 1.0), (f64::NAN, f64::NAN)),
((f64::NAN, -1.0), (f64::NAN, f64::NAN)),
((f64::NAN, 0.5), (f64::NAN, f64::NAN)),
((f64::NAN, -2.0), (f64::NAN, f64::NAN)),
((f64::NAN, 3.0), (f64::NAN, f64::NAN)),
((f64::INFINITY, f64::NAN), (f64::INFINITY, f64::NAN)),
((f64::INFINITY, f64::INFINITY), (f64::INFINITY, f64::NAN)),
(
(f64::INFINITY, f64::NEG_INFINITY),
(f64::INFINITY, f64::NAN),
),
((f64::INFINITY, 0.0), (f64::INFINITY, 0.0)),
((f64::INFINITY, -0.0), (f64::INFINITY, -0.0)),
((f64::INFINITY, 1.0), (f64::INFINITY, f64::INFINITY)),
((f64::INFINITY, -1.0), (f64::INFINITY, f64::NEG_INFINITY)),
((f64::INFINITY, 0.5), (f64::INFINITY, f64::INFINITY)),
(
(f64::INFINITY, -2.0),
(f64::NEG_INFINITY, f64::NEG_INFINITY),
),
((f64::INFINITY, 3.0), (f64::NEG_INFINITY, f64::INFINITY)),
((f64::NEG_INFINITY, f64::NAN), (0.0, 0.0)),
((f64::NEG_INFINITY, f64::INFINITY), (0.0, 0.0)),
((f64::NEG_INFINITY, f64::NEG_INFINITY), (0.0, -0.0)),
((f64::NEG_INFINITY, 0.0), (0.0, 0.0)),
((f64::NEG_INFINITY, -0.0), (0.0, -0.0)),
((f64::NEG_INFINITY, 1.0), (0.0, 0.0)),
((f64::NEG_INFINITY, -1.0), (0.0, -0.0)),
((f64::NEG_INFINITY, 0.5), (0.0, 0.0)),
((f64::NEG_INFINITY, -2.0), (-0.0, -0.0)),
((f64::NEG_INFINITY, 3.0), (-0.0, 0.0)),
((0.0, f64::NAN), (f64::NAN, f64::NAN)),
((0.0, f64::INFINITY), (f64::NAN, f64::NAN)),
((0.0, f64::NEG_INFINITY), (f64::NAN, f64::NAN)),
((0.0, 0.0), (1.0, 0.0)),
((0.0, -0.0), (1.0, -0.0)),
((0.0, 1.0), (0.5403023058681398, 0.8414709848078965)),
((0.0, -1.0), (0.5403023058681398, -0.8414709848078965)),
((0.0, 0.5), (0.8775825618903728, 0.479425538604203)),
((0.0, -2.0), (-0.4161468365471424, -0.9092974268256817)),
((0.0, 3.0), (-0.9899924966004454, 0.1411200080598672)),
((-0.0, f64::NAN), (f64::NAN, f64::NAN)),
((-0.0, f64::INFINITY), (f64::NAN, f64::NAN)),
((-0.0, f64::NEG_INFINITY), (f64::NAN, f64::NAN)),
((-0.0, 0.0), (1.0, 0.0)),
((-0.0, -0.0), (1.0, -0.0)),
((-0.0, 1.0), (0.5403023058681398, 0.8414709848078965)),
((-0.0, -1.0), (0.5403023058681398, -0.8414709848078965)),
((-0.0, 0.5), (0.8775825618903728, 0.479425538604203)),
((-0.0, -2.0), (-0.4161468365471424, -0.9092974268256817)),
((-0.0, 3.0), (-0.9899924966004454, 0.1411200080598672)),
((1.0, f64::NAN), (f64::NAN, f64::NAN)),
((1.0, f64::INFINITY), (f64::NAN, f64::NAN)),
((1.0, f64::NEG_INFINITY), (f64::NAN, f64::NAN)),
((1.0, 0.0), (2.718281828459045, 0.0)),
((1.0, -0.0), (2.718281828459045, -0.0)),
((1.0, 1.0), (1.4686939399158851, 2.2873552871788423)),
((1.0, -1.0), (1.4686939399158851, -2.2873552871788423)),
((1.0, 0.5), (2.3855167309591354, 1.3032137296869954)),
((1.0, -2.0), (-1.1312043837568135, -2.4717266720048188)),
((1.0, 3.0), (-2.6910786138197937, 0.383603953541131)),
((-1.0, f64::NAN), (f64::NAN, f64::NAN)),
((-1.0, f64::INFINITY), (f64::NAN, f64::NAN)),
((-1.0, f64::NEG_INFINITY), (f64::NAN, f64::NAN)),
((-1.0, 0.0), (0.36787944117144233, 0.0)),
((-1.0, -0.0), (0.36787944117144233, -0.0)),
((-1.0, 1.0), (0.19876611034641298, 0.3095598756531122)),
((-1.0, -1.0), (0.19876611034641298, -0.3095598756531122)),
((-1.0, 0.5), (0.32284458245003306, 0.17637079922503196)),
((-1.0, -2.0), (-0.1530918656742263, -0.33451182923926226)),
((-1.0, 3.0), (-0.36419788641329287, 0.05191514970317339)),
((0.5, f64::NAN), (f64::NAN, f64::NAN)),
((0.5, f64::INFINITY), (f64::NAN, f64::NAN)),
((0.5, f64::NEG_INFINITY), (f64::NAN, f64::NAN)),
((0.5, 0.0), (1.6487212707001282, 0.0)),
((0.5, -0.0), (1.6487212707001282, -0.0)),
((0.5, 1.0), (0.8908079042931287, 1.3873511113297634)),
((0.5, -1.0), (0.8908079042931287, -1.3873511113297634)),
((0.5, 0.5), (1.4468890365841693, 0.7904390832136149)),
((0.5, -2.0), (-0.6861101411498431, -1.4991780090003948)),
((0.5, 3.0), (-1.6322216869786788, 0.23266755900967662)),
((-2.0, f64::NAN), (f64::NAN, f64::NAN)),
((-2.0, f64::INFINITY), (f64::NAN, f64::NAN)),
((-2.0, f64::NEG_INFINITY), (f64::NAN, f64::NAN)),
((-2.0, 0.0), (0.1353352832366127, 0.0)),
((-2.0, -0.0), (0.1353352832366127, -0.0)),
((-2.0, 1.0), (0.07312196559805964, 0.1138807140643681)),
((-2.0, -1.0), (0.07312196559805964, -0.1138807140643681)),
((-2.0, 0.5), (0.11876788457694579, 0.06488319105786541)),
((-2.0, -2.0), (-0.05631934999212789, -0.12306002480577674)),
((-2.0, 3.0), (-0.13398091492954262, 0.019098516261135196)),
((3.0, f64::NAN), (f64::NAN, f64::NAN)),
((3.0, f64::INFINITY), (f64::NAN, f64::NAN)),
((3.0, f64::NEG_INFINITY), (f64::NAN, f64::NAN)),
((3.0, 0.0), (20.085536923187668, 0.0)),
((3.0, -0.0), (20.085536923187668, -0.0)),
((3.0, 1.0), (10.852261914197959, 16.901396535150095)),
((3.0, -1.0), (10.852261914197959, -16.901396535150095)),
((3.0, 0.5), (17.62671694999471, 9.629519357553853)),
((3.0, -2.0), (-8.358532650935372, -18.263727040666765)),
((3.0, 3.0), (-19.884530844146987, 2.834471132487004)),
((1.0, 2.0), (-1.1312043837568135, 2.4717266720048188)),
((-3.0, 0.5), (0.04369226300728118, 0.02386919206778745)),
((1e-05, 1e-05), (1.0000099999999996, 1.0000100000333332e-05)),
((25.0, 0.0), (72004899337.38588, 0.0)),
((0.0, 30.0), (0.15425144988758405, -0.9880316240928618)),
((22.5, -3.0), (-5851372493.384442, -834092921.1718698)),
((10.0, 100000.0), (-22012.38664170821, 787.4196757360774)),
(
(700.0, 1.0),
(5.4799191785870425e+303, 8.534468459216007e+303),
),
((750.0, 2.0), (f64::NEG_INFINITY, f64::INFINITY)),
((-750.0, 2.0), (-0.0, 0.0)),
((1e+300, 1e+300), (f64::NEG_INFINITY, f64::NEG_INFINITY)),
((-1e+300, -1e+300), (-0.0, 0.0)),
((1e-300, 1e-300), (1.0, 1e-300)),
((5e-324, 0.0), (1.0, 0.0)),
((-4.0, 0.0), (0.01831563888873418, 0.0)),
((-4.0, 0.0), (0.01831563888873418, 0.0)),
((-4.0, 0.0), (0.01831563888873418, 0.0)),
((-4.0, -0.0), (0.01831563888873418, -0.0)),
((0.5, 1e-10), (1.6487212707001282, 1.6487212707001281e-10)),
((1.0, 1e-10), (2.718281828459045, 2.718281828459045e-10)),
((1.0, -1e-10), (2.718281828459045, -2.718281828459045e-10)),
(
(0.999999, 0.001),
(2.718277751039134, 0.0027182786571320803),
),
((3.0, 4.0), (-13.128783081462158, -15.200784463067954)),
(
(-1.0, 1e-300),
(0.36787944117144233, 3.6787944117144232e-301),
),
((2.0, -2.0), (-3.074932320639359, -6.71884969742825)),
((8.5, 0.1), (4890.215467476291, 490.6581653564319)),
(
(-9.0, 40.0),
(-8.230669552645545e-05, 9.195426915716306e-05),
),
((12.0, 200.0), (79292.1284276747, -142133.31945484356)),
((-0.3, -0.4), (0.6823387667165518, -0.2884882034499186)),
(
(100000000.0, 100000000.0),
(f64::NEG_INFINITY, f64::INFINITY),
),
((1.7e+308, 1.7e+308), (f64::INFINITY, f64::NEG_INFINITY)),
((-1.7e+308, 1.0), (0.0, 0.0)),
(
(100.0, 0.5),
(2.3590447279764306e+43, 1.2887520085463915e+43),
),
(
(-100.0, -0.5),
(3.2646738054631943e-44, -1.7834994284523456e-44),
),
((0.1, 0.1), (1.0996496668294093, 0.11033298873020372)),
(
(709.5, 0.5),
(1.1891123654305422e+308, 6.496150459387445e+307),
),
((0.0, 2.0), (-0.4161468365471424, 0.9092974268256817)),
((0.0, -2.0), (-0.4161468365471424, -0.9092974268256817)),
((-0.0, -2.0), (-0.4161468365471424, -0.9092974268256817)),
];
for &((re, im), want) in CASES {
let z = Complex::new(re, im);
check_c(
"exp",
&format!("{z:?}"),
z.exp(),
want,
1e-12,
!finite_input(z),
);
}
}
#[test]
fn complex_ln_f64() {
let _report = Report;
const CASES: &[((f64, f64), (f64, f64))] = &[
((f64::NAN, f64::NAN), (f64::NAN, f64::NAN)),
((f64::NAN, f64::INFINITY), (f64::INFINITY, f64::NAN)),
((f64::NAN, f64::NEG_INFINITY), (f64::INFINITY, f64::NAN)),
((f64::NAN, 0.0), (f64::NAN, f64::NAN)),
((f64::NAN, -0.0), (f64::NAN, f64::NAN)),
((f64::NAN, 1.0), (f64::NAN, f64::NAN)),
((f64::NAN, -1.0), (f64::NAN, f64::NAN)),
((f64::NAN, 0.5), (f64::NAN, f64::NAN)),
((f64::NAN, -2.0), (f64::NAN, f64::NAN)),
((f64::NAN, 3.0), (f64::NAN, f64::NAN)),
((f64::INFINITY, f64::NAN), (f64::INFINITY, f64::NAN)),
(
(f64::INFINITY, f64::INFINITY),
(f64::INFINITY, 0.7853981633974483),
),
(
(f64::INFINITY, f64::NEG_INFINITY),
(f64::INFINITY, -0.7853981633974483),
),
((f64::INFINITY, 0.0), (f64::INFINITY, 0.0)),
((f64::INFINITY, -0.0), (f64::INFINITY, -0.0)),
((f64::INFINITY, 1.0), (f64::INFINITY, 0.0)),
((f64::INFINITY, -1.0), (f64::INFINITY, -0.0)),
((f64::INFINITY, 0.5), (f64::INFINITY, 0.0)),
((f64::INFINITY, -2.0), (f64::INFINITY, -0.0)),
((f64::INFINITY, 3.0), (f64::INFINITY, 0.0)),
((f64::NEG_INFINITY, f64::NAN), (f64::INFINITY, f64::NAN)),
(
(f64::NEG_INFINITY, f64::INFINITY),
(f64::INFINITY, 2.356194490192345),
),
(
(f64::NEG_INFINITY, f64::NEG_INFINITY),
(f64::INFINITY, -2.356194490192345),
),
((f64::NEG_INFINITY, 0.0), (f64::INFINITY, 3.141592653589793)),
(
(f64::NEG_INFINITY, -0.0),
(f64::INFINITY, -3.141592653589793),
),
((f64::NEG_INFINITY, 1.0), (f64::INFINITY, 3.141592653589793)),
(
(f64::NEG_INFINITY, -1.0),
(f64::INFINITY, -3.141592653589793),
),
((f64::NEG_INFINITY, 0.5), (f64::INFINITY, 3.141592653589793)),
(
(f64::NEG_INFINITY, -2.0),
(f64::INFINITY, -3.141592653589793),
),
((f64::NEG_INFINITY, 3.0), (f64::INFINITY, 3.141592653589793)),
((0.0, f64::NAN), (f64::NAN, f64::NAN)),
((0.0, f64::INFINITY), (f64::INFINITY, 1.5707963267948966)),
(
(0.0, f64::NEG_INFINITY),
(f64::INFINITY, -1.5707963267948966),
),
((0.0, 0.0), (f64::NEG_INFINITY, 0.0)),
((0.0, -0.0), (f64::NEG_INFINITY, -0.0)),
((0.0, 1.0), (0.0, 1.5707963267948966)),
((0.0, -1.0), (0.0, -1.5707963267948966)),
((0.0, 0.5), (-0.6931471805599453, 1.5707963267948966)),
((0.0, -2.0), (0.6931471805599453, -1.5707963267948966)),
((0.0, 3.0), (1.0986122886681098, 1.5707963267948966)),
((-0.0, f64::NAN), (f64::NAN, f64::NAN)),
((-0.0, f64::INFINITY), (f64::INFINITY, 1.5707963267948966)),
(
(-0.0, f64::NEG_INFINITY),
(f64::INFINITY, -1.5707963267948966),
),
((-0.0, 0.0), (f64::NEG_INFINITY, 3.141592653589793)),
((-0.0, -0.0), (f64::NEG_INFINITY, -3.141592653589793)),
((-0.0, 1.0), (0.0, 1.5707963267948966)),
((-0.0, -1.0), (0.0, -1.5707963267948966)),
((-0.0, 0.5), (-0.6931471805599453, 1.5707963267948966)),
((-0.0, -2.0), (0.6931471805599453, -1.5707963267948966)),
((-0.0, 3.0), (1.0986122886681098, 1.5707963267948966)),
((1.0, f64::NAN), (f64::NAN, f64::NAN)),
((1.0, f64::INFINITY), (f64::INFINITY, 1.5707963267948966)),
(
(1.0, f64::NEG_INFINITY),
(f64::INFINITY, -1.5707963267948966),
),
((1.0, 0.0), (0.0, 0.0)),
((1.0, -0.0), (0.0, -0.0)),
((1.0, 1.0), (0.34657359027997264, 0.7853981633974483)),
((1.0, -1.0), (0.34657359027997264, -0.7853981633974483)),
((1.0, 0.5), (0.11157177565710488, 0.4636476090008061)),
((1.0, -2.0), (0.8047189562170503, -1.1071487177940904)),
((1.0, 3.0), (1.151292546497023, 1.2490457723982544)),
((-1.0, f64::NAN), (f64::NAN, f64::NAN)),
((-1.0, f64::INFINITY), (f64::INFINITY, 1.5707963267948966)),
(
(-1.0, f64::NEG_INFINITY),
(f64::INFINITY, -1.5707963267948966),
),
((-1.0, 0.0), (0.0, 3.141592653589793)),
((-1.0, -0.0), (0.0, -3.141592653589793)),
((-1.0, 1.0), (0.34657359027997264, 2.356194490192345)),
((-1.0, -1.0), (0.34657359027997264, -2.356194490192345)),
((-1.0, 0.5), (0.11157177565710488, 2.677945044588987)),
((-1.0, -2.0), (0.8047189562170503, -2.0344439357957027)),
((-1.0, 3.0), (1.151292546497023, 1.892546881191539)),
((0.5, f64::NAN), (f64::NAN, f64::NAN)),
((0.5, f64::INFINITY), (f64::INFINITY, 1.5707963267948966)),
(
(0.5, f64::NEG_INFINITY),
(f64::INFINITY, -1.5707963267948966),
),
((0.5, 0.0), (-0.6931471805599453, 0.0)),
((0.5, -0.0), (-0.6931471805599453, -0.0)),
((0.5, 1.0), (0.11157177565710488, 1.1071487177940904)),
((0.5, -1.0), (0.11157177565710488, -1.1071487177940904)),
((0.5, 0.5), (-0.3465735902799726, 0.7853981633974483)),
((0.5, -2.0), (0.7234594914681627, -1.3258176636680326)),
((0.5, 3.0), (1.1123117757621668, 1.4056476493802699)),
((-2.0, f64::NAN), (f64::NAN, f64::NAN)),
((-2.0, f64::INFINITY), (f64::INFINITY, 1.5707963267948966)),
(
(-2.0, f64::NEG_INFINITY),
(f64::INFINITY, -1.5707963267948966),
),
((-2.0, 0.0), (0.6931471805599453, 3.141592653589793)),
((-2.0, -0.0), (0.6931471805599453, -3.141592653589793)),
((-2.0, 1.0), (0.8047189562170503, 2.677945044588987)),
((-2.0, -1.0), (0.8047189562170503, -2.677945044588987)),
((-2.0, 0.5), (0.7234594914681627, 2.896613990462929)),
((-2.0, -2.0), (1.039720770839918, -2.356194490192345)),
((-2.0, 3.0), (1.2824746787307684, 2.158798930342464)),
((3.0, f64::NAN), (f64::NAN, f64::NAN)),
((3.0, f64::INFINITY), (f64::INFINITY, 1.5707963267948966)),
(
(3.0, f64::NEG_INFINITY),
(f64::INFINITY, -1.5707963267948966),
),
((3.0, 0.0), (1.0986122886681098, 0.0)),
((3.0, -0.0), (1.0986122886681098, -0.0)),
((3.0, 1.0), (1.151292546497023, 0.3217505543966422)),
((3.0, -1.0), (1.151292546497023, -0.3217505543966422)),
((3.0, 0.5), (1.1123117757621668, 0.16514867741462683)),
((3.0, -2.0), (1.2824746787307684, -0.5880026035475675)),
((3.0, 3.0), (1.4451858789480823, 0.7853981633974483)),
((1.0, 2.0), (0.8047189562170503, 1.1071487177940904)),
((-3.0, 0.5), (1.1123117757621668, 2.976443976175166)),
((1e-05, 1e-05), (-11.166351874690255, 0.7853981633974483)),
((25.0, 0.0), (3.2188758248682006, 0.0)),
((0.0, 30.0), (3.4011973816621555, 1.5707963267948966)),
((22.5, -3.0), (3.122326109885284, -0.13255153229667402)),
((10.0, 100000.0), (11.512925469970229, 1.5706963267952299)),
((700.0, 1.0), (6.551081355450527, 0.0014285704567553203)),
((710.0, 1.0), (6.56526596190107, 0.0014084497728962322)),
((750.0, 2.0), (6.6200767620732694, 0.0026666603457059816)),
((-750.0, 2.0), (6.6200767620732694, 3.1389259932440874)),
((1e+300, 1e+300), (691.1221014884936, 0.7853981633974483)),
((-1e+300, -1e+300), (691.1221014884936, -2.356194490192345)),
((1e-300, 1e-300), (-690.4289543079337, 0.7853981633974483)),
((5e-324, 0.0), (-744.4400719213813, 0.0)),
((-4.0, 0.0), (1.3862943611198906, 3.141592653589793)),
((-4.0, 0.0), (1.3862943611198906, 3.141592653589793)),
((-4.0, 0.0), (1.3862943611198906, 3.141592653589793)),
((-4.0, -0.0), (1.3862943611198906, -3.141592653589793)),
((0.5, 1e-10), (-0.6931471805599453, 2e-10)),
((1.0, 1e-10), (5.0000000000000005e-21, 1e-10)),
((1.0, -1e-10), (5.0000000000000005e-21, -1e-10)),
(
(0.999999, 0.001),
(-4.999997500284222e-07, 0.0010000006666668667),
),
((3.0, 4.0), (1.6094379124341003, 0.9272952180016122)),
((-1.0, 1e-300), (0.0, 3.141592653589793)),
((2.0, -2.0), (1.039720770839918, -0.7853981633974483)),
((8.5, 0.1), (2.140135362859747, 0.011764163149758748)),
((-9.0, 40.0), (3.713572066704308, 1.7921107691426879)),
((12.0, 200.0), (5.300114134303102, 1.5108681716736887)),
((-0.3, -0.4), (-0.6931471805599453, -2.214297435588181)),
(
(100000000.0, 100000000.0),
(18.767254334232337, 0.7853981633974483),
),
(
(1.7e+308, 1.7e+308),
(710.0734104835082, 0.7853981633974483),
),
((-1.7e+308, 1.0), (709.7268368932282, 3.141592653589793)),
((100.0, 0.5), (4.605182685831844, 0.0049999583339583225)),
((-100.0, -0.5), (4.605182685831844, -3.136592695255835)),
((0.1, 0.1), (-1.9560115027140728, 0.7853981633974483)),
((709.5, 0.5), (6.564560744916327, 0.0007047215182916526)),
(
(709.9, 1.5707963267948966),
(6.5651265630618525, 0.0022126972295242356),
),
((0.0, 2.0), (0.6931471805599453, 1.5707963267948966)),
((0.0, -2.0), (0.6931471805599453, -1.5707963267948966)),
((-0.0, -2.0), (0.6931471805599453, -1.5707963267948966)),
];
for &((re, im), want) in CASES {
let z = Complex::new(re, im);
check_c(
"ln",
&format!("{z:?}"),
z.ln(),
want,
1e-12,
!finite_input(z),
);
}
}
#[test]
fn complex_sqrt_f64() {
let _report = Report;
const CASES: &[((f64, f64), (f64, f64))] = &[
((f64::NAN, f64::NAN), (f64::NAN, f64::NAN)),
((f64::NAN, f64::INFINITY), (f64::INFINITY, f64::INFINITY)),
(
(f64::NAN, f64::NEG_INFINITY),
(f64::INFINITY, f64::NEG_INFINITY),
),
((f64::NAN, 0.0), (f64::NAN, f64::NAN)),
((f64::NAN, -0.0), (f64::NAN, f64::NAN)),
((f64::NAN, 1.0), (f64::NAN, f64::NAN)),
((f64::NAN, -1.0), (f64::NAN, f64::NAN)),
((f64::NAN, 0.5), (f64::NAN, f64::NAN)),
((f64::NAN, -2.0), (f64::NAN, f64::NAN)),
((f64::NAN, 3.0), (f64::NAN, f64::NAN)),
((f64::INFINITY, f64::NAN), (f64::INFINITY, f64::NAN)),
(
(f64::INFINITY, f64::INFINITY),
(f64::INFINITY, f64::INFINITY),
),
(
(f64::INFINITY, f64::NEG_INFINITY),
(f64::INFINITY, f64::NEG_INFINITY),
),
((f64::INFINITY, 0.0), (f64::INFINITY, 0.0)),
((f64::INFINITY, -0.0), (f64::INFINITY, -0.0)),
((f64::INFINITY, 1.0), (f64::INFINITY, 0.0)),
((f64::INFINITY, -1.0), (f64::INFINITY, -0.0)),
((f64::INFINITY, 0.5), (f64::INFINITY, 0.0)),
((f64::INFINITY, -2.0), (f64::INFINITY, -0.0)),
((f64::INFINITY, 3.0), (f64::INFINITY, 0.0)),
((f64::NEG_INFINITY, f64::NAN), (f64::NAN, f64::INFINITY)),
(
(f64::NEG_INFINITY, f64::INFINITY),
(f64::INFINITY, f64::INFINITY),
),
(
(f64::NEG_INFINITY, f64::NEG_INFINITY),
(f64::INFINITY, f64::NEG_INFINITY),
),
((f64::NEG_INFINITY, 0.0), (0.0, f64::INFINITY)),
((f64::NEG_INFINITY, -0.0), (0.0, f64::NEG_INFINITY)),
((f64::NEG_INFINITY, 1.0), (0.0, f64::INFINITY)),
((f64::NEG_INFINITY, -1.0), (0.0, f64::NEG_INFINITY)),
((f64::NEG_INFINITY, 0.5), (0.0, f64::INFINITY)),
((f64::NEG_INFINITY, -2.0), (0.0, f64::NEG_INFINITY)),
((f64::NEG_INFINITY, 3.0), (0.0, f64::INFINITY)),
((0.0, f64::NAN), (f64::NAN, f64::NAN)),
((0.0, f64::INFINITY), (f64::INFINITY, f64::INFINITY)),
((0.0, f64::NEG_INFINITY), (f64::INFINITY, f64::NEG_INFINITY)),
((0.0, 0.0), (0.0, 0.0)),
((0.0, -0.0), (0.0, -0.0)),
((0.0, 1.0), (0.7071067811865476, 0.7071067811865475)),
((0.0, -1.0), (0.7071067811865476, -0.7071067811865475)),
((0.0, 0.5), (0.5, 0.5)),
((0.0, -2.0), (1.0, -1.0)),
((0.0, 3.0), (1.224744871391589, 1.2247448713915892)),
((-0.0, f64::NAN), (f64::NAN, f64::NAN)),
((-0.0, f64::INFINITY), (f64::INFINITY, f64::INFINITY)),
(
(-0.0, f64::NEG_INFINITY),
(f64::INFINITY, f64::NEG_INFINITY),
),
((-0.0, 0.0), (0.0, 0.0)),
((-0.0, -0.0), (0.0, -0.0)),
((-0.0, 1.0), (0.7071067811865476, 0.7071067811865475)),
((-0.0, -1.0), (0.7071067811865476, -0.7071067811865475)),
((-0.0, 0.5), (0.5, 0.5)),
((-0.0, -2.0), (1.0, -1.0)),
((-0.0, 3.0), (1.224744871391589, 1.2247448713915892)),
((1.0, f64::NAN), (f64::NAN, f64::NAN)),
((1.0, f64::INFINITY), (f64::INFINITY, f64::INFINITY)),
((1.0, f64::NEG_INFINITY), (f64::INFINITY, f64::NEG_INFINITY)),
((1.0, 0.0), (1.0, 0.0)),
((1.0, -0.0), (1.0, -0.0)),
((1.0, 1.0), (1.09868411346781, 0.45508986056222733)),
((1.0, -1.0), (1.09868411346781, -0.45508986056222733)),
((1.0, 0.5), (1.0290855136357462, 0.24293413587832283)),
((1.0, -2.0), (1.272019649514069, -0.7861513777574233)),
((1.0, 3.0), (1.442615274452683, 1.0397782600555705)),
((-1.0, f64::NAN), (f64::NAN, f64::NAN)),
((-1.0, f64::INFINITY), (f64::INFINITY, f64::INFINITY)),
(
(-1.0, f64::NEG_INFINITY),
(f64::INFINITY, f64::NEG_INFINITY),
),
((-1.0, 0.0), (0.0, 1.0)),
((-1.0, -0.0), (0.0, -1.0)),
((-1.0, 1.0), (0.45508986056222733, 1.09868411346781)),
((-1.0, -1.0), (0.45508986056222733, -1.09868411346781)),
((-1.0, 0.5), (0.24293413587832283, 1.0290855136357462)),
((-1.0, -2.0), (0.7861513777574233, -1.272019649514069)),
((-1.0, 3.0), (1.0397782600555705, 1.442615274452683)),
((0.5, f64::NAN), (f64::NAN, f64::NAN)),
((0.5, f64::INFINITY), (f64::INFINITY, f64::INFINITY)),
((0.5, f64::NEG_INFINITY), (f64::INFINITY, f64::NEG_INFINITY)),
((0.5, 0.0), (0.7071067811865476, 0.0)),
((0.5, -0.0), (0.7071067811865476, -0.0)),
((0.5, 1.0), (0.8994537199739336, 0.5558929702514211)),
((0.5, -1.0), (0.8994537199739336, -0.5558929702514211)),
((0.5, 0.5), (0.7768869870150187, 0.3217971264527913)),
((0.5, -2.0), (1.1317139242778693, -0.8836155308755134)),
((0.5, 3.0), (1.3306729998668174, 1.1272491439670977)),
((-2.0, f64::NAN), (f64::NAN, f64::NAN)),
((-2.0, f64::INFINITY), (f64::INFINITY, f64::INFINITY)),
(
(-2.0, f64::NEG_INFINITY),
(f64::INFINITY, f64::NEG_INFINITY),
),
((-2.0, 0.0), (0.0, 1.4142135623730951)),
((-2.0, -0.0), (0.0, -1.4142135623730951)),
((-2.0, 1.0), (0.34356074972251244, 1.455346690225355)),
((-2.0, -1.0), (0.34356074972251244, -1.455346690225355)),
((-2.0, 0.5), (0.17543205637629383, 1.425053124063947)),
((-2.0, -2.0), (0.6435942529055826, -1.5537739740300374)),
((-2.0, 3.0), (0.8959774761298381, 1.6741492280355401)),
((3.0, f64::NAN), (f64::NAN, f64::NAN)),
((3.0, f64::INFINITY), (f64::INFINITY, f64::INFINITY)),
((3.0, f64::NEG_INFINITY), (f64::INFINITY, f64::NEG_INFINITY)),
((3.0, 0.0), (1.7320508075688772, 0.0)),
((3.0, -0.0), (1.7320508075688772, -0.0)),
((3.0, 1.0), (1.755317301824428, 0.28484878459314106)),
((3.0, -1.0), (1.755317301824428, -0.28484878459314106)),
((3.0, 0.5), (1.738013415533538, 0.14384238796180673)),
((3.0, -2.0), (1.8173540210239707, -0.5502505227003375)),
((3.0, 3.0), (1.9029767059950162, 0.7882387605032136)),
((1.0, 2.0), (1.272019649514069, 0.7861513777574233)),
((-3.0, 0.5), (0.14384238796180673, 1.738013415533538)),
(
(1e-05, 1e-05),
(0.0034743442276011565, 0.0014391204994250743),
),
((25.0, 0.0), (5.0, 0.0)),
((0.0, 30.0), (3.872983346207417, 3.8729833462074166)),
((22.5, -3.0), (4.753899395529544, -0.3155304467340148)),
((10.0, 100000.0), (223.617978369361, 223.59561768961393)),
((700.0, 1.0), (26.457519860007192, 0.018898218829490245)),
((710.0, 1.0), (26.64583179622099, 0.018764660973012368)),
((750.0, 2.0), (27.38615221842899, 0.036514804709479015)),
((-750.0, 2.0), (0.036514804709479015, 27.38615221842899)),
(
(1e+300, 1e+300),
(1.09868411346781e+150, 4.550898605622274e+149),
),
(
(-1e+300, -1e+300),
(4.550898605622274e+149, -1.09868411346781e+150),
),
(
(1e-300, 1e-300),
(1.09868411346781e-150, 4.5508986056222734e-151),
),
((5e-324, 0.0), (2.2227587494850775e-162, 0.0)),
((-4.0, 0.0), (0.0, 2.0)),
((-4.0, 0.0), (0.0, 2.0)),
((-4.0, 0.0), (0.0, 2.0)),
((-4.0, -0.0), (0.0, -2.0)),
((0.5, 1e-10), (0.7071067811865476, 7.071067811865475e-11)),
((1.0, 1e-10), (1.0, 5e-11)),
((1.0, -1e-10), (1.0, -5e-11)),
(
(0.999999, 0.001),
(0.9999996250000235, 0.0005000001875000586),
),
((3.0, 4.0), (2.0, 1.0)),
((-1.0, 1e-300), (5e-301, 1.0)),
((2.0, -2.0), (1.5537739740300374, -0.6435942529055826)),
((8.5, 0.1), (2.915526386001451, 0.017149561821861392)),
((-9.0, 40.0), (4.0, 5.0)),
((12.0, 200.0), (10.30436015922122, 9.704629734871162)),
((-0.3, -0.4), (0.31622776601683794, -0.6324555320336759)),
(
(100000000.0, 100000000.0),
(10986.8411346781, 4550.898605622274),
),
((100.0, 0.5), (10.000031249755862, 0.02499992187585448)),
((-100.0, -0.5), (0.02499992187585448, -10.000031249755862)),
((0.1, 0.1), (0.34743442276011566, 0.14391204994250742)),
((709.5, 0.5), (26.636442857299723, 0.009385637614576881)),
(
(709.9, 1.5707963267948966),
(26.64396496252997, 0.029477525754968228),
),
((0.0, 2.0), (1.0, 1.0)),
((0.0, -2.0), (1.0, -1.0)),
((-0.0, -2.0), (1.0, -1.0)),
];
for &((re, im), want) in CASES {
let z = Complex::new(re, im);
check_c(
"sqrt",
&format!("{z:?}"),
z.sqrt(),
want,
1e-12,
!finite_input(z),
);
}
}
#[test]
fn complex_sin_f64() {
let _report = Report;
const CASES: &[((f64, f64), (f64, f64))] = &[
((f64::NAN, f64::NAN), (f64::NAN, f64::NAN)),
((f64::NAN, f64::INFINITY), (f64::NAN, f64::INFINITY)),
((f64::NAN, f64::NEG_INFINITY), (f64::NAN, f64::NEG_INFINITY)),
((f64::NAN, 0.0), (f64::NAN, 0.0)),
((f64::NAN, -0.0), (f64::NAN, -0.0)),
((f64::NAN, 1.0), (f64::NAN, f64::NAN)),
((f64::NAN, -1.0), (f64::NAN, f64::NAN)),
((f64::NAN, 0.5), (f64::NAN, f64::NAN)),
((f64::NAN, -2.0), (f64::NAN, f64::NAN)),
((f64::NAN, 3.0), (f64::NAN, f64::NAN)),
((f64::INFINITY, f64::NAN), (f64::NAN, f64::NAN)),
((f64::INFINITY, f64::INFINITY), (f64::NAN, f64::INFINITY)),
(
(f64::INFINITY, f64::NEG_INFINITY),
(f64::NAN, f64::NEG_INFINITY),
),
((f64::INFINITY, 0.0), (f64::NAN, 0.0)),
((f64::INFINITY, -0.0), (f64::NAN, -0.0)),
((f64::INFINITY, 1.0), (f64::NAN, f64::NAN)),
((f64::INFINITY, -1.0), (f64::NAN, f64::NAN)),
((f64::INFINITY, 0.5), (f64::NAN, f64::NAN)),
((f64::INFINITY, -2.0), (f64::NAN, f64::NAN)),
((f64::INFINITY, 3.0), (f64::NAN, f64::NAN)),
((f64::NEG_INFINITY, f64::NAN), (f64::NAN, f64::NAN)),
(
(f64::NEG_INFINITY, f64::INFINITY),
(f64::NAN, f64::INFINITY),
),
(
(f64::NEG_INFINITY, f64::NEG_INFINITY),
(f64::NAN, f64::NEG_INFINITY),
),
((f64::NEG_INFINITY, 0.0), (f64::NAN, 0.0)),
((f64::NEG_INFINITY, -0.0), (f64::NAN, -0.0)),
((f64::NEG_INFINITY, 1.0), (f64::NAN, f64::NAN)),
((f64::NEG_INFINITY, -1.0), (f64::NAN, f64::NAN)),
((f64::NEG_INFINITY, 0.5), (f64::NAN, f64::NAN)),
((f64::NEG_INFINITY, -2.0), (f64::NAN, f64::NAN)),
((f64::NEG_INFINITY, 3.0), (f64::NAN, f64::NAN)),
((0.0, f64::NAN), (0.0, f64::NAN)),
((0.0, f64::INFINITY), (0.0, f64::INFINITY)),
((0.0, f64::NEG_INFINITY), (0.0, f64::NEG_INFINITY)),
((0.0, 0.0), (0.0, 0.0)),
((0.0, -0.0), (0.0, -0.0)),
((0.0, 1.0), (0.0, 1.1752011936438014)),
((0.0, -1.0), (0.0, -1.1752011936438014)),
((0.0, 0.5), (0.0, 0.5210953054937474)),
((0.0, -2.0), (0.0, -3.626860407847019)),
((0.0, 3.0), (0.0, 10.017874927409903)),
((-0.0, f64::NAN), (-0.0, f64::NAN)),
((-0.0, f64::INFINITY), (-0.0, f64::INFINITY)),
((-0.0, f64::NEG_INFINITY), (-0.0, f64::NEG_INFINITY)),
((-0.0, 0.0), (-0.0, 0.0)),
((-0.0, -0.0), (-0.0, -0.0)),
((-0.0, 1.0), (-0.0, 1.1752011936438014)),
((-0.0, -1.0), (-0.0, -1.1752011936438014)),
((-0.0, 0.5), (-0.0, 0.5210953054937474)),
((-0.0, -2.0), (-0.0, -3.626860407847019)),
((-0.0, 3.0), (-0.0, 10.017874927409903)),
((1.0, f64::NAN), (f64::NAN, f64::NAN)),
((1.0, f64::INFINITY), (f64::INFINITY, f64::INFINITY)),
((1.0, f64::NEG_INFINITY), (f64::INFINITY, f64::NEG_INFINITY)),
((1.0, 0.0), (0.8414709848078965, 0.0)),
((1.0, -0.0), (0.8414709848078965, -0.0)),
((1.0, 1.0), (1.2984575814159773, 0.6349639147847361)),
((1.0, -1.0), (1.2984575814159773, -0.6349639147847361)),
((1.0, 0.5), (0.948864531437168, 0.28154899513533443)),
((1.0, -2.0), (3.165778513216168, -1.9596010414216063)),
((1.0, 3.0), (8.471645454300148, 5.412680923178193)),
((-1.0, f64::NAN), (f64::NAN, f64::NAN)),
((-1.0, f64::INFINITY), (f64::NEG_INFINITY, f64::INFINITY)),
(
(-1.0, f64::NEG_INFINITY),
(f64::NEG_INFINITY, f64::NEG_INFINITY),
),
((-1.0, 0.0), (-0.8414709848078965, 0.0)),
((-1.0, -0.0), (-0.8414709848078965, -0.0)),
((-1.0, 1.0), (-1.2984575814159773, 0.6349639147847361)),
((-1.0, -1.0), (-1.2984575814159773, -0.6349639147847361)),
((-1.0, 0.5), (-0.948864531437168, 0.28154899513533443)),
((-1.0, -2.0), (-3.165778513216168, -1.9596010414216063)),
((-1.0, 3.0), (-8.471645454300148, 5.412680923178193)),
((0.5, f64::NAN), (f64::NAN, f64::NAN)),
((0.5, f64::INFINITY), (f64::INFINITY, f64::INFINITY)),
((0.5, f64::NEG_INFINITY), (f64::INFINITY, f64::NEG_INFINITY)),
((0.5, 0.0), (0.479425538604203, 0.0)),
((0.5, -0.0), (0.479425538604203, -0.0)),
((0.5, 1.0), (0.7397922644560138, 1.0313360742545512)),
((0.5, -1.0), (0.7397922644560138, -1.0313360742545512)),
((0.5, 0.5), (0.5406126857131534, 0.4573041531842493)),
((0.5, -2.0), (1.8036926955321817, -3.1828694483371494)),
((0.5, 3.0), (4.82669427481082, 8.791512343493714)),
((-2.0, f64::NAN), (f64::NAN, f64::NAN)),
(
(-2.0, f64::INFINITY),
(f64::NEG_INFINITY, f64::NEG_INFINITY),
),
(
(-2.0, f64::NEG_INFINITY),
(f64::NEG_INFINITY, f64::INFINITY),
),
((-2.0, 0.0), (-0.9092974268256817, -0.0)),
((-2.0, -0.0), (-0.9092974268256817, 0.0)),
((-2.0, 1.0), (-1.4031192506220405, -0.4890562590412937)),
((-2.0, -1.0), (-1.4031192506220405, 0.4890562590412937)),
((-2.0, 0.5), (-1.0253473885839877, -0.21685216292078974)),
((-2.0, -2.0), (-3.4209548611170133, 1.5093064853236158)),
((-2.0, 3.0), (-9.15449914691143, -4.168906959966565)),
((3.0, f64::NAN), (f64::NAN, f64::NAN)),
((3.0, f64::INFINITY), (f64::INFINITY, f64::NEG_INFINITY)),
((3.0, f64::NEG_INFINITY), (f64::INFINITY, f64::INFINITY)),
((3.0, 0.0), (0.1411200080598672, -0.0)),
((3.0, -0.0), (0.1411200080598672, 0.0)),
((3.0, 1.0), (0.21775955162215221, -1.1634403637032504)),
((3.0, -1.0), (0.21775955162215221, 1.1634403637032504)),
((3.0, 0.5), (0.15913058529843999, -0.5158804424525267)),
((3.0, -2.0), (0.5309210862485197, 3.59056458998578)),
((3.0, 3.0), (1.4207485419881771, -9.917621010017536)),
((1.0, 2.0), (3.165778513216168, 1.9596010414216063)),
((-3.0, 0.5), (-0.15913058529843999, -0.5158804424525267)),
(
(1e-05, 1e-05),
(1.0000000000333334e-05, 9.999999999666668e-06),
),
((25.0, 0.0), (-0.13235175009777303, 0.0)),
((0.0, 30.0), (0.0, 5343237290762.231)),
((22.5, -3.0), (-4.904708324410233, 8.74865665798356)),
((10.0, 100000.0), (f64::NEG_INFINITY, f64::NEG_INFINITY)),
((700.0, 1.0), (0.8393903805123379, -0.9861164053667258)),
((710.0, 1.0), (9.303033579384142e-05, 1.175201191508033)),
((750.0, 2.0), (2.8031102431316306, -2.419054171389231)),
((-750.0, 2.0), (-2.8031102431316306, -2.419054171389231)),
((1e+300, 1e+300), (f64::NEG_INFINITY, f64::NEG_INFINITY)),
((-1e+300, -1e+300), (f64::INFINITY, f64::INFINITY)),
((1e-300, 1e-300), (1e-300, 1e-300)),
((5e-324, 0.0), (5e-324, 0.0)),
((-4.0, 0.0), (0.7568024953079282, -0.0)),
((-4.0, 0.0), (0.7568024953079282, -0.0)),
((-4.0, 0.0), (0.7568024953079282, -0.0)),
((-4.0, -0.0), (0.7568024953079282, 0.0)),
((0.5, 1e-10), (0.479425538604203, 8.775825618903728e-11)),
((1.0, 1e-10), (0.8414709848078965, 5.4030230586813976e-11)),
((1.0, -1e-10), (0.8414709848078965, -5.4030230586813976e-11)),
(
(0.999999, 0.001),
(0.8414708652404271, 0.0005403032373893834),
),
((3.0, 4.0), (3.853738037919377, -27.016813258003932)),
(
(-1.0, 1e-300),
(-0.8414709848078965, 5.4030230586813975e-301),
),
((2.0, -2.0), (3.4209548611170133, 1.5093064853236158)),
((8.5, 0.1), (0.8024828763254515, -0.060301575765201405)),
(
(-9.0, 40.0),
(-4.850330980854968e+16, -1.072333199085043e+17),
),
(
(12.0, 200.0),
(-1.9386309150789158e+86, 3.048833284965028e+86),
),
((-0.3, -0.4), (-0.31947873074156474, -0.39240668483263885)),
(
(100000000.0, 100000000.0),
(f64::INFINITY, f64::NEG_INFINITY),
),
((1.7e+308, 1.7e+308), (f64::NEG_INFINITY, f64::INFINITY)),
((-1.7e+308, 1.0), (0.9185281373083551, 0.9443165322503537)),
((100.0, 0.5), (-0.5709910448037395, 0.4493503161877744)),
((-100.0, -0.5), (0.5709910448037395, -0.4493503161877744)),
((0.1, 0.1), (0.10033299984131393, 0.0996663334921076)),
((709.5, 0.5), (-0.5405530239378815, 0.45731921406356385)),
(
(709.9, 1.5707963267948966),
(-0.2503493406661186, 2.2898158403053874),
),
((0.0, 2.0), (0.0, 3.626860407847019)),
((0.0, -2.0), (0.0, -3.626860407847019)),
((-0.0, -2.0), (-0.0, -3.626860407847019)),
];
for &((re, im), want) in CASES {
let z = Complex::new(re, im);
check_c(
"sin",
&format!("{z:?}"),
z.sin(),
want,
1e-12,
!finite_input(z),
);
}
}
#[test]
fn complex_cos_f64() {
let _report = Report;
const CASES: &[((f64, f64), (f64, f64))] = &[
((f64::NAN, f64::NAN), (f64::NAN, f64::NAN)),
((f64::NAN, f64::INFINITY), (f64::INFINITY, f64::NAN)),
((f64::NAN, f64::NEG_INFINITY), (f64::INFINITY, f64::NAN)),
((f64::NAN, 0.0), (f64::NAN, -0.0)),
((f64::NAN, -0.0), (f64::NAN, 0.0)),
((f64::NAN, 1.0), (f64::NAN, f64::NAN)),
((f64::NAN, -1.0), (f64::NAN, f64::NAN)),
((f64::NAN, 0.5), (f64::NAN, f64::NAN)),
((f64::NAN, -2.0), (f64::NAN, f64::NAN)),
((f64::NAN, 3.0), (f64::NAN, f64::NAN)),
((f64::INFINITY, f64::NAN), (f64::NAN, f64::NAN)),
((f64::INFINITY, f64::INFINITY), (f64::INFINITY, f64::NAN)),
(
(f64::INFINITY, f64::NEG_INFINITY),
(f64::INFINITY, f64::NAN),
),
((f64::INFINITY, 0.0), (f64::NAN, 0.0)),
((f64::INFINITY, -0.0), (f64::NAN, 0.0)),
((f64::INFINITY, 1.0), (f64::NAN, f64::NAN)),
((f64::INFINITY, -1.0), (f64::NAN, f64::NAN)),
((f64::INFINITY, 0.5), (f64::NAN, f64::NAN)),
((f64::INFINITY, -2.0), (f64::NAN, f64::NAN)),
((f64::INFINITY, 3.0), (f64::NAN, f64::NAN)),
((f64::NEG_INFINITY, f64::NAN), (f64::NAN, f64::NAN)),
(
(f64::NEG_INFINITY, f64::INFINITY),
(f64::INFINITY, f64::NAN),
),
(
(f64::NEG_INFINITY, f64::NEG_INFINITY),
(f64::INFINITY, f64::NAN),
),
((f64::NEG_INFINITY, 0.0), (f64::NAN, -0.0)),
((f64::NEG_INFINITY, -0.0), (f64::NAN, -0.0)),
((f64::NEG_INFINITY, 1.0), (f64::NAN, f64::NAN)),
((f64::NEG_INFINITY, -1.0), (f64::NAN, f64::NAN)),
((f64::NEG_INFINITY, 0.5), (f64::NAN, f64::NAN)),
((f64::NEG_INFINITY, -2.0), (f64::NAN, f64::NAN)),
((f64::NEG_INFINITY, 3.0), (f64::NAN, f64::NAN)),
((0.0, f64::NAN), (f64::NAN, 0.0)),
((0.0, f64::INFINITY), (f64::INFINITY, -0.0)),
((0.0, f64::NEG_INFINITY), (f64::INFINITY, 0.0)),
((0.0, 0.0), (1.0, -0.0)),
((0.0, -0.0), (1.0, 0.0)),
((0.0, 1.0), (1.5430806348152437, -0.0)),
((0.0, -1.0), (1.5430806348152437, 0.0)),
((0.0, 0.5), (1.1276259652063807, -0.0)),
((0.0, -2.0), (3.7621956910836314, 0.0)),
((0.0, 3.0), (10.067661995777765, -0.0)),
((-0.0, f64::NAN), (f64::NAN, -0.0)),
((-0.0, f64::INFINITY), (f64::INFINITY, 0.0)),
((-0.0, f64::NEG_INFINITY), (f64::INFINITY, -0.0)),
((-0.0, 0.0), (1.0, 0.0)),
((-0.0, -0.0), (1.0, -0.0)),
((-0.0, 1.0), (1.5430806348152437, 0.0)),
((-0.0, -1.0), (1.5430806348152437, -0.0)),
((-0.0, 0.5), (1.1276259652063807, 0.0)),
((-0.0, -2.0), (3.7621956910836314, -0.0)),
((-0.0, 3.0), (10.067661995777765, 0.0)),
((1.0, f64::NAN), (f64::NAN, f64::NAN)),
((1.0, f64::INFINITY), (f64::INFINITY, f64::INFINITY)),
((1.0, f64::NEG_INFINITY), (f64::INFINITY, f64::INFINITY)),
((1.0, 0.0), (0.5403023058681398, -0.0)),
((1.0, -0.0), (0.5403023058681398, 0.0)),
((1.0, 1.0), (0.8337300251311491, -0.9888977057628651)),
((1.0, -1.0), (0.8337300251311491, 0.9888977057628651)),
((1.0, 0.5), (0.6092589091577942, -0.4384865798925953)),
((1.0, -2.0), (2.0327230070196656, 3.0518977991518)),
((1.0, 3.0), (5.439580991019764, -8.429751080849945)),
((-1.0, f64::NAN), (f64::NAN, f64::NAN)),
((-1.0, f64::INFINITY), (f64::INFINITY, f64::NEG_INFINITY)),
(
(-1.0, f64::NEG_INFINITY),
(f64::INFINITY, f64::NEG_INFINITY),
),
((-1.0, 0.0), (0.5403023058681398, 0.0)),
((-1.0, -0.0), (0.5403023058681398, -0.0)),
((-1.0, 1.0), (0.8337300251311491, 0.9888977057628651)),
((-1.0, -1.0), (0.8337300251311491, -0.9888977057628651)),
((-1.0, 0.5), (0.6092589091577942, 0.4384865798925953)),
((-1.0, -2.0), (2.0327230070196656, -3.0518977991518)),
((-1.0, 3.0), (5.439580991019764, 8.429751080849945)),
((0.5, f64::NAN), (f64::NAN, f64::NAN)),
((0.5, f64::INFINITY), (f64::INFINITY, f64::INFINITY)),
((0.5, f64::NEG_INFINITY), (f64::INFINITY, f64::INFINITY)),
((0.5, 0.0), (0.8775825618903728, -0.0)),
((0.5, -0.0), (0.8775825618903728, 0.0)),
((0.5, 1.0), (1.3541806567045842, -0.5634214652309818)),
((0.5, -1.0), (1.3541806567045842, 0.5634214652309818)),
((0.5, 0.5), (0.9895848833999199, -0.24982639750046154)),
((0.5, -2.0), (3.3016373329140944, 1.7388095044743164)),
((0.5, 3.0), (8.835204606500994, -4.802825082743033)),
((-2.0, f64::NAN), (f64::NAN, f64::NAN)),
(
(-2.0, f64::INFINITY),
(f64::NEG_INFINITY, f64::NEG_INFINITY),
),
(
(-2.0, f64::NEG_INFINITY),
(f64::NEG_INFINITY, f64::NEG_INFINITY),
),
((-2.0, 0.0), (-0.4161468365471424, 0.0)),
((-2.0, -0.0), (-0.4161468365471424, -0.0)),
((-2.0, 1.0), (-0.64214812471552, 1.0686074213827783)),
((-2.0, -1.0), (-0.64214812471552, -1.0686074213827783)),
((-2.0, 0.5), (-0.4692579782290534, 0.473830620416407)),
((-2.0, -2.0), (-1.5656258353157435, -3.297894836311237)),
((-2.0, 3.0), (-4.189625690968807, 9.109227893755337)),
((3.0, f64::NAN), (f64::NAN, f64::NAN)),
((3.0, f64::INFINITY), (f64::NEG_INFINITY, f64::INFINITY)),
((3.0, f64::NEG_INFINITY), (f64::NEG_INFINITY, f64::INFINITY)),
((3.0, 0.0), (-0.9899924966004454, -0.0)),
((3.0, -0.0), (-0.9899924966004454, 0.0)),
((3.0, 1.0), (-1.5276382501165433, -0.1658444019189788)),
((3.0, -1.0), (-1.5276382501165433, 0.1658444019189788)),
((3.0, 0.5), (-1.1163412445261518, -0.0735369737112366)),
((3.0, -2.0), (-3.7245455049153224, 0.5118225699873846)),
((3.0, 3.0), (-9.966909834129453, -1.413722590498827)),
((1.0, 2.0), (2.0327230070196656, -3.0518977991518)),
((-3.0, 0.5), (-1.1163412445261518, 0.0735369737112366)),
((1e-05, 1e-05), (1.0, -1.0000000000000002e-10)),
((25.0, 0.0), (0.9912028118634736, 0.0)),
((0.0, 30.0), (5343237290762.231, -0.0)),
((22.5, -3.0), (-8.792135935805867, -4.880453333651282)),
((10.0, 100000.0), (f64::NEG_INFINITY, f64::INFINITY)),
((700.0, 1.0), (-1.2948056358562732, -0.6392748083636823)),
((710.0, 1.0), (1.5430806320109045, -7.085136006719203e-05)),
((750.0, 2.0), (-2.5093205022194303, -2.702275584371921)),
((-750.0, 2.0), (-2.5093205022194303, 2.702275584371921)),
((1e+300, 1e+300), (f64::NEG_INFINITY, f64::INFINITY)),
((-1e+300, -1e+300), (f64::NEG_INFINITY, f64::INFINITY)),
((1e-300, 1e-300), (1.0, -0.0)),
((5e-324, 0.0), (1.0, -0.0)),
((-4.0, 0.0), (-0.6536436208636119, -0.0)),
((-4.0, 0.0), (-0.6536436208636119, -0.0)),
((-4.0, 0.0), (-0.6536436208636119, -0.0)),
((-4.0, -0.0), (-0.6536436208636119, 0.0)),
((0.5, 1e-10), (0.8775825618903728, -4.79425538604203e-11)),
((1.0, 1e-10), (0.5403023058681398, -8.414709848078965e-11)),
((1.0, -1e-10), (0.5403023058681398, 8.414709848078965e-11)),
(
(0.999999, 0.001),
(0.5403034174904505, -0.0008414705847502508),
),
((3.0, 4.0), (-27.034945603074224, -3.851153334811777)),
((-1.0, 1e-300), (0.5403023058681398, 8.414709848078965e-301)),
((2.0, -2.0), (-1.5656258353157435, 3.297894836311237)),
((8.5, 0.1), (-0.6050244714174525, -0.0799818590042242)),
(
(-9.0, 40.0),
(-1.072333199085043e+17, 4.850330980854968e+16),
),
(
(12.0, 200.0),
(3.048833284965028e+86, 1.9386309150789158e+86),
),
((-0.3, -0.4), (1.0327878842028413, -0.12138561220787393)),
(
(100000000.0, 100000000.0),
(f64::NEG_INFINITY, f64::NEG_INFINITY),
),
((1.7e+308, 1.7e+308), (f64::INFINITY, f64::INFINITY)),
((-1.7e+308, 1.0), (1.2399209275250818, -0.6995456614549777)),
((100.0, 0.5), (0.9723731506790773, 0.263864758445627)),
((-100.0, -0.5), (0.9723731506790773, 0.263864758445627)),
((0.1, 0.1), (0.9999833333373015, -0.009999988888889772)),
((709.5, 0.5), (0.9896174744411266, 0.24979882677047585)),
(
(709.9, 1.5707963267948966),
(2.4966581354660473, 0.2296084825246928),
),
((0.0, 2.0), (3.7621956910836314, -0.0)),
((0.0, -2.0), (3.7621956910836314, 0.0)),
((-0.0, -2.0), (3.7621956910836314, -0.0)),
];
for &((re, im), want) in CASES {
let z = Complex::new(re, im);
check_c(
"cos",
&format!("{z:?}"),
z.cos(),
want,
1e-12,
!finite_input(z),
);
}
}
#[test]
fn complex_tan_f64() {
let _report = Report;
const CASES: &[((f64, f64), (f64, f64))] = &[
((f64::NAN, f64::NAN), (f64::NAN, f64::NAN)),
((f64::NAN, f64::INFINITY), (0.0, 1.0)),
((f64::NAN, f64::NEG_INFINITY), (0.0, -1.0)),
((f64::NAN, 0.0), (f64::NAN, f64::NAN)),
((f64::NAN, -0.0), (f64::NAN, f64::NAN)),
((f64::NAN, 1.0), (f64::NAN, f64::NAN)),
((f64::NAN, -1.0), (f64::NAN, f64::NAN)),
((f64::NAN, 0.5), (f64::NAN, f64::NAN)),
((f64::NAN, -2.0), (f64::NAN, f64::NAN)),
((f64::NAN, 3.0), (f64::NAN, f64::NAN)),
((f64::INFINITY, f64::NAN), (f64::NAN, f64::NAN)),
((f64::INFINITY, f64::INFINITY), (0.0, 1.0)),
((f64::INFINITY, f64::NEG_INFINITY), (0.0, -1.0)),
((f64::INFINITY, 0.0), (f64::NAN, f64::NAN)),
((f64::INFINITY, -0.0), (f64::NAN, f64::NAN)),
((f64::INFINITY, 1.0), (f64::NAN, f64::NAN)),
((f64::INFINITY, -1.0), (f64::NAN, f64::NAN)),
((f64::INFINITY, 0.5), (f64::NAN, f64::NAN)),
((f64::INFINITY, -2.0), (f64::NAN, f64::NAN)),
((f64::INFINITY, 3.0), (f64::NAN, f64::NAN)),
((f64::NEG_INFINITY, f64::NAN), (f64::NAN, f64::NAN)),
((f64::NEG_INFINITY, f64::INFINITY), (-0.0, 1.0)),
((f64::NEG_INFINITY, f64::NEG_INFINITY), (-0.0, -1.0)),
((f64::NEG_INFINITY, 0.0), (f64::NAN, f64::NAN)),
((f64::NEG_INFINITY, -0.0), (f64::NAN, f64::NAN)),
((f64::NEG_INFINITY, 1.0), (f64::NAN, f64::NAN)),
((f64::NEG_INFINITY, -1.0), (f64::NAN, f64::NAN)),
((f64::NEG_INFINITY, 0.5), (f64::NAN, f64::NAN)),
((f64::NEG_INFINITY, -2.0), (f64::NAN, f64::NAN)),
((f64::NEG_INFINITY, 3.0), (f64::NAN, f64::NAN)),
((0.0, f64::NAN), (0.0, f64::NAN)),
((0.0, f64::INFINITY), (0.0, 1.0)),
((0.0, f64::NEG_INFINITY), (0.0, -1.0)),
((0.0, 0.0), (0.0, 0.0)),
((0.0, -0.0), (0.0, -0.0)),
((0.0, 1.0), (0.0, 0.7615941559557649)),
((0.0, -1.0), (0.0, -0.7615941559557649)),
((0.0, 0.5), (0.0, 0.46211715726000974)),
((0.0, -2.0), (0.0, -0.9640275800758169)),
((0.0, 3.0), (0.0, 0.9950547536867306)),
((-0.0, f64::NAN), (-0.0, f64::NAN)),
((-0.0, f64::INFINITY), (-0.0, 1.0)),
((-0.0, f64::NEG_INFINITY), (-0.0, -1.0)),
((-0.0, 0.0), (-0.0, 0.0)),
((-0.0, -0.0), (-0.0, -0.0)),
((-0.0, 1.0), (-0.0, 0.7615941559557649)),
((-0.0, -1.0), (-0.0, -0.7615941559557649)),
((-0.0, 0.5), (-0.0, 0.46211715726000974)),
((-0.0, -2.0), (-0.0, -0.9640275800758169)),
((-0.0, 3.0), (-0.0, 0.9950547536867306)),
((1.0, f64::NAN), (f64::NAN, f64::NAN)),
((1.0, f64::INFINITY), (0.0, 1.0)),
((1.0, f64::NEG_INFINITY), (0.0, -1.0)),
((1.0, 0.0), (1.5574077246549023, 0.0)),
((1.0, -0.0), (1.5574077246549023, -0.0)),
((1.0, 1.0), (0.27175258531951174, 1.0839233273386946)),
((1.0, -1.0), (0.27175258531951174, -1.0839233273386946)),
((1.0, 0.5), (0.806877412163085, 1.042830728344361)),
((1.0, -2.0), (0.03381282607989669, -1.0147936161466338)),
((1.0, 3.0), (0.0045171372766584245, 1.002054988245812)),
((-1.0, f64::NAN), (f64::NAN, f64::NAN)),
((-1.0, f64::INFINITY), (-0.0, 1.0)),
((-1.0, f64::NEG_INFINITY), (-0.0, -1.0)),
((-1.0, 0.0), (-1.5574077246549023, 0.0)),
((-1.0, -0.0), (-1.5574077246549023, -0.0)),
((-1.0, 1.0), (-0.27175258531951174, 1.0839233273386946)),
((-1.0, -1.0), (-0.27175258531951174, -1.0839233273386946)),
((-1.0, 0.5), (-0.806877412163085, 1.042830728344361)),
((-1.0, -2.0), (-0.03381282607989669, -1.0147936161466338)),
((-1.0, 3.0), (-0.0045171372766584245, 1.002054988245812)),
((0.5, f64::NAN), (f64::NAN, f64::NAN)),
((0.5, f64::INFINITY), (0.0, 1.0)),
((0.5, f64::NEG_INFINITY), (0.0, -1.0)),
((0.5, 0.0), (0.5463024898437905, 0.0)),
((0.5, -0.0), (0.5463024898437905, -0.0)),
((0.5, 1.0), (0.19557731006593398, 0.8429662048457832)),
((0.5, -1.0), (0.19557731006593398, -0.8429662048457832)),
((0.5, 0.5), (0.4038964553160257, 0.5640831412674985)),
((0.5, -2.0), (0.030215987322877575, -0.9799408499617381)),
((0.5, 3.0), (0.0041604265928938304, 0.9973163652832021)),
((-2.0, f64::NAN), (f64::NAN, f64::NAN)),
((-2.0, f64::INFINITY), (-0.0, 1.0)),
((-2.0, f64::NEG_INFINITY), (-0.0, -1.0)),
((-2.0, 0.0), (2.185039863261519, 0.0)),
((-2.0, -0.0), (2.185039863261519, -0.0)),
((-2.0, 1.0), (0.24345820118572525, 1.16673625724092)),
((-2.0, -1.0), (0.24345820118572525, -1.16673625724092)),
((-2.0, 0.5), (0.8508781211449377, 1.3212865837711916)),
((-2.0, -2.0), (0.02839295286823229, -1.0238355945704727)),
((-2.0, 3.0), (0.003764025641504248, 1.0032386273536098)),
((3.0, f64::NAN), (f64::NAN, f64::NAN)),
((3.0, f64::INFINITY), (0.0, 1.0)),
((3.0, f64::NEG_INFINITY), (0.0, -1.0)),
((3.0, 0.0), (-0.1425465430742778, 0.0)),
((3.0, -0.0), (-0.1425465430742778, -0.0)),
((3.0, 1.0), (-0.05916853956605074, 0.7680176472869112)),
((3.0, -1.0), (-0.05916853956605074, -0.7680176472869112)),
((3.0, 0.5), (-0.11162105077158345, 0.46946999342588536)),
((3.0, -2.0), (-0.009884375038322495, -0.9653858790221332)),
((3.0, 3.0), (-0.0013786327196592897, 0.995250301178603)),
((1.0, 2.0), (0.03381282607989669, 1.0147936161466338)),
((-3.0, 0.5), (0.11162105077158345, 0.46946999342588536)),
(
(1e-05, 1e-05),
(9.999999999333333e-06, 1.0000000000666668e-05),
),
((25.0, 0.0), (-0.13352640702153587, 0.0)),
((0.0, 30.0), (0.0, 1.0)),
((22.5, -3.0), (0.004207374868477178, -0.9973902381301812)),
((10.0, 100000.0), (0.0, 1.0)),
((700.0, 1.0), (-0.2188995546010449, 0.8696698137558918)),
((710.0, 1.0), (2.531970989219487e-05, 0.7615941571183326)),
((750.0, 2.0), (-0.036543246565140276, 1.00338083243211)),
((-750.0, 2.0), (0.036543246565140276, 1.00338083243211)),
((1e+300, 1e+300), (0.0, 1.0)),
((-1e+300, -1e+300), (-0.0, -1.0)),
((1e-300, 1e-300), (1e-300, 1e-300)),
((5e-324, 0.0), (5e-324, 0.0)),
((-4.0, 0.0), (-1.1578212823495777, 0.0)),
((-4.0, 0.0), (-1.1578212823495777, 0.0)),
((-4.0, 0.0), (-1.1578212823495777, 0.0)),
((-4.0, -0.0), (-1.1578212823495777, -0.0)),
((0.5, 1e-10), (0.5463024898437905, 1.298446410409525e-10)),
((1.0, 1e-10), (1.5574077246549023, 3.42551882081476e-10)),
((1.0, -1e-10), (1.5574077246549023, -3.42551882081476e-10)),
(
(0.999999, 0.001),
(1.5573989642567916, 0.003425498700579093),
),
((3.0, 4.0), (-0.00018734620462947845, 0.9993559873814731)),
((-1.0, 1e-300), (-1.5574077246549023, 3.42551882081476e-300)),
((2.0, -2.0), (-0.02839295286823229, -1.0238355945704727)),
((8.5, 0.1), (-1.29063375090834, 0.2702847077793887)),
((-9.0, 40.0), (2.7108407491801337e-35, 1.0)),
((12.0, 200.0), (-3.468672292714312e-174, 1.0)),
((-0.3, -0.4), (-0.2610736818416631, -0.4106334708425563)),
((100000000.0, 100000000.0), (-0.0, 1.0)),
((1.7e+308, 1.7e+308), (-0.0, 1.0)),
((-1.7e+308, 1.0), (0.23599628452557392, 0.8947398858926605)),
((100.0, 0.5), (-0.4301388604595084, 0.578840337485586)),
((-100.0, -0.5), (0.4301388604595084, -0.578840337485586)),
((0.1, 0.1), (0.09932804352165596, 0.10066129051145502)),
((709.5, 0.5), (-0.4038455151282377, 0.5640556723741683)),
(
(709.9, 1.5707963267948966),
(-0.01579306901858801, 0.9186047662424716),
),
((0.0, 2.0), (0.0, 0.9640275800758169)),
((0.0, -2.0), (0.0, -0.9640275800758169)),
((-0.0, -2.0), (-0.0, -0.9640275800758169)),
];
for &((re, im), want) in CASES {
let z = Complex::new(re, im);
check_c(
"tan",
&format!("{z:?}"),
z.tan(),
want,
1e-12,
!finite_input(z),
);
}
}
#[test]
fn complex_sinh_f64() {
let _report = Report;
const CASES: &[((f64, f64), (f64, f64))] = &[
((f64::NAN, f64::NAN), (f64::NAN, f64::NAN)),
((f64::NAN, f64::INFINITY), (f64::NAN, f64::NAN)),
((f64::NAN, f64::NEG_INFINITY), (f64::NAN, f64::NAN)),
((f64::NAN, 0.0), (f64::NAN, 0.0)),
((f64::NAN, -0.0), (f64::NAN, -0.0)),
((f64::NAN, 1.0), (f64::NAN, f64::NAN)),
((f64::NAN, -1.0), (f64::NAN, f64::NAN)),
((f64::NAN, 0.5), (f64::NAN, f64::NAN)),
((f64::NAN, -2.0), (f64::NAN, f64::NAN)),
((f64::NAN, 3.0), (f64::NAN, f64::NAN)),
((f64::INFINITY, f64::NAN), (f64::INFINITY, f64::NAN)),
((f64::INFINITY, f64::INFINITY), (f64::INFINITY, f64::NAN)),
(
(f64::INFINITY, f64::NEG_INFINITY),
(f64::INFINITY, f64::NAN),
),
((f64::INFINITY, 0.0), (f64::INFINITY, 0.0)),
((f64::INFINITY, -0.0), (f64::INFINITY, -0.0)),
((f64::INFINITY, 1.0), (f64::INFINITY, f64::INFINITY)),
((f64::INFINITY, -1.0), (f64::INFINITY, f64::NEG_INFINITY)),
((f64::INFINITY, 0.5), (f64::INFINITY, f64::INFINITY)),
(
(f64::INFINITY, -2.0),
(f64::NEG_INFINITY, f64::NEG_INFINITY),
),
((f64::INFINITY, 3.0), (f64::NEG_INFINITY, f64::INFINITY)),
((f64::NEG_INFINITY, f64::NAN), (f64::NEG_INFINITY, f64::NAN)),
(
(f64::NEG_INFINITY, f64::INFINITY),
(f64::NEG_INFINITY, f64::NAN),
),
(
(f64::NEG_INFINITY, f64::NEG_INFINITY),
(f64::NEG_INFINITY, f64::NAN),
),
((f64::NEG_INFINITY, 0.0), (f64::NEG_INFINITY, 0.0)),
((f64::NEG_INFINITY, -0.0), (f64::NEG_INFINITY, -0.0)),
((f64::NEG_INFINITY, 1.0), (f64::NEG_INFINITY, f64::INFINITY)),
(
(f64::NEG_INFINITY, -1.0),
(f64::NEG_INFINITY, f64::NEG_INFINITY),
),
((f64::NEG_INFINITY, 0.5), (f64::NEG_INFINITY, f64::INFINITY)),
(
(f64::NEG_INFINITY, -2.0),
(f64::INFINITY, f64::NEG_INFINITY),
),
((f64::NEG_INFINITY, 3.0), (f64::INFINITY, f64::INFINITY)),
((0.0, f64::NAN), (0.0, f64::NAN)),
((0.0, f64::INFINITY), (0.0, f64::NAN)),
((0.0, f64::NEG_INFINITY), (0.0, f64::NAN)),
((0.0, 0.0), (0.0, 0.0)),
((0.0, -0.0), (0.0, -0.0)),
((0.0, 1.0), (0.0, 0.8414709848078965)),
((0.0, -1.0), (0.0, -0.8414709848078965)),
((0.0, 0.5), (0.0, 0.479425538604203)),
((0.0, -2.0), (-0.0, -0.9092974268256817)),
((0.0, 3.0), (-0.0, 0.1411200080598672)),
((-0.0, f64::NAN), (-0.0, f64::NAN)),
((-0.0, f64::INFINITY), (-0.0, f64::NAN)),
((-0.0, f64::NEG_INFINITY), (-0.0, f64::NAN)),
((-0.0, 0.0), (-0.0, 0.0)),
((-0.0, -0.0), (-0.0, -0.0)),
((-0.0, 1.0), (-0.0, 0.8414709848078965)),
((-0.0, -1.0), (-0.0, -0.8414709848078965)),
((-0.0, 0.5), (-0.0, 0.479425538604203)),
((-0.0, -2.0), (0.0, -0.9092974268256817)),
((-0.0, 3.0), (0.0, 0.1411200080598672)),
((1.0, f64::NAN), (f64::NAN, f64::NAN)),
((1.0, f64::INFINITY), (f64::NAN, f64::NAN)),
((1.0, f64::NEG_INFINITY), (f64::NAN, f64::NAN)),
((1.0, 0.0), (1.1752011936438014, 0.0)),
((1.0, -0.0), (1.1752011936438014, -0.0)),
((1.0, 1.0), (0.6349639147847361, 1.2984575814159773)),
((1.0, -1.0), (0.6349639147847361, -1.2984575814159773)),
((1.0, 0.5), (1.0313360742545512, 0.7397922644560138)),
((1.0, -2.0), (-0.4890562590412937, -1.4031192506220405)),
((1.0, 3.0), (-1.1634403637032504, 0.21775955162215221)),
((-1.0, f64::NAN), (f64::NAN, f64::NAN)),
((-1.0, f64::INFINITY), (f64::NAN, f64::NAN)),
((-1.0, f64::NEG_INFINITY), (f64::NAN, f64::NAN)),
((-1.0, 0.0), (-1.1752011936438014, 0.0)),
((-1.0, -0.0), (-1.1752011936438014, -0.0)),
((-1.0, 1.0), (-0.6349639147847361, 1.2984575814159773)),
((-1.0, -1.0), (-0.6349639147847361, -1.2984575814159773)),
((-1.0, 0.5), (-1.0313360742545512, 0.7397922644560138)),
((-1.0, -2.0), (0.4890562590412937, -1.4031192506220405)),
((-1.0, 3.0), (1.1634403637032504, 0.21775955162215221)),
((0.5, f64::NAN), (f64::NAN, f64::NAN)),
((0.5, f64::INFINITY), (f64::NAN, f64::NAN)),
((0.5, f64::NEG_INFINITY), (f64::NAN, f64::NAN)),
((0.5, 0.0), (0.5210953054937474, 0.0)),
((0.5, -0.0), (0.5210953054937474, -0.0)),
((0.5, 1.0), (0.28154899513533443, 0.948864531437168)),
((0.5, -1.0), (0.28154899513533443, -0.948864531437168)),
((0.5, 0.5), (0.4573041531842493, 0.5406126857131534)),
((0.5, -2.0), (-0.21685216292078974, -1.0253473885839877)),
((0.5, 3.0), (-0.5158804424525267, 0.15913058529843999)),
((-2.0, f64::NAN), (f64::NAN, f64::NAN)),
((-2.0, f64::INFINITY), (f64::NAN, f64::NAN)),
((-2.0, f64::NEG_INFINITY), (f64::NAN, f64::NAN)),
((-2.0, 0.0), (-3.626860407847019, 0.0)),
((-2.0, -0.0), (-3.626860407847019, -0.0)),
((-2.0, 1.0), (-1.9596010414216063, 3.165778513216168)),
((-2.0, -1.0), (-1.9596010414216063, -3.165778513216168)),
((-2.0, 0.5), (-3.1828694483371494, 1.8036926955321817)),
((-2.0, -2.0), (1.5093064853236158, -3.4209548611170133)),
((-2.0, 3.0), (3.59056458998578, 0.5309210862485197)),
((3.0, f64::NAN), (f64::NAN, f64::NAN)),
((3.0, f64::INFINITY), (f64::NAN, f64::NAN)),
((3.0, f64::NEG_INFINITY), (f64::NAN, f64::NAN)),
((3.0, 0.0), (10.017874927409903, 0.0)),
((3.0, -0.0), (10.017874927409903, -0.0)),
((3.0, 1.0), (5.412680923178193, 8.471645454300148)),
((3.0, -1.0), (5.412680923178193, -8.471645454300148)),
((3.0, 0.5), (8.791512343493714, 4.82669427481082)),
((3.0, -2.0), (-4.168906959966565, -9.15449914691143)),
((3.0, 3.0), (-9.917621010017536, 1.4207485419881771)),
((1.0, 2.0), (-0.4890562590412937, 1.4031192506220405)),
((-3.0, 0.5), (-8.791512343493714, 4.82669427481082)),
(
(1e-05, 1e-05),
(9.999999999666668e-06, 1.0000000000333334e-05),
),
((25.0, 0.0), (36002449668.69294, 0.0)),
((0.0, 30.0), (0.0, -0.9880316240928618)),
((22.5, -3.0), (-2925686246.692221, -417046460.5859349)),
((10.0, 100000.0), (-11006.19329816865, 393.70983867953515)),
(
(700.0, 1.0),
(2.7399595892935213e+303, 4.2672342296080034e+303),
),
((750.0, 2.0), (f64::NEG_INFINITY, f64::INFINITY)),
((-750.0, 2.0), (f64::INFINITY, f64::INFINITY)),
((1e+300, 1e+300), (f64::NEG_INFINITY, f64::NEG_INFINITY)),
((-1e+300, -1e+300), (f64::INFINITY, f64::INFINITY)),
((1e-300, 1e-300), (1e-300, 1e-300)),
((5e-324, 0.0), (5e-324, 0.0)),
((-4.0, 0.0), (-27.28991719712775, 0.0)),
((-4.0, 0.0), (-27.28991719712775, 0.0)),
((-4.0, 0.0), (-27.28991719712775, 0.0)),
((-4.0, -0.0), (-27.28991719712775, -0.0)),
((0.5, 1e-10), (0.5210953054937474, 1.1276259652063807e-10)),
((1.0, 1e-10), (1.1752011936438014, 1.5430806348152438e-10)),
((1.0, -1e-10), (1.1752011936438014, -1.5430806348152438e-10)),
(
(0.999999, 0.001),
(1.175199062963978, 0.0015430792024349247),
),
((3.0, 4.0), (-6.5481200409110025, -7.61923172032141)),
(
(-1.0, 1e-300),
(-1.1752011936438014, 1.5430806348152437e-300),
),
((2.0, -2.0), (-1.5093064853236158, -3.4209548611170133)),
((8.5, 0.1), (2445.107632512208, 245.3290928346872)),
((-9.0, 40.0), (2702.127502878014, 3018.8572834296897)),
((12.0, 200.0), (39646.06421234066, -71066.65973010466)),
((-0.3, -0.4), (-0.2804817641764754, -0.4070739913234487)),
(
(100000000.0, 100000000.0),
(f64::NEG_INFINITY, f64::INFINITY),
),
((1.7e+308, 1.7e+308), (f64::INFINITY, f64::NEG_INFINITY)),
((-1.7e+308, 1.0), (f64::NEG_INFINITY, f64::INFINITY)),
(
(100.0, 0.5),
(1.1795223639882153e+43, 6.443760042731957e+42),
),
(
(-100.0, -0.5),
(-1.1795223639882153e+43, -6.443760042731957e+42),
),
((0.1, 0.1), (0.0996663334921076, 0.10033299984131393)),
(
(709.5, 0.5),
(5.945561827152711e+307, 3.2480752296937223e+307),
),
((0.0, 2.0), (-0.0, 0.9092974268256817)),
((0.0, -2.0), (-0.0, -0.9092974268256817)),
((-0.0, -2.0), (0.0, -0.9092974268256817)),
];
for &((re, im), want) in CASES {
let z = Complex::new(re, im);
check_c(
"sinh",
&format!("{z:?}"),
z.sinh(),
want,
1e-12,
!finite_input(z),
);
}
}
#[test]
fn complex_cosh_f64() {
let _report = Report;
const CASES: &[((f64, f64), (f64, f64))] = &[
((f64::NAN, f64::NAN), (f64::NAN, f64::NAN)),
((f64::NAN, f64::INFINITY), (f64::NAN, f64::NAN)),
((f64::NAN, f64::NEG_INFINITY), (f64::NAN, f64::NAN)),
((f64::NAN, 0.0), (f64::NAN, 0.0)),
((f64::NAN, -0.0), (f64::NAN, -0.0)),
((f64::NAN, 1.0), (f64::NAN, f64::NAN)),
((f64::NAN, -1.0), (f64::NAN, f64::NAN)),
((f64::NAN, 0.5), (f64::NAN, f64::NAN)),
((f64::NAN, -2.0), (f64::NAN, f64::NAN)),
((f64::NAN, 3.0), (f64::NAN, f64::NAN)),
((f64::INFINITY, f64::NAN), (f64::INFINITY, f64::NAN)),
((f64::INFINITY, f64::INFINITY), (f64::INFINITY, f64::NAN)),
(
(f64::INFINITY, f64::NEG_INFINITY),
(f64::INFINITY, f64::NAN),
),
((f64::INFINITY, 0.0), (f64::INFINITY, 0.0)),
((f64::INFINITY, -0.0), (f64::INFINITY, -0.0)),
((f64::INFINITY, 1.0), (f64::INFINITY, f64::INFINITY)),
((f64::INFINITY, -1.0), (f64::INFINITY, f64::NEG_INFINITY)),
((f64::INFINITY, 0.5), (f64::INFINITY, f64::INFINITY)),
(
(f64::INFINITY, -2.0),
(f64::NEG_INFINITY, f64::NEG_INFINITY),
),
((f64::INFINITY, 3.0), (f64::NEG_INFINITY, f64::INFINITY)),
((f64::NEG_INFINITY, f64::NAN), (f64::INFINITY, f64::NAN)),
(
(f64::NEG_INFINITY, f64::INFINITY),
(f64::INFINITY, f64::NAN),
),
(
(f64::NEG_INFINITY, f64::NEG_INFINITY),
(f64::INFINITY, f64::NAN),
),
((f64::NEG_INFINITY, 0.0), (f64::INFINITY, -0.0)),
((f64::NEG_INFINITY, -0.0), (f64::INFINITY, 0.0)),
((f64::NEG_INFINITY, 1.0), (f64::INFINITY, f64::INFINITY)),
(
(f64::NEG_INFINITY, -1.0),
(f64::INFINITY, f64::NEG_INFINITY),
),
((f64::NEG_INFINITY, 0.5), (f64::INFINITY, f64::INFINITY)),
(
(f64::NEG_INFINITY, -2.0),
(f64::NEG_INFINITY, f64::NEG_INFINITY),
),
((f64::NEG_INFINITY, 3.0), (f64::NEG_INFINITY, f64::INFINITY)),
((0.0, f64::NAN), (f64::NAN, 0.0)),
((0.0, f64::INFINITY), (f64::NAN, 0.0)),
((0.0, f64::NEG_INFINITY), (f64::NAN, -0.0)),
((0.0, 0.0), (1.0, 0.0)),
((0.0, -0.0), (1.0, -0.0)),
((0.0, 1.0), (0.5403023058681398, 0.0)),
((0.0, -1.0), (0.5403023058681398, -0.0)),
((0.0, 0.5), (0.8775825618903728, 0.0)),
((0.0, -2.0), (-0.4161468365471424, -0.0)),
((0.0, 3.0), (-0.9899924966004454, 0.0)),
((-0.0, f64::NAN), (f64::NAN, -0.0)),
((-0.0, f64::INFINITY), (f64::NAN, 0.0)),
((-0.0, f64::NEG_INFINITY), (f64::NAN, -0.0)),
((-0.0, 0.0), (1.0, -0.0)),
((-0.0, -0.0), (1.0, 0.0)),
((-0.0, 1.0), (0.5403023058681398, -0.0)),
((-0.0, -1.0), (0.5403023058681398, 0.0)),
((-0.0, 0.5), (0.8775825618903728, -0.0)),
((-0.0, -2.0), (-0.4161468365471424, 0.0)),
((-0.0, 3.0), (-0.9899924966004454, -0.0)),
((1.0, f64::NAN), (f64::NAN, f64::NAN)),
((1.0, f64::INFINITY), (f64::NAN, f64::NAN)),
((1.0, f64::NEG_INFINITY), (f64::NAN, f64::NAN)),
((1.0, 0.0), (1.5430806348152437, 0.0)),
((1.0, -0.0), (1.5430806348152437, -0.0)),
((1.0, 1.0), (0.8337300251311491, 0.9888977057628651)),
((1.0, -1.0), (0.8337300251311491, -0.9888977057628651)),
((1.0, 0.5), (1.3541806567045842, 0.5634214652309818)),
((1.0, -2.0), (-0.64214812471552, -1.0686074213827783)),
((1.0, 3.0), (-1.5276382501165433, 0.1658444019189788)),
((-1.0, f64::NAN), (f64::NAN, f64::NAN)),
((-1.0, f64::INFINITY), (f64::NAN, f64::NAN)),
((-1.0, f64::NEG_INFINITY), (f64::NAN, f64::NAN)),
((-1.0, 0.0), (1.5430806348152437, -0.0)),
((-1.0, -0.0), (1.5430806348152437, 0.0)),
((-1.0, 1.0), (0.8337300251311491, -0.9888977057628651)),
((-1.0, -1.0), (0.8337300251311491, 0.9888977057628651)),
((-1.0, 0.5), (1.3541806567045842, -0.5634214652309818)),
((-1.0, -2.0), (-0.64214812471552, 1.0686074213827783)),
((-1.0, 3.0), (-1.5276382501165433, -0.1658444019189788)),
((0.5, f64::NAN), (f64::NAN, f64::NAN)),
((0.5, f64::INFINITY), (f64::NAN, f64::NAN)),
((0.5, f64::NEG_INFINITY), (f64::NAN, f64::NAN)),
((0.5, 0.0), (1.1276259652063807, 0.0)),
((0.5, -0.0), (1.1276259652063807, -0.0)),
((0.5, 1.0), (0.6092589091577942, 0.4384865798925953)),
((0.5, -1.0), (0.6092589091577942, -0.4384865798925953)),
((0.5, 0.5), (0.9895848833999199, 0.24982639750046154)),
((0.5, -2.0), (-0.4692579782290534, -0.473830620416407)),
((0.5, 3.0), (-1.1163412445261518, 0.0735369737112366)),
((-2.0, f64::NAN), (f64::NAN, f64::NAN)),
((-2.0, f64::INFINITY), (f64::NAN, f64::NAN)),
((-2.0, f64::NEG_INFINITY), (f64::NAN, f64::NAN)),
((-2.0, 0.0), (3.7621956910836314, -0.0)),
((-2.0, -0.0), (3.7621956910836314, 0.0)),
((-2.0, 1.0), (2.0327230070196656, -3.0518977991518)),
((-2.0, -1.0), (2.0327230070196656, 3.0518977991518)),
((-2.0, 0.5), (3.3016373329140944, -1.7388095044743164)),
((-2.0, -2.0), (-1.5656258353157435, 3.297894836311237)),
((-2.0, 3.0), (-3.7245455049153224, -0.5118225699873846)),
((3.0, f64::NAN), (f64::NAN, f64::NAN)),
((3.0, f64::INFINITY), (f64::NAN, f64::NAN)),
((3.0, f64::NEG_INFINITY), (f64::NAN, f64::NAN)),
((3.0, 0.0), (10.067661995777765, 0.0)),
((3.0, -0.0), (10.067661995777765, -0.0)),
((3.0, 1.0), (5.439580991019764, 8.429751080849945)),
((3.0, -1.0), (5.439580991019764, -8.429751080849945)),
((3.0, 0.5), (8.835204606500994, 4.802825082743033)),
((3.0, -2.0), (-4.189625690968807, -9.109227893755337)),
((3.0, 3.0), (-9.966909834129453, 1.413722590498827)),
((1.0, 2.0), (-0.64214812471552, 1.0686074213827783)),
((-3.0, 0.5), (8.835204606500994, -4.802825082743033)),
((1e-05, 1e-05), (1.0, 1.0000000000000002e-10)),
((25.0, 0.0), (36002449668.69294, 0.0)),
((0.0, 30.0), (0.15425144988758405, -0.0)),
((22.5, -3.0), (-2925686246.692221, -417046460.5859349)),
((10.0, 100000.0), (-11006.19334353956, 393.7098370565422)),
(
(700.0, 1.0),
(2.7399595892935213e+303, 4.2672342296080034e+303),
),
((750.0, 2.0), (f64::NEG_INFINITY, f64::INFINITY)),
((-750.0, 2.0), (f64::NEG_INFINITY, f64::NEG_INFINITY)),
((1e+300, 1e+300), (f64::NEG_INFINITY, f64::NEG_INFINITY)),
((-1e+300, -1e+300), (f64::NEG_INFINITY, f64::NEG_INFINITY)),
((1e-300, 1e-300), (1.0, 0.0)),
((5e-324, 0.0), (1.0, 0.0)),
((-4.0, 0.0), (27.308232836016487, -0.0)),
((-4.0, 0.0), (27.308232836016487, -0.0)),
((-4.0, 0.0), (27.308232836016487, -0.0)),
((-4.0, -0.0), (27.308232836016487, 0.0)),
((0.5, 1e-10), (1.1276259652063807, 5.210953054937474e-11)),
((1.0, 1e-10), (1.5430806348152437, 1.1752011936438014e-10)),
((1.0, -1e-10), (1.5430806348152437, -1.1752011936438014e-10)),
(
(0.999999, 0.001),
(1.5430786880751561, 0.0011751994546971556),
),
((3.0, 4.0), (-6.580663040551157, -7.581552742746545)),
(
(-1.0, 1e-300),
(1.5430806348152437, -1.1752011936438015e-300),
),
((2.0, -2.0), (-1.5656258353157435, -3.297894836311237)),
((8.5, 0.1), (2445.107834964083, 245.3290725217447)),
((-9.0, 40.0), (-2702.12758518471, -3018.85719147542)),
((12.0, 200.0), (39646.06421533405, -71066.65972473891)),
((-0.3, -0.4), (0.9628205308930272, 0.11858578787353008)),
(
(100000000.0, 100000000.0),
(f64::NEG_INFINITY, f64::INFINITY),
),
((1.7e+308, 1.7e+308), (f64::INFINITY, f64::NEG_INFINITY)),
((-1.7e+308, 1.0), (f64::INFINITY, f64::NEG_INFINITY)),
(
(100.0, 0.5),
(1.1795223639882153e+43, 6.443760042731957e+42),
),
(
(-100.0, -0.5),
(1.1795223639882153e+43, 6.443760042731957e+42),
),
((0.1, 0.1), (0.9999833333373015, 0.009999988888889772)),
(
(709.5, 0.5),
(5.945561827152711e+307, 3.2480752296937223e+307),
),
((0.0, 2.0), (-0.4161468365471424, 0.0)),
((0.0, -2.0), (-0.4161468365471424, -0.0)),
((-0.0, -2.0), (-0.4161468365471424, 0.0)),
];
for &((re, im), want) in CASES {
let z = Complex::new(re, im);
check_c(
"cosh",
&format!("{z:?}"),
z.cosh(),
want,
1e-12,
!finite_input(z),
);
}
}
#[test]
fn complex_tanh_f64() {
let _report = Report;
const CASES: &[((f64, f64), (f64, f64))] = &[
((f64::NAN, f64::NAN), (f64::NAN, f64::NAN)),
((f64::NAN, f64::INFINITY), (f64::NAN, f64::NAN)),
((f64::NAN, f64::NEG_INFINITY), (f64::NAN, f64::NAN)),
((f64::NAN, 0.0), (f64::NAN, 0.0)),
((f64::NAN, -0.0), (f64::NAN, -0.0)),
((f64::NAN, 1.0), (f64::NAN, f64::NAN)),
((f64::NAN, -1.0), (f64::NAN, f64::NAN)),
((f64::NAN, 0.5), (f64::NAN, f64::NAN)),
((f64::NAN, -2.0), (f64::NAN, f64::NAN)),
((f64::NAN, 3.0), (f64::NAN, f64::NAN)),
((f64::INFINITY, f64::NAN), (1.0, 0.0)),
((f64::INFINITY, f64::INFINITY), (1.0, 0.0)),
((f64::INFINITY, f64::NEG_INFINITY), (1.0, -0.0)),
((f64::INFINITY, 0.0), (1.0, 0.0)),
((f64::INFINITY, -0.0), (1.0, -0.0)),
((f64::INFINITY, 1.0), (1.0, 0.0)),
((f64::INFINITY, -1.0), (1.0, -0.0)),
((f64::INFINITY, 0.5), (1.0, 0.0)),
((f64::INFINITY, -2.0), (1.0, -0.0)),
((f64::INFINITY, 3.0), (1.0, 0.0)),
((f64::NEG_INFINITY, f64::NAN), (-1.0, 0.0)),
((f64::NEG_INFINITY, f64::INFINITY), (-1.0, 0.0)),
((f64::NEG_INFINITY, f64::NEG_INFINITY), (-1.0, -0.0)),
((f64::NEG_INFINITY, 0.0), (-1.0, 0.0)),
((f64::NEG_INFINITY, -0.0), (-1.0, -0.0)),
((f64::NEG_INFINITY, 1.0), (-1.0, 0.0)),
((f64::NEG_INFINITY, -1.0), (-1.0, -0.0)),
((f64::NEG_INFINITY, 0.5), (-1.0, 0.0)),
((f64::NEG_INFINITY, -2.0), (-1.0, -0.0)),
((f64::NEG_INFINITY, 3.0), (-1.0, 0.0)),
((0.0, f64::NAN), (f64::NAN, f64::NAN)),
((0.0, f64::INFINITY), (f64::NAN, f64::NAN)),
((0.0, f64::NEG_INFINITY), (f64::NAN, f64::NAN)),
((0.0, 0.0), (0.0, 0.0)),
((0.0, -0.0), (0.0, -0.0)),
((0.0, 1.0), (0.0, 1.5574077246549023)),
((0.0, -1.0), (0.0, -1.5574077246549023)),
((0.0, 0.5), (0.0, 0.5463024898437905)),
((0.0, -2.0), (0.0, 2.185039863261519)),
((0.0, 3.0), (0.0, -0.1425465430742778)),
((-0.0, f64::NAN), (f64::NAN, f64::NAN)),
((-0.0, f64::INFINITY), (f64::NAN, f64::NAN)),
((-0.0, f64::NEG_INFINITY), (f64::NAN, f64::NAN)),
((-0.0, 0.0), (-0.0, 0.0)),
((-0.0, -0.0), (-0.0, -0.0)),
((-0.0, 1.0), (-0.0, 1.5574077246549023)),
((-0.0, -1.0), (-0.0, -1.5574077246549023)),
((-0.0, 0.5), (-0.0, 0.5463024898437905)),
((-0.0, -2.0), (-0.0, 2.185039863261519)),
((-0.0, 3.0), (-0.0, -0.1425465430742778)),
((1.0, f64::NAN), (f64::NAN, f64::NAN)),
((1.0, f64::INFINITY), (f64::NAN, f64::NAN)),
((1.0, f64::NEG_INFINITY), (f64::NAN, f64::NAN)),
((1.0, 0.0), (0.7615941559557649, 0.0)),
((1.0, -0.0), (0.7615941559557649, -0.0)),
((1.0, 1.0), (1.0839233273386946, 0.27175258531951174)),
((1.0, -1.0), (1.0839233273386946, -0.27175258531951174)),
((1.0, 0.5), (0.8429662048457832, 0.19557731006593398)),
((1.0, -2.0), (1.16673625724092, 0.24345820118572525)),
((1.0, 3.0), (0.7680176472869112, -0.05916853956605074)),
((-1.0, f64::NAN), (f64::NAN, f64::NAN)),
((-1.0, f64::INFINITY), (f64::NAN, f64::NAN)),
((-1.0, f64::NEG_INFINITY), (f64::NAN, f64::NAN)),
((-1.0, 0.0), (-0.7615941559557649, 0.0)),
((-1.0, -0.0), (-0.7615941559557649, -0.0)),
((-1.0, 1.0), (-1.0839233273386946, 0.27175258531951174)),
((-1.0, -1.0), (-1.0839233273386946, -0.27175258531951174)),
((-1.0, 0.5), (-0.8429662048457832, 0.19557731006593398)),
((-1.0, -2.0), (-1.16673625724092, 0.24345820118572525)),
((-1.0, 3.0), (-0.7680176472869112, -0.05916853956605074)),
((0.5, f64::NAN), (f64::NAN, f64::NAN)),
((0.5, f64::INFINITY), (f64::NAN, f64::NAN)),
((0.5, f64::NEG_INFINITY), (f64::NAN, f64::NAN)),
((0.5, 0.0), (0.46211715726000974, 0.0)),
((0.5, -0.0), (0.46211715726000974, -0.0)),
((0.5, 1.0), (1.042830728344361, 0.806877412163085)),
((0.5, -1.0), (1.042830728344361, -0.806877412163085)),
((0.5, 0.5), (0.5640831412674985, 0.4038964553160257)),
((0.5, -2.0), (1.3212865837711916, 0.8508781211449377)),
((0.5, 3.0), (0.46946999342588536, -0.11162105077158345)),
((-2.0, f64::NAN), (f64::NAN, f64::NAN)),
((-2.0, f64::INFINITY), (f64::NAN, f64::NAN)),
((-2.0, f64::NEG_INFINITY), (f64::NAN, f64::NAN)),
((-2.0, 0.0), (-0.9640275800758169, 0.0)),
((-2.0, -0.0), (-0.9640275800758169, -0.0)),
((-2.0, 1.0), (-1.0147936161466338, 0.03381282607989669)),
((-2.0, -1.0), (-1.0147936161466338, -0.03381282607989669)),
((-2.0, 0.5), (-0.9799408499617381, 0.030215987322877575)),
((-2.0, -2.0), (-1.0238355945704727, 0.02839295286823229)),
((-2.0, 3.0), (-0.9653858790221332, -0.009884375038322495)),
((3.0, f64::NAN), (f64::NAN, f64::NAN)),
((3.0, f64::INFINITY), (f64::NAN, f64::NAN)),
((3.0, f64::NEG_INFINITY), (f64::NAN, f64::NAN)),
((3.0, 0.0), (0.9950547536867306, 0.0)),
((3.0, -0.0), (0.9950547536867306, -0.0)),
((3.0, 1.0), (1.002054988245812, 0.0045171372766584245)),
((3.0, -1.0), (1.002054988245812, -0.0045171372766584245)),
((3.0, 0.5), (0.9973163652832021, 0.0041604265928938304)),
((3.0, -2.0), (1.0032386273536098, 0.003764025641504248)),
((3.0, 3.0), (0.995250301178603, -0.0013786327196592897)),
((1.0, 2.0), (1.16673625724092, -0.24345820118572525)),
((-3.0, 0.5), (-0.9973163652832021, 0.0041604265928938304)),
(
(1e-05, 1e-05),
(1.0000000000666668e-05, 9.999999999333333e-06),
),
((25.0, 0.0), (1.0, 0.0)),
((0.0, 30.0), (0.0, -6.405331196646276)),
((22.5, -3.0), (1.0, 1.599664110575782e-20)),
(
(10.0, 100000.0),
(0.9999999958882291, -2.94546664083663e-10),
),
((700.0, 1.0), (1.0, 0.0)),
((710.0, 1.0), (1.0, 0.0)),
((750.0, 2.0), (1.0, -0.0)),
((-750.0, 2.0), (-1.0, -0.0)),
((1e+300, 1e+300), (1.0, 0.0)),
((-1e+300, -1e+300), (-1.0, -0.0)),
((1e-300, 1e-300), (1e-300, 1e-300)),
((5e-324, 0.0), (5e-324, 0.0)),
((-4.0, 0.0), (-0.999329299739067, 0.0)),
((-4.0, 0.0), (-0.999329299739067, 0.0)),
((-4.0, 0.0), (-0.999329299739067, 0.0)),
((-4.0, -0.0), (-0.999329299739067, -0.0)),
((0.5, 1e-10), (0.46211715726000974, 7.864477329659275e-11)),
((1.0, 1e-10), (0.7615941559557649, 4.199743416140261e-11)),
((1.0, -1e-10), (0.7615941559557649, -4.199743416140261e-11)),
(
(0.999999, 0.001),
(0.7615940558314461, 0.0004199748777099632),
),
((3.0, 4.0), (1.000709536067233, 0.004908258067496059)),
(
(-1.0, 1e-300),
(-0.7615941559557649, 4.199743416140261e-301),
),
((2.0, -2.0), (1.0238355945704727, 0.02839295286823229)),
((8.5, 0.1), (0.9999999188517111, 1.6449571787630947e-08)),
((-9.0, 40.0), (-1.0000000033623906, -3.027380823729778e-08)),
((12.0, 200.0), (1.0000000000396612, -6.424670138194217e-11)),
((-0.3, -0.4), (-0.3382547432654715, -0.3811320742724429)),
((100000000.0, 100000000.0), (1.0, -0.0)),
((1.7e+308, 1.7e+308), (1.0, -0.0)),
((-1.7e+308, 1.0), (-1.0, 0.0)),
((100.0, 0.5), (1.0, 2.32901754645078e-87)),
((-100.0, -0.5), (-1.0, -2.32901754645078e-87)),
((0.1, 0.1), (0.10066129051145502, 0.09932804352165596)),
((709.5, 0.5), (1.0, 0.0)),
((709.9, 1.5707963267948966), (1.0, 0.0)),
((0.0, 2.0), (0.0, -2.185039863261519)),
((0.0, -2.0), (0.0, 2.185039863261519)),
((-0.0, -2.0), (-0.0, 2.185039863261519)),
];
for &((re, im), want) in CASES {
let z = Complex::new(re, im);
check_c(
"tanh",
&format!("{z:?}"),
z.tanh(),
want,
1e-12,
!finite_input(z),
);
}
}
#[test]
fn complex_exp_f32() {
let _report = Report;
const CASES: &[((f32, f32), (f32, f32))] = &[
((f32::NAN, f32::NAN), (f32::NAN, f32::NAN)),
((f32::NAN, f32::INFINITY), (f32::NAN, f32::NAN)),
((f32::NAN, f32::NEG_INFINITY), (f32::NAN, f32::NAN)),
((f32::NAN, 0.0), (f32::NAN, 0.0)),
((f32::NAN, -0.0), (f32::NAN, -0.0)),
((f32::NAN, 1.0), (f32::NAN, f32::NAN)),
((f32::NAN, -1.0), (f32::NAN, f32::NAN)),
((f32::NAN, 0.5), (f32::NAN, f32::NAN)),
((f32::NAN, -2.0), (f32::NAN, f32::NAN)),
((f32::NAN, 3.0), (f32::NAN, f32::NAN)),
((f32::INFINITY, f32::NAN), (f32::INFINITY, f32::NAN)),
((f32::INFINITY, f32::INFINITY), (f32::INFINITY, f32::NAN)),
(
(f32::INFINITY, f32::NEG_INFINITY),
(f32::INFINITY, f32::NAN),
),
((f32::INFINITY, 0.0), (f32::INFINITY, 0.0)),
((f32::INFINITY, -0.0), (f32::INFINITY, -0.0)),
((f32::INFINITY, 1.0), (f32::INFINITY, f32::INFINITY)),
((f32::INFINITY, -1.0), (f32::INFINITY, f32::NEG_INFINITY)),
((f32::INFINITY, 0.5), (f32::INFINITY, f32::INFINITY)),
(
(f32::INFINITY, -2.0),
(f32::NEG_INFINITY, f32::NEG_INFINITY),
),
((f32::INFINITY, 3.0), (f32::NEG_INFINITY, f32::INFINITY)),
((f32::NEG_INFINITY, f32::NAN), (0.0, 0.0)),
((f32::NEG_INFINITY, f32::INFINITY), (0.0, 0.0)),
((f32::NEG_INFINITY, f32::NEG_INFINITY), (0.0, -0.0)),
((f32::NEG_INFINITY, 0.0), (0.0, 0.0)),
((f32::NEG_INFINITY, -0.0), (0.0, -0.0)),
((f32::NEG_INFINITY, 1.0), (0.0, 0.0)),
((f32::NEG_INFINITY, -1.0), (0.0, -0.0)),
((f32::NEG_INFINITY, 0.5), (0.0, 0.0)),
((f32::NEG_INFINITY, -2.0), (-0.0, -0.0)),
((f32::NEG_INFINITY, 3.0), (-0.0, 0.0)),
((0.0, f32::NAN), (f32::NAN, f32::NAN)),
((0.0, f32::INFINITY), (f32::NAN, f32::NAN)),
((0.0, f32::NEG_INFINITY), (f32::NAN, f32::NAN)),
((0.0, 0.0), (1.0, 0.0)),
((0.0, -0.0), (1.0, -0.0)),
((0.0, 1.0), (0.5403023, 0.84147096)),
((0.0, -1.0), (0.5403023, -0.84147096)),
((0.0, 0.5), (0.87758255, 0.47942555)),
((0.0, -2.0), (-0.41614684, -0.9092974)),
((0.0, 3.0), (-0.9899925, 0.14112)),
((-0.0, f32::NAN), (f32::NAN, f32::NAN)),
((-0.0, f32::INFINITY), (f32::NAN, f32::NAN)),
((-0.0, f32::NEG_INFINITY), (f32::NAN, f32::NAN)),
((-0.0, 0.0), (1.0, 0.0)),
((-0.0, -0.0), (1.0, -0.0)),
((-0.0, 1.0), (0.5403023, 0.84147096)),
((-0.0, -1.0), (0.5403023, -0.84147096)),
((-0.0, 0.5), (0.87758255, 0.47942555)),
((-0.0, -2.0), (-0.41614684, -0.9092974)),
((-0.0, 3.0), (-0.9899925, 0.14112)),
((1.0, f32::NAN), (f32::NAN, f32::NAN)),
((1.0, f32::INFINITY), (f32::NAN, f32::NAN)),
((1.0, f32::NEG_INFINITY), (f32::NAN, f32::NAN)),
((1.0, 0.0), (2.7182817, 0.0)),
((1.0, -0.0), (2.7182817, -0.0)),
((1.0, 1.0), (1.4686939, 2.2873552)),
((1.0, -1.0), (1.4686939, -2.2873552)),
((1.0, 0.5), (2.3855166, 1.3032137)),
((1.0, -2.0), (-1.1312044, -2.4717267)),
((1.0, 3.0), (-2.6910784, 0.38360393)),
((-1.0, f32::NAN), (f32::NAN, f32::NAN)),
((-1.0, f32::INFINITY), (f32::NAN, f32::NAN)),
((-1.0, f32::NEG_INFINITY), (f32::NAN, f32::NAN)),
((-1.0, 0.0), (0.36787945, 0.0)),
((-1.0, -0.0), (0.36787945, -0.0)),
((-1.0, 1.0), (0.1987661, 0.30955988)),
((-1.0, -1.0), (0.1987661, -0.30955988)),
((-1.0, 0.5), (0.3228446, 0.17637081)),
((-1.0, -2.0), (-0.15309188, -0.33451182)),
((-1.0, 3.0), (-0.3641979, 0.05191515)),
((0.5, f32::NAN), (f32::NAN, f32::NAN)),
((0.5, f32::INFINITY), (f32::NAN, f32::NAN)),
((0.5, f32::NEG_INFINITY), (f32::NAN, f32::NAN)),
((0.5, 0.0), (1.6487212, 0.0)),
((0.5, -0.0), (1.6487212, -0.0)),
((0.5, 1.0), (0.8908078, 1.387351)),
((0.5, -1.0), (0.8908078, -1.387351)),
((0.5, 0.5), (1.4468889, 0.79043907)),
((0.5, -2.0), (-0.68611014, -1.4991779)),
((0.5, 3.0), (-1.6322217, 0.23266754)),
((-2.0, f32::NAN), (f32::NAN, f32::NAN)),
((-2.0, f32::INFINITY), (f32::NAN, f32::NAN)),
((-2.0, f32::NEG_INFINITY), (f32::NAN, f32::NAN)),
((-2.0, 0.0), (0.13533528, 0.0)),
((-2.0, -0.0), (0.13533528, -0.0)),
((-2.0, 1.0), (0.07312196, 0.11388071)),
((-2.0, -1.0), (0.07312196, -0.11388071)),
((-2.0, 0.5), (0.11876788, 0.064883195)),
((-2.0, -2.0), (-0.05631935, -0.12306002)),
((-2.0, 3.0), (-0.13398091, 0.019098515)),
((3.0, f32::NAN), (f32::NAN, f32::NAN)),
((3.0, f32::INFINITY), (f32::NAN, f32::NAN)),
((3.0, f32::NEG_INFINITY), (f32::NAN, f32::NAN)),
((3.0, 0.0), (20.085537, 0.0)),
((3.0, -0.0), (20.085537, -0.0)),
((3.0, 1.0), (10.852262, 16.901396)),
((3.0, -1.0), (10.852262, -16.901396)),
((3.0, 0.5), (17.626717, 9.629519)),
((3.0, -2.0), (-8.358533, -18.263727)),
((3.0, 3.0), (-19.884531, 2.834471)),
((1.0, 2.0), (-1.1312044, 2.4717267)),
((-3.0, 0.5), (0.04369226, 0.023869192)),
((1e-05, 1e-05), (1.00001, 1.00001e-05)),
((25.0, 0.0), (7.20049e+10, 0.0)),
((0.0, 30.0), (0.15425146, -0.9880316)),
((22.5, -3.0), (-5.8513725e+09, -8.3409286e+08)),
((10.0, 100000.0), (-22012.385, 787.4197)),
((700.0, 1.0), (f32::INFINITY, f32::INFINITY)),
((750.0, 2.0), (f32::NEG_INFINITY, f32::INFINITY)),
((-750.0, 2.0), (-0.0, 0.0)),
((0.0, 0.0), (1.0, 0.0)),
((0.0, 0.0), (1.0, 0.0)),
((-4.0, 0.0), (0.01831564, 0.0)),
((-4.0, 0.0), (0.01831564, 0.0)),
((-4.0, 0.0), (0.01831564, 0.0)),
((-4.0, -0.0), (0.01831564, -0.0)),
((0.5, 1e-10), (1.6487212, 1.6487213e-10)),
((1.0, 1e-10), (2.7182817, 2.7182817e-10)),
((1.0, -1e-10), (2.7182817, -2.7182817e-10)),
((0.999999, 0.001), (2.718278, 0.002718279)),
((3.0, 4.0), (-13.128783, -15.200785)),
((-1.0, 0.0), (0.36787945, 0.0)),
((2.0, -2.0), (-3.0749323, -6.7188497)),
((8.5, 0.1), (4890.216, 490.6582)),
((-9.0, 40.0), (-8.2306695e-05, 9.1954265e-05)),
((12.0, 200.0), (79292.13, -142133.33)),
((-0.3, -0.4), (0.6823387, -0.28848818)),
((1e+08, 1e+08), (f32::NEG_INFINITY, f32::INFINITY)),
((100.0, 0.5), (f32::INFINITY, f32::INFINITY)),
((-100.0, -0.5), (3.4e-44, -1.8e-44)),
((0.1, 0.1), (1.0996497, 0.110332996)),
((709.5, 0.5), (f32::INFINITY, f32::INFINITY)),
((0.0, 2.0), (-0.41614684, 0.9092974)),
((0.0, -2.0), (-0.41614684, -0.9092974)),
((-0.0, -2.0), (-0.41614684, -0.9092974)),
];
for &((re, im), want) in CASES {
let z = Complex::new(re, im);
check_c(
"exp",
&format!("{z:?}"),
z.exp(),
want,
2e-4,
!finite_input(z),
);
}
}
#[test]
fn complex_ln_f32() {
let _report = Report;
const CASES: &[((f32, f32), (f32, f32))] = &[
((f32::NAN, f32::NAN), (f32::NAN, f32::NAN)),
((f32::NAN, f32::INFINITY), (f32::INFINITY, f32::NAN)),
((f32::NAN, f32::NEG_INFINITY), (f32::INFINITY, f32::NAN)),
((f32::NAN, 0.0), (f32::NAN, f32::NAN)),
((f32::NAN, -0.0), (f32::NAN, f32::NAN)),
((f32::NAN, 1.0), (f32::NAN, f32::NAN)),
((f32::NAN, -1.0), (f32::NAN, f32::NAN)),
((f32::NAN, 0.5), (f32::NAN, f32::NAN)),
((f32::NAN, -2.0), (f32::NAN, f32::NAN)),
((f32::NAN, 3.0), (f32::NAN, f32::NAN)),
((f32::INFINITY, f32::NAN), (f32::INFINITY, f32::NAN)),
((f32::INFINITY, f32::INFINITY), (f32::INFINITY, 0.7853982)),
(
(f32::INFINITY, f32::NEG_INFINITY),
(f32::INFINITY, -0.7853982),
),
((f32::INFINITY, 0.0), (f32::INFINITY, 0.0)),
((f32::INFINITY, -0.0), (f32::INFINITY, -0.0)),
((f32::INFINITY, 1.0), (f32::INFINITY, 0.0)),
((f32::INFINITY, -1.0), (f32::INFINITY, -0.0)),
((f32::INFINITY, 0.5), (f32::INFINITY, 0.0)),
((f32::INFINITY, -2.0), (f32::INFINITY, -0.0)),
((f32::INFINITY, 3.0), (f32::INFINITY, 0.0)),
((f32::NEG_INFINITY, f32::NAN), (f32::INFINITY, f32::NAN)),
(
(f32::NEG_INFINITY, f32::INFINITY),
(f32::INFINITY, 2.3561945),
),
(
(f32::NEG_INFINITY, f32::NEG_INFINITY),
(f32::INFINITY, -2.3561945),
),
((f32::NEG_INFINITY, 0.0), (f32::INFINITY, 3.1415927)),
((f32::NEG_INFINITY, -0.0), (f32::INFINITY, -3.1415927)),
((f32::NEG_INFINITY, 1.0), (f32::INFINITY, 3.1415927)),
((f32::NEG_INFINITY, -1.0), (f32::INFINITY, -3.1415927)),
((f32::NEG_INFINITY, 0.5), (f32::INFINITY, 3.1415927)),
((f32::NEG_INFINITY, -2.0), (f32::INFINITY, -3.1415927)),
((f32::NEG_INFINITY, 3.0), (f32::INFINITY, 3.1415927)),
((0.0, f32::NAN), (f32::NAN, f32::NAN)),
((0.0, f32::INFINITY), (f32::INFINITY, 1.5707964)),
((0.0, f32::NEG_INFINITY), (f32::INFINITY, -1.5707964)),
((0.0, 0.0), (f32::NEG_INFINITY, 0.0)),
((0.0, -0.0), (f32::NEG_INFINITY, -0.0)),
((0.0, 1.0), (0.0, 1.5707964)),
((0.0, -1.0), (0.0, -1.5707964)),
((0.0, 0.5), (-0.6931472, 1.5707964)),
((0.0, -2.0), (0.6931472, -1.5707964)),
((0.0, 3.0), (1.0986123, 1.5707964)),
((-0.0, f32::NAN), (f32::NAN, f32::NAN)),
((-0.0, f32::INFINITY), (f32::INFINITY, 1.5707964)),
((-0.0, f32::NEG_INFINITY), (f32::INFINITY, -1.5707964)),
((-0.0, 0.0), (f32::NEG_INFINITY, 3.1415927)),
((-0.0, -0.0), (f32::NEG_INFINITY, -3.1415927)),
((-0.0, 1.0), (0.0, 1.5707964)),
((-0.0, -1.0), (0.0, -1.5707964)),
((-0.0, 0.5), (-0.6931472, 1.5707964)),
((-0.0, -2.0), (0.6931472, -1.5707964)),
((-0.0, 3.0), (1.0986123, 1.5707964)),
((1.0, f32::NAN), (f32::NAN, f32::NAN)),
((1.0, f32::INFINITY), (f32::INFINITY, 1.5707964)),
((1.0, f32::NEG_INFINITY), (f32::INFINITY, -1.5707964)),
((1.0, 0.0), (0.0, 0.0)),
((1.0, -0.0), (0.0, -0.0)),
((1.0, 1.0), (0.3465736, 0.7853982)),
((1.0, -1.0), (0.3465736, -0.7853982)),
((1.0, 0.5), (0.111571774, 0.4636476)),
((1.0, -2.0), (0.804719, -1.1071488)),
((1.0, 3.0), (1.1512926, 1.2490457)),
((-1.0, f32::NAN), (f32::NAN, f32::NAN)),
((-1.0, f32::INFINITY), (f32::INFINITY, 1.5707964)),
((-1.0, f32::NEG_INFINITY), (f32::INFINITY, -1.5707964)),
((-1.0, 0.0), (0.0, 3.1415927)),
((-1.0, -0.0), (0.0, -3.1415927)),
((-1.0, 1.0), (0.3465736, 2.3561945)),
((-1.0, -1.0), (0.3465736, -2.3561945)),
((-1.0, 0.5), (0.111571774, 2.6779451)),
((-1.0, -2.0), (0.804719, -2.0344439)),
((-1.0, 3.0), (1.1512926, 1.8925469)),
((0.5, f32::NAN), (f32::NAN, f32::NAN)),
((0.5, f32::INFINITY), (f32::INFINITY, 1.5707964)),
((0.5, f32::NEG_INFINITY), (f32::INFINITY, -1.5707964)),
((0.5, 0.0), (-0.6931472, 0.0)),
((0.5, -0.0), (-0.6931472, -0.0)),
((0.5, 1.0), (0.111571774, 1.1071488)),
((0.5, -1.0), (0.111571774, -1.1071488)),
((0.5, 0.5), (-0.34657362, 0.7853982)),
((0.5, -2.0), (0.7234595, -1.3258177)),
((0.5, 3.0), (1.1123118, 1.4056476)),
((-2.0, f32::NAN), (f32::NAN, f32::NAN)),
((-2.0, f32::INFINITY), (f32::INFINITY, 1.5707964)),
((-2.0, f32::NEG_INFINITY), (f32::INFINITY, -1.5707964)),
((-2.0, 0.0), (0.6931472, 3.1415927)),
((-2.0, -0.0), (0.6931472, -3.1415927)),
((-2.0, 1.0), (0.804719, 2.6779451)),
((-2.0, -1.0), (0.804719, -2.6779451)),
((-2.0, 0.5), (0.7234595, 2.896614)),
((-2.0, -2.0), (1.0397208, -2.3561945)),
((-2.0, 3.0), (1.2824746, 2.158799)),
((3.0, f32::NAN), (f32::NAN, f32::NAN)),
((3.0, f32::INFINITY), (f32::INFINITY, 1.5707964)),
((3.0, f32::NEG_INFINITY), (f32::INFINITY, -1.5707964)),
((3.0, 0.0), (1.0986123, 0.0)),
((3.0, -0.0), (1.0986123, -0.0)),
((3.0, 1.0), (1.1512926, 0.32175055)),
((3.0, -1.0), (1.1512926, -0.32175055)),
((3.0, 0.5), (1.1123118, 0.16514868)),
((3.0, -2.0), (1.2824746, -0.5880026)),
((3.0, 3.0), (1.4451858, 0.7853982)),
((1.0, 2.0), (0.804719, 1.1071488)),
((-3.0, 0.5), (1.1123118, 2.976444)),
((1e-05, 1e-05), (-11.166352, 0.7853982)),
((25.0, 0.0), (3.218876, 0.0)),
((0.0, 30.0), (3.4011974, 1.5707964)),
((22.5, -3.0), (3.1223261, -0.13255154)),
((10.0, 100000.0), (11.512925, 1.5706964)),
((700.0, 1.0), (6.551081, 0.0014285705)),
((710.0, 1.0), (6.565266, 0.0014084497)),
((750.0, 2.0), (6.6200767, 0.0026666604)),
((-750.0, 2.0), (6.6200767, 3.138926)),
((0.0, 0.0), (f32::NEG_INFINITY, 0.0)),
((0.0, 0.0), (f32::NEG_INFINITY, 0.0)),
((-4.0, 0.0), (1.3862944, 3.1415927)),
((-4.0, 0.0), (1.3862944, 3.1415927)),
((-4.0, 0.0), (1.3862944, 3.1415927)),
((-4.0, -0.0), (1.3862944, -3.1415927)),
((0.5, 1e-10), (-0.6931472, 2e-10)),
((1.0, 1e-10), (5.0000002e-21, 1e-10)),
((1.0, -1e-10), (5.0000002e-21, -1e-10)),
((0.999999, 0.001), (-5.1327874e-07, 0.0010000007)),
((3.0, 4.0), (1.609438, 0.9272952)),
((-1.0, 0.0), (0.0, 3.1415927)),
((2.0, -2.0), (1.0397208, -0.7853982)),
((8.5, 0.1), (2.1401353, 0.011764163)),
((-9.0, 40.0), (3.713572, 1.7921108)),
((12.0, 200.0), (5.300114, 1.5108682)),
((-0.3, -0.4), (-0.6931472, -2.2142975)),
((1e+08, 1e+08), (18.767254, 0.7853982)),
((100.0, 0.5), (4.6051826, 0.0049999584)),
((-100.0, -0.5), (4.6051826, -3.1365926)),
((0.1, 0.1), (-1.9560114, 0.7853982)),
((709.5, 0.5), (6.564561, 0.0007047215)),
((709.9, 1.5707964), (6.5651264, 0.0022126972)),
((0.0, 2.0), (0.6931472, 1.5707964)),
((0.0, -2.0), (0.6931472, -1.5707964)),
((-0.0, -2.0), (0.6931472, -1.5707964)),
];
for &((re, im), want) in CASES {
let z = Complex::new(re, im);
check_c(
"ln",
&format!("{z:?}"),
z.ln(),
want,
2e-4,
!finite_input(z),
);
}
}
#[test]
fn complex_sqrt_f32() {
let _report = Report;
const CASES: &[((f32, f32), (f32, f32))] = &[
((f32::NAN, f32::NAN), (f32::NAN, f32::NAN)),
((f32::NAN, f32::INFINITY), (f32::INFINITY, f32::INFINITY)),
(
(f32::NAN, f32::NEG_INFINITY),
(f32::INFINITY, f32::NEG_INFINITY),
),
((f32::NAN, 0.0), (f32::NAN, f32::NAN)),
((f32::NAN, -0.0), (f32::NAN, f32::NAN)),
((f32::NAN, 1.0), (f32::NAN, f32::NAN)),
((f32::NAN, -1.0), (f32::NAN, f32::NAN)),
((f32::NAN, 0.5), (f32::NAN, f32::NAN)),
((f32::NAN, -2.0), (f32::NAN, f32::NAN)),
((f32::NAN, 3.0), (f32::NAN, f32::NAN)),
((f32::INFINITY, f32::NAN), (f32::INFINITY, f32::NAN)),
(
(f32::INFINITY, f32::INFINITY),
(f32::INFINITY, f32::INFINITY),
),
(
(f32::INFINITY, f32::NEG_INFINITY),
(f32::INFINITY, f32::NEG_INFINITY),
),
((f32::INFINITY, 0.0), (f32::INFINITY, 0.0)),
((f32::INFINITY, -0.0), (f32::INFINITY, -0.0)),
((f32::INFINITY, 1.0), (f32::INFINITY, 0.0)),
((f32::INFINITY, -1.0), (f32::INFINITY, -0.0)),
((f32::INFINITY, 0.5), (f32::INFINITY, 0.0)),
((f32::INFINITY, -2.0), (f32::INFINITY, -0.0)),
((f32::INFINITY, 3.0), (f32::INFINITY, 0.0)),
((f32::NEG_INFINITY, f32::NAN), (f32::NAN, f32::INFINITY)),
(
(f32::NEG_INFINITY, f32::INFINITY),
(f32::INFINITY, f32::INFINITY),
),
(
(f32::NEG_INFINITY, f32::NEG_INFINITY),
(f32::INFINITY, f32::NEG_INFINITY),
),
((f32::NEG_INFINITY, 0.0), (0.0, f32::INFINITY)),
((f32::NEG_INFINITY, -0.0), (0.0, f32::NEG_INFINITY)),
((f32::NEG_INFINITY, 1.0), (0.0, f32::INFINITY)),
((f32::NEG_INFINITY, -1.0), (0.0, f32::NEG_INFINITY)),
((f32::NEG_INFINITY, 0.5), (0.0, f32::INFINITY)),
((f32::NEG_INFINITY, -2.0), (0.0, f32::NEG_INFINITY)),
((f32::NEG_INFINITY, 3.0), (0.0, f32::INFINITY)),
((0.0, f32::NAN), (f32::NAN, f32::NAN)),
((0.0, f32::INFINITY), (f32::INFINITY, f32::INFINITY)),
((0.0, f32::NEG_INFINITY), (f32::INFINITY, f32::NEG_INFINITY)),
((0.0, 0.0), (0.0, 0.0)),
((0.0, -0.0), (0.0, -0.0)),
((0.0, 1.0), (0.70710677, 0.70710677)),
((0.0, -1.0), (0.70710677, -0.70710677)),
((0.0, 0.5), (0.5, 0.5)),
((0.0, -2.0), (1.0, -1.0)),
((0.0, 3.0), (1.2247449, 1.2247448)),
((-0.0, f32::NAN), (f32::NAN, f32::NAN)),
((-0.0, f32::INFINITY), (f32::INFINITY, f32::INFINITY)),
(
(-0.0, f32::NEG_INFINITY),
(f32::INFINITY, f32::NEG_INFINITY),
),
((-0.0, 0.0), (0.0, 0.0)),
((-0.0, -0.0), (0.0, -0.0)),
((-0.0, 1.0), (0.70710677, 0.70710677)),
((-0.0, -1.0), (0.70710677, -0.70710677)),
((-0.0, 0.5), (0.5, 0.5)),
((-0.0, -2.0), (1.0, -1.0)),
((-0.0, 3.0), (1.2247449, 1.2247448)),
((1.0, f32::NAN), (f32::NAN, f32::NAN)),
((1.0, f32::INFINITY), (f32::INFINITY, f32::INFINITY)),
((1.0, f32::NEG_INFINITY), (f32::INFINITY, f32::NEG_INFINITY)),
((1.0, 0.0), (1.0, 0.0)),
((1.0, -0.0), (1.0, -0.0)),
((1.0, 1.0), (1.0986842, 0.45508984)),
((1.0, -1.0), (1.0986842, -0.45508984)),
((1.0, 0.5), (1.0290855, 0.24293414)),
((1.0, -2.0), (1.2720196, -0.7861514)),
((1.0, 3.0), (1.4426153, 1.0397782)),
((-1.0, f32::NAN), (f32::NAN, f32::NAN)),
((-1.0, f32::INFINITY), (f32::INFINITY, f32::INFINITY)),
(
(-1.0, f32::NEG_INFINITY),
(f32::INFINITY, f32::NEG_INFINITY),
),
((-1.0, 0.0), (0.0, 1.0)),
((-1.0, -0.0), (0.0, -1.0)),
((-1.0, 1.0), (0.45508984, 1.0986842)),
((-1.0, -1.0), (0.45508984, -1.0986842)),
((-1.0, 0.5), (0.24293414, 1.0290855)),
((-1.0, -2.0), (0.7861514, -1.2720196)),
((-1.0, 3.0), (1.0397782, 1.4426153)),
((0.5, f32::NAN), (f32::NAN, f32::NAN)),
((0.5, f32::INFINITY), (f32::INFINITY, f32::INFINITY)),
((0.5, f32::NEG_INFINITY), (f32::INFINITY, f32::NEG_INFINITY)),
((0.5, 0.0), (0.70710677, 0.0)),
((0.5, -0.0), (0.70710677, -0.0)),
((0.5, 1.0), (0.8994537, 0.555893)),
((0.5, -1.0), (0.8994537, -0.555893)),
((0.5, 0.5), (0.776887, 0.32179713)),
((0.5, -2.0), (1.1317139, -0.88361555)),
((0.5, 3.0), (1.330673, 1.1272491)),
((-2.0, f32::NAN), (f32::NAN, f32::NAN)),
((-2.0, f32::INFINITY), (f32::INFINITY, f32::INFINITY)),
(
(-2.0, f32::NEG_INFINITY),
(f32::INFINITY, f32::NEG_INFINITY),
),
((-2.0, 0.0), (0.0, 1.4142135)),
((-2.0, -0.0), (0.0, -1.4142135)),
((-2.0, 1.0), (0.34356076, 1.4553467)),
((-2.0, -1.0), (0.34356076, -1.4553467)),
((-2.0, 0.5), (0.17543206, 1.4250531)),
((-2.0, -2.0), (0.64359426, -1.553774)),
((-2.0, 3.0), (0.89597744, 1.6741493)),
((3.0, f32::NAN), (f32::NAN, f32::NAN)),
((3.0, f32::INFINITY), (f32::INFINITY, f32::INFINITY)),
((3.0, f32::NEG_INFINITY), (f32::INFINITY, f32::NEG_INFINITY)),
((3.0, 0.0), (1.7320508, 0.0)),
((3.0, -0.0), (1.7320508, -0.0)),
((3.0, 1.0), (1.7553173, 0.28484878)),
((3.0, -1.0), (1.7553173, -0.28484878)),
((3.0, 0.5), (1.7380134, 0.14384238)),
((3.0, -2.0), (1.817354, -0.55025053)),
((3.0, 3.0), (1.9029766, 0.78823876)),
((1.0, 2.0), (1.2720196, 0.7861514)),
((-3.0, 0.5), (0.14384238, 1.7380134)),
((1e-05, 1e-05), (0.0034743443, 0.0014391205)),
((25.0, 0.0), (5.0, 0.0)),
((0.0, 30.0), (3.8729835, 3.8729832)),
((22.5, -3.0), (4.7538996, -0.31553045)),
((10.0, 100000.0), (223.61798, 223.59561)),
((700.0, 1.0), (26.45752, 0.018898219)),
((710.0, 1.0), (26.645832, 0.018764662)),
((750.0, 2.0), (27.386152, 0.036514804)),
((-750.0, 2.0), (0.036514804, 27.386152)),
((0.0, 0.0), (0.0, 0.0)),
((0.0, 0.0), (0.0, 0.0)),
((-4.0, 0.0), (0.0, 2.0)),
((-4.0, 0.0), (0.0, 2.0)),
((-4.0, 0.0), (0.0, 2.0)),
((-4.0, -0.0), (0.0, -2.0)),
((0.5, 1e-10), (0.70710677, 7.071068e-11)),
((1.0, 1e-10), (1.0, 5e-11)),
((1.0, -1e-10), (1.0, -5e-11)),
((0.999999, 0.001), (0.9999996, 0.00050000026)),
((3.0, 4.0), (2.0, 1.0)),
((-1.0, 0.0), (0.0, 1.0)),
((2.0, -2.0), (1.553774, -0.64359426)),
((8.5, 0.1), (2.9155264, 0.017149562)),
((-9.0, 40.0), (4.0, 5.0)),
((12.0, 200.0), (10.30436, 9.70463)),
((-0.3, -0.4), (0.31622776, -0.6324555)),
((1e+08, 1e+08), (10986.841, 4550.899)),
((100.0, 0.5), (10.000031, 0.024999922)),
((-100.0, -0.5), (0.024999922, -10.000031)),
((0.1, 0.1), (0.34743443, 0.14391205)),
((709.5, 0.5), (26.636444, 0.009385637)),
((709.9, 1.5707964), (26.643965, 0.029477527)),
((0.0, 2.0), (1.0, 1.0)),
((0.0, -2.0), (1.0, -1.0)),
((-0.0, -2.0), (1.0, -1.0)),
];
for &((re, im), want) in CASES {
let z = Complex::new(re, im);
check_c(
"sqrt",
&format!("{z:?}"),
z.sqrt(),
want,
2e-4,
!finite_input(z),
);
}
}
#[test]
fn complex_sin_f32() {
let _report = Report;
const CASES: &[((f32, f32), (f32, f32))] = &[
((f32::NAN, f32::NAN), (f32::NAN, f32::NAN)),
((f32::NAN, f32::INFINITY), (f32::NAN, f32::INFINITY)),
((f32::NAN, f32::NEG_INFINITY), (f32::NAN, f32::NEG_INFINITY)),
((f32::NAN, 0.0), (f32::NAN, 0.0)),
((f32::NAN, -0.0), (f32::NAN, -0.0)),
((f32::NAN, 1.0), (f32::NAN, f32::NAN)),
((f32::NAN, -1.0), (f32::NAN, f32::NAN)),
((f32::NAN, 0.5), (f32::NAN, f32::NAN)),
((f32::NAN, -2.0), (f32::NAN, f32::NAN)),
((f32::NAN, 3.0), (f32::NAN, f32::NAN)),
((f32::INFINITY, f32::NAN), (f32::NAN, f32::NAN)),
((f32::INFINITY, f32::INFINITY), (f32::NAN, f32::INFINITY)),
(
(f32::INFINITY, f32::NEG_INFINITY),
(f32::NAN, f32::NEG_INFINITY),
),
((f32::INFINITY, 0.0), (f32::NAN, 0.0)),
((f32::INFINITY, -0.0), (f32::NAN, -0.0)),
((f32::INFINITY, 1.0), (f32::NAN, f32::NAN)),
((f32::INFINITY, -1.0), (f32::NAN, f32::NAN)),
((f32::INFINITY, 0.5), (f32::NAN, f32::NAN)),
((f32::INFINITY, -2.0), (f32::NAN, f32::NAN)),
((f32::INFINITY, 3.0), (f32::NAN, f32::NAN)),
((f32::NEG_INFINITY, f32::NAN), (f32::NAN, f32::NAN)),
(
(f32::NEG_INFINITY, f32::INFINITY),
(f32::NAN, f32::INFINITY),
),
(
(f32::NEG_INFINITY, f32::NEG_INFINITY),
(f32::NAN, f32::NEG_INFINITY),
),
((f32::NEG_INFINITY, 0.0), (f32::NAN, 0.0)),
((f32::NEG_INFINITY, -0.0), (f32::NAN, -0.0)),
((f32::NEG_INFINITY, 1.0), (f32::NAN, f32::NAN)),
((f32::NEG_INFINITY, -1.0), (f32::NAN, f32::NAN)),
((f32::NEG_INFINITY, 0.5), (f32::NAN, f32::NAN)),
((f32::NEG_INFINITY, -2.0), (f32::NAN, f32::NAN)),
((f32::NEG_INFINITY, 3.0), (f32::NAN, f32::NAN)),
((0.0, f32::NAN), (0.0, f32::NAN)),
((0.0, f32::INFINITY), (0.0, f32::INFINITY)),
((0.0, f32::NEG_INFINITY), (0.0, f32::NEG_INFINITY)),
((0.0, 0.0), (0.0, 0.0)),
((0.0, -0.0), (0.0, -0.0)),
((0.0, 1.0), (0.0, 1.1752012)),
((0.0, -1.0), (0.0, -1.1752012)),
((0.0, 0.5), (0.0, 0.52109534)),
((0.0, -2.0), (0.0, -3.6268604)),
((0.0, 3.0), (0.0, 10.017875)),
((-0.0, f32::NAN), (-0.0, f32::NAN)),
((-0.0, f32::INFINITY), (-0.0, f32::INFINITY)),
((-0.0, f32::NEG_INFINITY), (-0.0, f32::NEG_INFINITY)),
((-0.0, 0.0), (-0.0, 0.0)),
((-0.0, -0.0), (-0.0, -0.0)),
((-0.0, 1.0), (-0.0, 1.1752012)),
((-0.0, -1.0), (-0.0, -1.1752012)),
((-0.0, 0.5), (-0.0, 0.52109534)),
((-0.0, -2.0), (-0.0, -3.6268604)),
((-0.0, 3.0), (-0.0, 10.017875)),
((1.0, f32::NAN), (f32::NAN, f32::NAN)),
((1.0, f32::INFINITY), (f32::INFINITY, f32::INFINITY)),
((1.0, f32::NEG_INFINITY), (f32::INFINITY, f32::NEG_INFINITY)),
((1.0, 0.0), (0.84147096, 0.0)),
((1.0, -0.0), (0.84147096, -0.0)),
((1.0, 1.0), (1.2984575, 0.63496387)),
((1.0, -1.0), (1.2984575, -0.63496387)),
((1.0, 0.5), (0.94886446, 0.281549)),
((1.0, -2.0), (3.1657786, -1.9596009)),
((1.0, 3.0), (8.471645, 5.4126806)),
((-1.0, f32::NAN), (f32::NAN, f32::NAN)),
((-1.0, f32::INFINITY), (f32::NEG_INFINITY, f32::INFINITY)),
(
(-1.0, f32::NEG_INFINITY),
(f32::NEG_INFINITY, f32::NEG_INFINITY),
),
((-1.0, 0.0), (-0.84147096, 0.0)),
((-1.0, -0.0), (-0.84147096, -0.0)),
((-1.0, 1.0), (-1.2984575, 0.63496387)),
((-1.0, -1.0), (-1.2984575, -0.63496387)),
((-1.0, 0.5), (-0.94886446, 0.281549)),
((-1.0, -2.0), (-3.1657786, -1.9596009)),
((-1.0, 3.0), (-8.471645, 5.4126806)),
((0.5, f32::NAN), (f32::NAN, f32::NAN)),
((0.5, f32::INFINITY), (f32::INFINITY, f32::INFINITY)),
((0.5, f32::NEG_INFINITY), (f32::INFINITY, f32::NEG_INFINITY)),
((0.5, 0.0), (0.47942555, 0.0)),
((0.5, -0.0), (0.47942555, -0.0)),
((0.5, 1.0), (0.7397922, 1.0313361)),
((0.5, -1.0), (0.7397922, -1.0313361)),
((0.5, 0.5), (0.5406127, 0.45730418)),
((0.5, -2.0), (1.8036928, -3.1828694)),
((0.5, 3.0), (4.8266945, 8.7915125)),
((-2.0, f32::NAN), (f32::NAN, f32::NAN)),
(
(-2.0, f32::INFINITY),
(f32::NEG_INFINITY, f32::NEG_INFINITY),
),
(
(-2.0, f32::NEG_INFINITY),
(f32::NEG_INFINITY, f32::INFINITY),
),
((-2.0, 0.0), (-0.9092974, -0.0)),
((-2.0, -0.0), (-0.9092974, 0.0)),
((-2.0, 1.0), (-1.4031192, -0.48905626)),
((-2.0, -1.0), (-1.4031192, 0.48905626)),
((-2.0, 0.5), (-1.0253474, -0.21685217)),
((-2.0, -2.0), (-3.420955, 1.5093066)),
((-2.0, 3.0), (-9.154499, -4.168907)),
((3.0, f32::NAN), (f32::NAN, f32::NAN)),
((3.0, f32::INFINITY), (f32::INFINITY, f32::NEG_INFINITY)),
((3.0, f32::NEG_INFINITY), (f32::INFINITY, f32::INFINITY)),
((3.0, 0.0), (0.14112, -0.0)),
((3.0, -0.0), (0.14112, 0.0)),
((3.0, 1.0), (0.21775953, -1.1634403)),
((3.0, -1.0), (0.21775953, 1.1634403)),
((3.0, 0.5), (0.15913057, -0.51588047)),
((3.0, -2.0), (0.5309211, 3.5905645)),
((3.0, 3.0), (1.4207485, -9.917621)),
((1.0, 2.0), (3.1657786, 1.9596009)),
((-3.0, 0.5), (-0.15913057, -0.51588047)),
((1e-05, 1e-05), (1e-05, 1e-05)),
((25.0, 0.0), (-0.13235176, 0.0)),
((0.0, 30.0), (0.0, 5.343237e+12)),
((22.5, -3.0), (-4.9047084, 8.748656)),
((10.0, 100000.0), (f32::NEG_INFINITY, f32::NEG_INFINITY)),
((700.0, 1.0), (0.83939034, -0.9861164)),
((710.0, 1.0), (9.3030336e-05, 1.1752012)),
((750.0, 2.0), (2.8031104, -2.4190543)),
((-750.0, 2.0), (-2.8031104, -2.4190543)),
((0.0, 0.0), (0.0, 0.0)),
((0.0, 0.0), (0.0, 0.0)),
((-4.0, 0.0), (0.7568025, -0.0)),
((-4.0, 0.0), (0.7568025, -0.0)),
((-4.0, 0.0), (0.7568025, -0.0)),
((-4.0, -0.0), (0.7568025, 0.0)),
((0.5, 1e-10), (0.47942555, 8.775826e-11)),
((1.0, 1e-10), (0.84147096, 5.4030228e-11)),
((1.0, -1e-10), (0.84147096, -5.4030228e-11)),
((0.999999, 0.001), (0.84147084, 0.0005403033)),
((3.0, 4.0), (3.8537376, -27.016813)),
((-1.0, 0.0), (-0.84147096, 0.0)),
((2.0, -2.0), (3.420955, 1.5093066)),
((8.5, 0.1), (0.8024829, -0.06030158)),
((-9.0, 40.0), (-4.850331e+16, -1.0723332e+17)),
((12.0, 200.0), (f32::NEG_INFINITY, f32::INFINITY)),
((-0.3, -0.4), (-0.31947872, -0.3924067)),
((1e+08, 1e+08), (f32::INFINITY, f32::NEG_INFINITY)),
((100.0, 0.5), (-0.57099104, 0.44935036)),
((-100.0, -0.5), (0.57099104, -0.44935036)),
((0.1, 0.1), (0.100333005, 0.099666335)),
((709.5, 0.5), (-0.540553, 0.45731923)),
((709.9, 1.5707964), (-0.2502884, 2.2898216)),
((0.0, 2.0), (0.0, 3.6268604)),
((0.0, -2.0), (0.0, -3.6268604)),
((-0.0, -2.0), (-0.0, -3.6268604)),
];
for &((re, im), want) in CASES {
let z = Complex::new(re, im);
check_c(
"sin",
&format!("{z:?}"),
z.sin(),
want,
2e-4,
!finite_input(z),
);
}
}
#[test]
fn complex_cos_f32() {
let _report = Report;
const CASES: &[((f32, f32), (f32, f32))] = &[
((f32::NAN, f32::NAN), (f32::NAN, f32::NAN)),
((f32::NAN, f32::INFINITY), (f32::INFINITY, f32::NAN)),
((f32::NAN, f32::NEG_INFINITY), (f32::INFINITY, f32::NAN)),
((f32::NAN, 0.0), (f32::NAN, -0.0)),
((f32::NAN, -0.0), (f32::NAN, 0.0)),
((f32::NAN, 1.0), (f32::NAN, f32::NAN)),
((f32::NAN, -1.0), (f32::NAN, f32::NAN)),
((f32::NAN, 0.5), (f32::NAN, f32::NAN)),
((f32::NAN, -2.0), (f32::NAN, f32::NAN)),
((f32::NAN, 3.0), (f32::NAN, f32::NAN)),
((f32::INFINITY, f32::NAN), (f32::NAN, f32::NAN)),
((f32::INFINITY, f32::INFINITY), (f32::INFINITY, f32::NAN)),
(
(f32::INFINITY, f32::NEG_INFINITY),
(f32::INFINITY, f32::NAN),
),
((f32::INFINITY, 0.0), (f32::NAN, 0.0)),
((f32::INFINITY, -0.0), (f32::NAN, 0.0)),
((f32::INFINITY, 1.0), (f32::NAN, f32::NAN)),
((f32::INFINITY, -1.0), (f32::NAN, f32::NAN)),
((f32::INFINITY, 0.5), (f32::NAN, f32::NAN)),
((f32::INFINITY, -2.0), (f32::NAN, f32::NAN)),
((f32::INFINITY, 3.0), (f32::NAN, f32::NAN)),
((f32::NEG_INFINITY, f32::NAN), (f32::NAN, f32::NAN)),
(
(f32::NEG_INFINITY, f32::INFINITY),
(f32::INFINITY, f32::NAN),
),
(
(f32::NEG_INFINITY, f32::NEG_INFINITY),
(f32::INFINITY, f32::NAN),
),
((f32::NEG_INFINITY, 0.0), (f32::NAN, -0.0)),
((f32::NEG_INFINITY, -0.0), (f32::NAN, -0.0)),
((f32::NEG_INFINITY, 1.0), (f32::NAN, f32::NAN)),
((f32::NEG_INFINITY, -1.0), (f32::NAN, f32::NAN)),
((f32::NEG_INFINITY, 0.5), (f32::NAN, f32::NAN)),
((f32::NEG_INFINITY, -2.0), (f32::NAN, f32::NAN)),
((f32::NEG_INFINITY, 3.0), (f32::NAN, f32::NAN)),
((0.0, f32::NAN), (f32::NAN, 0.0)),
((0.0, f32::INFINITY), (f32::INFINITY, -0.0)),
((0.0, f32::NEG_INFINITY), (f32::INFINITY, 0.0)),
((0.0, 0.0), (1.0, -0.0)),
((0.0, -0.0), (1.0, 0.0)),
((0.0, 1.0), (1.5430806, -0.0)),
((0.0, -1.0), (1.5430806, 0.0)),
((0.0, 0.5), (1.127626, -0.0)),
((0.0, -2.0), (3.7621958, 0.0)),
((0.0, 3.0), (10.067662, -0.0)),
((-0.0, f32::NAN), (f32::NAN, -0.0)),
((-0.0, f32::INFINITY), (f32::INFINITY, 0.0)),
((-0.0, f32::NEG_INFINITY), (f32::INFINITY, -0.0)),
((-0.0, 0.0), (1.0, 0.0)),
((-0.0, -0.0), (1.0, -0.0)),
((-0.0, 1.0), (1.5430806, 0.0)),
((-0.0, -1.0), (1.5430806, -0.0)),
((-0.0, 0.5), (1.127626, 0.0)),
((-0.0, -2.0), (3.7621958, -0.0)),
((-0.0, 3.0), (10.067662, 0.0)),
((1.0, f32::NAN), (f32::NAN, f32::NAN)),
((1.0, f32::INFINITY), (f32::INFINITY, f32::INFINITY)),
((1.0, f32::NEG_INFINITY), (f32::INFINITY, f32::INFINITY)),
((1.0, 0.0), (0.5403023, -0.0)),
((1.0, -0.0), (0.5403023, 0.0)),
((1.0, 1.0), (0.8337299, -0.9888977)),
((1.0, -1.0), (0.8337299, 0.9888977)),
((1.0, 0.5), (0.6092589, -0.43848658)),
((1.0, -2.0), (2.032723, 3.0518978)),
((1.0, 3.0), (5.439581, -8.42975)),
((-1.0, f32::NAN), (f32::NAN, f32::NAN)),
((-1.0, f32::INFINITY), (f32::INFINITY, f32::NEG_INFINITY)),
(
(-1.0, f32::NEG_INFINITY),
(f32::INFINITY, f32::NEG_INFINITY),
),
((-1.0, 0.0), (0.5403023, 0.0)),
((-1.0, -0.0), (0.5403023, -0.0)),
((-1.0, 1.0), (0.8337299, 0.9888977)),
((-1.0, -1.0), (0.8337299, -0.9888977)),
((-1.0, 0.5), (0.6092589, 0.43848658)),
((-1.0, -2.0), (2.032723, -3.0518978)),
((-1.0, 3.0), (5.439581, 8.42975)),
((0.5, f32::NAN), (f32::NAN, f32::NAN)),
((0.5, f32::INFINITY), (f32::INFINITY, f32::INFINITY)),
((0.5, f32::NEG_INFINITY), (f32::INFINITY, f32::INFINITY)),
((0.5, 0.0), (0.87758255, -0.0)),
((0.5, -0.0), (0.87758255, 0.0)),
((0.5, 1.0), (1.3541806, -0.5634215)),
((0.5, -1.0), (1.3541806, 0.5634215)),
((0.5, 0.5), (0.98958486, -0.24982642)),
((0.5, -2.0), (3.3016374, 1.7388096)),
((0.5, 3.0), (8.835205, -4.802825)),
((-2.0, f32::NAN), (f32::NAN, f32::NAN)),
(
(-2.0, f32::INFINITY),
(f32::NEG_INFINITY, f32::NEG_INFINITY),
),
(
(-2.0, f32::NEG_INFINITY),
(f32::NEG_INFINITY, f32::NEG_INFINITY),
),
((-2.0, 0.0), (-0.41614684, 0.0)),
((-2.0, -0.0), (-0.41614684, -0.0)),
((-2.0, 1.0), (-0.64214814, 1.0686073)),
((-2.0, -1.0), (-0.64214814, -1.0686073)),
((-2.0, 0.5), (-0.46925798, 0.47383064)),
((-2.0, -2.0), (-1.5656259, -3.2978947)),
((-2.0, 3.0), (-4.1896257, 9.109227)),
((3.0, f32::NAN), (f32::NAN, f32::NAN)),
((3.0, f32::INFINITY), (f32::NEG_INFINITY, f32::INFINITY)),
((3.0, f32::NEG_INFINITY), (f32::NEG_INFINITY, f32::INFINITY)),
((3.0, 0.0), (-0.9899925, -0.0)),
((3.0, -0.0), (-0.9899925, 0.0)),
((3.0, 1.0), (-1.5276382, -0.1658444)),
((3.0, -1.0), (-1.5276382, 0.1658444)),
((3.0, 0.5), (-1.1163412, -0.07353698)),
((3.0, -2.0), (-3.7245457, 0.5118225)),
((3.0, 3.0), (-9.96691, -1.4137225)),
((1.0, 2.0), (2.032723, -3.0518978)),
((-3.0, 0.5), (-1.1163412, 0.07353698)),
((1e-05, 1e-05), (1.0, -9.9999994e-11)),
((25.0, 0.0), (0.99120283, 0.0)),
((0.0, 30.0), (5.343237e+12, -0.0)),
((22.5, -3.0), (-8.792136, -4.880453)),
((10.0, 100000.0), (f32::NEG_INFINITY, f32::INFINITY)),
((700.0, 1.0), (-1.2948056, -0.6392748)),
((710.0, 1.0), (1.5430806, -7.085136e-05)),
((750.0, 2.0), (-2.5093207, -2.7022755)),
((-750.0, 2.0), (-2.5093207, 2.7022755)),
((0.0, 0.0), (1.0, -0.0)),
((0.0, 0.0), (1.0, -0.0)),
((-4.0, 0.0), (-0.6536436, -0.0)),
((-4.0, 0.0), (-0.6536436, -0.0)),
((-4.0, 0.0), (-0.6536436, -0.0)),
((-4.0, -0.0), (-0.6536436, 0.0)),
((0.5, 1e-10), (0.87758255, -4.7942556e-11)),
((1.0, 1e-10), (0.5403023, -8.41471e-11)),
((1.0, -1e-10), (0.5403023, 8.41471e-11)),
((0.999999, 0.001), (0.5403034, -0.00084147067)),
((3.0, 4.0), (-27.034945, -3.8511531)),
((-1.0, 0.0), (0.5403023, 0.0)),
((2.0, -2.0), (-1.5656259, 3.2978947)),
((8.5, 0.1), (-0.6050245, -0.07998186)),
((-9.0, 40.0), (-1.0723332e+17, 4.850331e+16)),
((12.0, 200.0), (f32::INFINITY, f32::INFINITY)),
((-0.3, -0.4), (1.0327879, -0.12138562)),
((1e+08, 1e+08), (f32::NEG_INFINITY, f32::NEG_INFINITY)),
((100.0, 0.5), (0.9723731, 0.2638648)),
((-100.0, -0.5), (0.9723731, 0.2638648)),
((0.1, 0.1), (0.9999834, -0.0099999895)),
((709.5, 0.5), (0.98961747, 0.24979883)),
((709.9, 1.5707964), (2.4966645, 0.2295526)),
((0.0, 2.0), (3.7621958, -0.0)),
((0.0, -2.0), (3.7621958, 0.0)),
((-0.0, -2.0), (3.7621958, -0.0)),
];
for &((re, im), want) in CASES {
let z = Complex::new(re, im);
check_c(
"cos",
&format!("{z:?}"),
z.cos(),
want,
2e-4,
!finite_input(z),
);
}
}
#[test]
fn complex_tan_f32() {
let _report = Report;
const CASES: &[((f32, f32), (f32, f32))] = &[
((f32::NAN, f32::NAN), (f32::NAN, f32::NAN)),
((f32::NAN, f32::INFINITY), (0.0, 1.0)),
((f32::NAN, f32::NEG_INFINITY), (0.0, -1.0)),
((f32::NAN, 0.0), (f32::NAN, f32::NAN)),
((f32::NAN, -0.0), (f32::NAN, f32::NAN)),
((f32::NAN, 1.0), (f32::NAN, f32::NAN)),
((f32::NAN, -1.0), (f32::NAN, f32::NAN)),
((f32::NAN, 0.5), (f32::NAN, f32::NAN)),
((f32::NAN, -2.0), (f32::NAN, f32::NAN)),
((f32::NAN, 3.0), (f32::NAN, f32::NAN)),
((f32::INFINITY, f32::NAN), (f32::NAN, f32::NAN)),
((f32::INFINITY, f32::INFINITY), (0.0, 1.0)),
((f32::INFINITY, f32::NEG_INFINITY), (0.0, -1.0)),
((f32::INFINITY, 0.0), (f32::NAN, f32::NAN)),
((f32::INFINITY, -0.0), (f32::NAN, f32::NAN)),
((f32::INFINITY, 1.0), (f32::NAN, f32::NAN)),
((f32::INFINITY, -1.0), (f32::NAN, f32::NAN)),
((f32::INFINITY, 0.5), (f32::NAN, f32::NAN)),
((f32::INFINITY, -2.0), (f32::NAN, f32::NAN)),
((f32::INFINITY, 3.0), (f32::NAN, f32::NAN)),
((f32::NEG_INFINITY, f32::NAN), (f32::NAN, f32::NAN)),
((f32::NEG_INFINITY, f32::INFINITY), (-0.0, 1.0)),
((f32::NEG_INFINITY, f32::NEG_INFINITY), (-0.0, -1.0)),
((f32::NEG_INFINITY, 0.0), (f32::NAN, f32::NAN)),
((f32::NEG_INFINITY, -0.0), (f32::NAN, f32::NAN)),
((f32::NEG_INFINITY, 1.0), (f32::NAN, f32::NAN)),
((f32::NEG_INFINITY, -1.0), (f32::NAN, f32::NAN)),
((f32::NEG_INFINITY, 0.5), (f32::NAN, f32::NAN)),
((f32::NEG_INFINITY, -2.0), (f32::NAN, f32::NAN)),
((f32::NEG_INFINITY, 3.0), (f32::NAN, f32::NAN)),
((0.0, f32::NAN), (0.0, f32::NAN)),
((0.0, f32::INFINITY), (0.0, 1.0)),
((0.0, f32::NEG_INFINITY), (0.0, -1.0)),
((0.0, 0.0), (0.0, 0.0)),
((0.0, -0.0), (0.0, -0.0)),
((0.0, 1.0), (0.0, 0.7615941)),
((0.0, -1.0), (0.0, -0.7615941)),
((0.0, 0.5), (0.0, 0.4621171)),
((0.0, -2.0), (0.0, -0.96402764)),
((0.0, 3.0), (0.0, 0.9950547)),
((-0.0, f32::NAN), (-0.0, f32::NAN)),
((-0.0, f32::INFINITY), (-0.0, 1.0)),
((-0.0, f32::NEG_INFINITY), (-0.0, -1.0)),
((-0.0, 0.0), (-0.0, 0.0)),
((-0.0, -0.0), (-0.0, -0.0)),
((-0.0, 1.0), (-0.0, 0.7615941)),
((-0.0, -1.0), (-0.0, -0.7615941)),
((-0.0, 0.5), (-0.0, 0.4621171)),
((-0.0, -2.0), (-0.0, -0.96402764)),
((-0.0, 3.0), (-0.0, 0.9950547)),
((1.0, f32::NAN), (f32::NAN, f32::NAN)),
((1.0, f32::INFINITY), (0.0, 1.0)),
((1.0, f32::NEG_INFINITY), (0.0, -1.0)),
((1.0, 0.0), (1.5574077, 0.0)),
((1.0, -0.0), (1.5574077, -0.0)),
((1.0, 1.0), (0.2717526, 1.0839233)),
((1.0, -1.0), (0.2717526, -1.0839233)),
((1.0, 0.5), (0.80687743, 1.0428307)),
((1.0, -2.0), (0.033812825, -1.0147936)),
((1.0, 3.0), (0.0045171375, 1.0020549)),
((-1.0, f32::NAN), (f32::NAN, f32::NAN)),
((-1.0, f32::INFINITY), (-0.0, 1.0)),
((-1.0, f32::NEG_INFINITY), (-0.0, -1.0)),
((-1.0, 0.0), (-1.5574077, 0.0)),
((-1.0, -0.0), (-1.5574077, -0.0)),
((-1.0, 1.0), (-0.2717526, 1.0839233)),
((-1.0, -1.0), (-0.2717526, -1.0839233)),
((-1.0, 0.5), (-0.80687743, 1.0428307)),
((-1.0, -2.0), (-0.033812825, -1.0147936)),
((-1.0, 3.0), (-0.0045171375, 1.0020549)),
((0.5, f32::NAN), (f32::NAN, f32::NAN)),
((0.5, f32::INFINITY), (0.0, 1.0)),
((0.5, f32::NEG_INFINITY), (0.0, -1.0)),
((0.5, 0.0), (0.5463025, 0.0)),
((0.5, -0.0), (0.5463025, -0.0)),
((0.5, 1.0), (0.19557731, 0.8429662)),
((0.5, -1.0), (0.19557731, -0.8429662)),
((0.5, 0.5), (0.40389645, 0.5640831)),
((0.5, -2.0), (0.03021599, -0.9799409)),
((0.5, 3.0), (0.004160427, 0.99731636)),
((-2.0, f32::NAN), (f32::NAN, f32::NAN)),
((-2.0, f32::INFINITY), (-0.0, 1.0)),
((-2.0, f32::NEG_INFINITY), (-0.0, -1.0)),
((-2.0, 0.0), (2.1850398, 0.0)),
((-2.0, -0.0), (2.1850398, -0.0)),
((-2.0, 1.0), (0.2434582, 1.1667362)),
((-2.0, -1.0), (0.2434582, -1.1667362)),
((-2.0, 0.5), (0.8508782, 1.3212866)),
((-2.0, -2.0), (0.028392954, -1.0238357)),
((-2.0, 3.0), (0.0037640259, 1.0032386)),
((3.0, f32::NAN), (f32::NAN, f32::NAN)),
((3.0, f32::INFINITY), (0.0, 1.0)),
((3.0, f32::NEG_INFINITY), (0.0, -1.0)),
((3.0, 0.0), (-0.14254655, 0.0)),
((3.0, -0.0), (-0.14254655, -0.0)),
((3.0, 1.0), (-0.059168544, 0.76801753)),
((3.0, -1.0), (-0.059168544, -0.76801753)),
((3.0, 0.5), (-0.11162105, 0.4694699)),
((3.0, -2.0), (-0.009884376, -0.9653859)),
((3.0, 3.0), (-0.0013786328, 0.9952502)),
((1.0, 2.0), (0.033812825, 1.0147936)),
((-3.0, 0.5), (0.11162105, 0.4694699)),
((1e-05, 1e-05), (1e-05, 1e-05)),
((25.0, 0.0), (-0.1335264, 0.0)),
((0.0, 30.0), (0.0, 1.0)),
((22.5, -3.0), (0.0042073745, -0.99739015)),
((10.0, 100000.0), (0.0, 1.0)),
((700.0, 1.0), (-0.21889956, 0.8696698)),
((710.0, 1.0), (2.531971e-05, 0.7615941)),
((750.0, 2.0), (-0.036543246, 1.0033809)),
((-750.0, 2.0), (0.036543246, 1.0033809)),
((0.0, 0.0), (0.0, 0.0)),
((0.0, 0.0), (0.0, 0.0)),
((-4.0, 0.0), (-1.1578213, 0.0)),
((-4.0, 0.0), (-1.1578213, 0.0)),
((-4.0, 0.0), (-1.1578213, 0.0)),
((-4.0, -0.0), (-1.1578213, -0.0)),
((0.5, 1e-10), (0.5463025, 1.2984465e-10)),
((1.0, 1e-10), (1.5574077, 3.4255188e-10)),
((1.0, -1e-10), (1.5574077, -3.4255188e-10)),
((0.999999, 0.001), (1.5573989, 0.0034254983)),
((3.0, 4.0), (-0.00018734623, 0.99935603)),
((-1.0, 0.0), (-1.5574077, 0.0)),
((2.0, -2.0), (-0.028392954, -1.0238357)),
((8.5, 0.1), (-1.2906337, 0.27028468)),
((-9.0, 40.0), (2.7108404e-35, 1.0)),
((12.0, 200.0), (-0.0, 1.0)),
((-0.3, -0.4), (-0.2610737, -0.41063347)),
((1e+08, 1e+08), (-0.0, 1.0)),
((100.0, 0.5), (-0.4301389, 0.5788404)),
((-100.0, -0.5), (0.4301389, -0.5788404)),
((0.1, 0.1), (0.09932805, 0.10066131)),
((709.5, 0.5), (-0.40384555, 0.5640557)),
((709.9, 1.5707964), (-0.015789246, 0.918604)),
((0.0, 2.0), (0.0, 0.96402764)),
((0.0, -2.0), (0.0, -0.96402764)),
((-0.0, -2.0), (-0.0, -0.96402764)),
];
for &((re, im), want) in CASES {
let z = Complex::new(re, im);
check_c(
"tan",
&format!("{z:?}"),
z.tan(),
want,
2e-4,
!finite_input(z),
);
}
}
#[test]
fn complex_sinh_f32() {
let _report = Report;
const CASES: &[((f32, f32), (f32, f32))] = &[
((f32::NAN, f32::NAN), (f32::NAN, f32::NAN)),
((f32::NAN, f32::INFINITY), (f32::NAN, f32::NAN)),
((f32::NAN, f32::NEG_INFINITY), (f32::NAN, f32::NAN)),
((f32::NAN, 0.0), (f32::NAN, 0.0)),
((f32::NAN, -0.0), (f32::NAN, -0.0)),
((f32::NAN, 1.0), (f32::NAN, f32::NAN)),
((f32::NAN, -1.0), (f32::NAN, f32::NAN)),
((f32::NAN, 0.5), (f32::NAN, f32::NAN)),
((f32::NAN, -2.0), (f32::NAN, f32::NAN)),
((f32::NAN, 3.0), (f32::NAN, f32::NAN)),
((f32::INFINITY, f32::NAN), (f32::INFINITY, f32::NAN)),
((f32::INFINITY, f32::INFINITY), (f32::INFINITY, f32::NAN)),
(
(f32::INFINITY, f32::NEG_INFINITY),
(f32::INFINITY, f32::NAN),
),
((f32::INFINITY, 0.0), (f32::INFINITY, 0.0)),
((f32::INFINITY, -0.0), (f32::INFINITY, -0.0)),
((f32::INFINITY, 1.0), (f32::INFINITY, f32::INFINITY)),
((f32::INFINITY, -1.0), (f32::INFINITY, f32::NEG_INFINITY)),
((f32::INFINITY, 0.5), (f32::INFINITY, f32::INFINITY)),
(
(f32::INFINITY, -2.0),
(f32::NEG_INFINITY, f32::NEG_INFINITY),
),
((f32::INFINITY, 3.0), (f32::NEG_INFINITY, f32::INFINITY)),
((f32::NEG_INFINITY, f32::NAN), (f32::NEG_INFINITY, f32::NAN)),
(
(f32::NEG_INFINITY, f32::INFINITY),
(f32::NEG_INFINITY, f32::NAN),
),
(
(f32::NEG_INFINITY, f32::NEG_INFINITY),
(f32::NEG_INFINITY, f32::NAN),
),
((f32::NEG_INFINITY, 0.0), (f32::NEG_INFINITY, 0.0)),
((f32::NEG_INFINITY, -0.0), (f32::NEG_INFINITY, -0.0)),
((f32::NEG_INFINITY, 1.0), (f32::NEG_INFINITY, f32::INFINITY)),
(
(f32::NEG_INFINITY, -1.0),
(f32::NEG_INFINITY, f32::NEG_INFINITY),
),
((f32::NEG_INFINITY, 0.5), (f32::NEG_INFINITY, f32::INFINITY)),
(
(f32::NEG_INFINITY, -2.0),
(f32::INFINITY, f32::NEG_INFINITY),
),
((f32::NEG_INFINITY, 3.0), (f32::INFINITY, f32::INFINITY)),
((0.0, f32::NAN), (0.0, f32::NAN)),
((0.0, f32::INFINITY), (0.0, f32::NAN)),
((0.0, f32::NEG_INFINITY), (0.0, f32::NAN)),
((0.0, 0.0), (0.0, 0.0)),
((0.0, -0.0), (0.0, -0.0)),
((0.0, 1.0), (0.0, 0.84147096)),
((0.0, -1.0), (0.0, -0.84147096)),
((0.0, 0.5), (0.0, 0.47942555)),
((0.0, -2.0), (-0.0, -0.9092974)),
((0.0, 3.0), (-0.0, 0.14112)),
((-0.0, f32::NAN), (-0.0, f32::NAN)),
((-0.0, f32::INFINITY), (-0.0, f32::NAN)),
((-0.0, f32::NEG_INFINITY), (-0.0, f32::NAN)),
((-0.0, 0.0), (-0.0, 0.0)),
((-0.0, -0.0), (-0.0, -0.0)),
((-0.0, 1.0), (-0.0, 0.84147096)),
((-0.0, -1.0), (-0.0, -0.84147096)),
((-0.0, 0.5), (-0.0, 0.47942555)),
((-0.0, -2.0), (0.0, -0.9092974)),
((-0.0, 3.0), (0.0, 0.14112)),
((1.0, f32::NAN), (f32::NAN, f32::NAN)),
((1.0, f32::INFINITY), (f32::NAN, f32::NAN)),
((1.0, f32::NEG_INFINITY), (f32::NAN, f32::NAN)),
((1.0, 0.0), (1.1752012, 0.0)),
((1.0, -0.0), (1.1752012, -0.0)),
((1.0, 1.0), (0.63496387, 1.2984575)),
((1.0, -1.0), (0.63496387, -1.2984575)),
((1.0, 0.5), (1.0313361, 0.7397922)),
((1.0, -2.0), (-0.48905626, -1.4031192)),
((1.0, 3.0), (-1.1634403, 0.21775953)),
((-1.0, f32::NAN), (f32::NAN, f32::NAN)),
((-1.0, f32::INFINITY), (f32::NAN, f32::NAN)),
((-1.0, f32::NEG_INFINITY), (f32::NAN, f32::NAN)),
((-1.0, 0.0), (-1.1752012, 0.0)),
((-1.0, -0.0), (-1.1752012, -0.0)),
((-1.0, 1.0), (-0.63496387, 1.2984575)),
((-1.0, -1.0), (-0.63496387, -1.2984575)),
((-1.0, 0.5), (-1.0313361, 0.7397922)),
((-1.0, -2.0), (0.48905626, -1.4031192)),
((-1.0, 3.0), (1.1634403, 0.21775953)),
((0.5, f32::NAN), (f32::NAN, f32::NAN)),
((0.5, f32::INFINITY), (f32::NAN, f32::NAN)),
((0.5, f32::NEG_INFINITY), (f32::NAN, f32::NAN)),
((0.5, 0.0), (0.52109534, 0.0)),
((0.5, -0.0), (0.52109534, -0.0)),
((0.5, 1.0), (0.281549, 0.94886446)),
((0.5, -1.0), (0.281549, -0.94886446)),
((0.5, 0.5), (0.45730418, 0.5406127)),
((0.5, -2.0), (-0.21685217, -1.0253474)),
((0.5, 3.0), (-0.51588047, 0.15913057)),
((-2.0, f32::NAN), (f32::NAN, f32::NAN)),
((-2.0, f32::INFINITY), (f32::NAN, f32::NAN)),
((-2.0, f32::NEG_INFINITY), (f32::NAN, f32::NAN)),
((-2.0, 0.0), (-3.6268604, 0.0)),
((-2.0, -0.0), (-3.6268604, -0.0)),
((-2.0, 1.0), (-1.9596009, 3.1657786)),
((-2.0, -1.0), (-1.9596009, -3.1657786)),
((-2.0, 0.5), (-3.1828694, 1.8036928)),
((-2.0, -2.0), (1.5093066, -3.420955)),
((-2.0, 3.0), (3.5905645, 0.5309211)),
((3.0, f32::NAN), (f32::NAN, f32::NAN)),
((3.0, f32::INFINITY), (f32::NAN, f32::NAN)),
((3.0, f32::NEG_INFINITY), (f32::NAN, f32::NAN)),
((3.0, 0.0), (10.017875, 0.0)),
((3.0, -0.0), (10.017875, -0.0)),
((3.0, 1.0), (5.4126806, 8.471645)),
((3.0, -1.0), (5.4126806, -8.471645)),
((3.0, 0.5), (8.7915125, 4.8266945)),
((3.0, -2.0), (-4.168907, -9.154499)),
((3.0, 3.0), (-9.917621, 1.4207485)),
((1.0, 2.0), (-0.48905626, 1.4031192)),
((-3.0, 0.5), (-8.7915125, 4.8266945)),
((1e-05, 1e-05), (1e-05, 1e-05)),
((25.0, 0.0), (3.600245e+10, 0.0)),
((0.0, 30.0), (0.0, -0.9880316)),
((22.5, -3.0), (-2.9256863e+09, -4.1704643e+08)),
((10.0, 100000.0), (-11006.192, 393.70984)),
((700.0, 1.0), (f32::INFINITY, f32::INFINITY)),
((750.0, 2.0), (f32::NEG_INFINITY, f32::INFINITY)),
((-750.0, 2.0), (f32::INFINITY, f32::INFINITY)),
((0.0, 0.0), (0.0, 0.0)),
((0.0, 0.0), (0.0, 0.0)),
((-4.0, 0.0), (-27.289917, 0.0)),
((-4.0, 0.0), (-27.289917, 0.0)),
((-4.0, 0.0), (-27.289917, 0.0)),
((-4.0, -0.0), (-27.289917, -0.0)),
((0.5, 1e-10), (0.52109534, 1.127626e-10)),
((1.0, 1e-10), (1.1752012, 1.5430805e-10)),
((1.0, -1e-10), (1.1752012, -1.5430805e-10)),
((0.999999, 0.001), (1.175199, 0.0015430794)),
((3.0, 4.0), (-6.5481195, -7.619232)),
((-1.0, 0.0), (-1.1752012, 0.0)),
((2.0, -2.0), (-1.5093066, -3.420955)),
((8.5, 0.1), (2445.108, 245.3291)),
((-9.0, 40.0), (2702.1277, 3018.8572)),
((12.0, 200.0), (39646.066, -71066.664)),
((-0.3, -0.4), (-0.2804818, -0.40707397)),
((1e+08, 1e+08), (f32::NEG_INFINITY, f32::INFINITY)),
((100.0, 0.5), (f32::INFINITY, f32::INFINITY)),
((-100.0, -0.5), (f32::NEG_INFINITY, f32::NEG_INFINITY)),
((0.1, 0.1), (0.099666335, 0.100333005)),
((709.5, 0.5), (f32::INFINITY, f32::INFINITY)),
((0.0, 2.0), (-0.0, 0.9092974)),
((0.0, -2.0), (-0.0, -0.9092974)),
((-0.0, -2.0), (0.0, -0.9092974)),
];
for &((re, im), want) in CASES {
let z = Complex::new(re, im);
check_c(
"sinh",
&format!("{z:?}"),
z.sinh(),
want,
2e-4,
!finite_input(z),
);
}
}
#[test]
fn complex_cosh_f32() {
let _report = Report;
const CASES: &[((f32, f32), (f32, f32))] = &[
((f32::NAN, f32::NAN), (f32::NAN, f32::NAN)),
((f32::NAN, f32::INFINITY), (f32::NAN, f32::NAN)),
((f32::NAN, f32::NEG_INFINITY), (f32::NAN, f32::NAN)),
((f32::NAN, 0.0), (f32::NAN, 0.0)),
((f32::NAN, -0.0), (f32::NAN, -0.0)),
((f32::NAN, 1.0), (f32::NAN, f32::NAN)),
((f32::NAN, -1.0), (f32::NAN, f32::NAN)),
((f32::NAN, 0.5), (f32::NAN, f32::NAN)),
((f32::NAN, -2.0), (f32::NAN, f32::NAN)),
((f32::NAN, 3.0), (f32::NAN, f32::NAN)),
((f32::INFINITY, f32::NAN), (f32::INFINITY, f32::NAN)),
((f32::INFINITY, f32::INFINITY), (f32::INFINITY, f32::NAN)),
(
(f32::INFINITY, f32::NEG_INFINITY),
(f32::INFINITY, f32::NAN),
),
((f32::INFINITY, 0.0), (f32::INFINITY, 0.0)),
((f32::INFINITY, -0.0), (f32::INFINITY, -0.0)),
((f32::INFINITY, 1.0), (f32::INFINITY, f32::INFINITY)),
((f32::INFINITY, -1.0), (f32::INFINITY, f32::NEG_INFINITY)),
((f32::INFINITY, 0.5), (f32::INFINITY, f32::INFINITY)),
(
(f32::INFINITY, -2.0),
(f32::NEG_INFINITY, f32::NEG_INFINITY),
),
((f32::INFINITY, 3.0), (f32::NEG_INFINITY, f32::INFINITY)),
((f32::NEG_INFINITY, f32::NAN), (f32::INFINITY, f32::NAN)),
(
(f32::NEG_INFINITY, f32::INFINITY),
(f32::INFINITY, f32::NAN),
),
(
(f32::NEG_INFINITY, f32::NEG_INFINITY),
(f32::INFINITY, f32::NAN),
),
((f32::NEG_INFINITY, 0.0), (f32::INFINITY, -0.0)),
((f32::NEG_INFINITY, -0.0), (f32::INFINITY, 0.0)),
((f32::NEG_INFINITY, 1.0), (f32::INFINITY, f32::INFINITY)),
(
(f32::NEG_INFINITY, -1.0),
(f32::INFINITY, f32::NEG_INFINITY),
),
((f32::NEG_INFINITY, 0.5), (f32::INFINITY, f32::INFINITY)),
(
(f32::NEG_INFINITY, -2.0),
(f32::NEG_INFINITY, f32::NEG_INFINITY),
),
((f32::NEG_INFINITY, 3.0), (f32::NEG_INFINITY, f32::INFINITY)),
((0.0, f32::NAN), (f32::NAN, 0.0)),
((0.0, f32::INFINITY), (f32::NAN, 0.0)),
((0.0, f32::NEG_INFINITY), (f32::NAN, -0.0)),
((0.0, 0.0), (1.0, 0.0)),
((0.0, -0.0), (1.0, -0.0)),
((0.0, 1.0), (0.5403023, 0.0)),
((0.0, -1.0), (0.5403023, -0.0)),
((0.0, 0.5), (0.87758255, 0.0)),
((0.0, -2.0), (-0.41614684, -0.0)),
((0.0, 3.0), (-0.9899925, 0.0)),
((-0.0, f32::NAN), (f32::NAN, -0.0)),
((-0.0, f32::INFINITY), (f32::NAN, 0.0)),
((-0.0, f32::NEG_INFINITY), (f32::NAN, -0.0)),
((-0.0, 0.0), (1.0, -0.0)),
((-0.0, -0.0), (1.0, 0.0)),
((-0.0, 1.0), (0.5403023, -0.0)),
((-0.0, -1.0), (0.5403023, 0.0)),
((-0.0, 0.5), (0.87758255, -0.0)),
((-0.0, -2.0), (-0.41614684, 0.0)),
((-0.0, 3.0), (-0.9899925, -0.0)),
((1.0, f32::NAN), (f32::NAN, f32::NAN)),
((1.0, f32::INFINITY), (f32::NAN, f32::NAN)),
((1.0, f32::NEG_INFINITY), (f32::NAN, f32::NAN)),
((1.0, 0.0), (1.5430806, 0.0)),
((1.0, -0.0), (1.5430806, -0.0)),
((1.0, 1.0), (0.8337299, 0.9888977)),
((1.0, -1.0), (0.8337299, -0.9888977)),
((1.0, 0.5), (1.3541806, 0.5634215)),
((1.0, -2.0), (-0.64214814, -1.0686073)),
((1.0, 3.0), (-1.5276382, 0.1658444)),
((-1.0, f32::NAN), (f32::NAN, f32::NAN)),
((-1.0, f32::INFINITY), (f32::NAN, f32::NAN)),
((-1.0, f32::NEG_INFINITY), (f32::NAN, f32::NAN)),
((-1.0, 0.0), (1.5430806, -0.0)),
((-1.0, -0.0), (1.5430806, 0.0)),
((-1.0, 1.0), (0.8337299, -0.9888977)),
((-1.0, -1.0), (0.8337299, 0.9888977)),
((-1.0, 0.5), (1.3541806, -0.5634215)),
((-1.0, -2.0), (-0.64214814, 1.0686073)),
((-1.0, 3.0), (-1.5276382, -0.1658444)),
((0.5, f32::NAN), (f32::NAN, f32::NAN)),
((0.5, f32::INFINITY), (f32::NAN, f32::NAN)),
((0.5, f32::NEG_INFINITY), (f32::NAN, f32::NAN)),
((0.5, 0.0), (1.127626, 0.0)),
((0.5, -0.0), (1.127626, -0.0)),
((0.5, 1.0), (0.6092589, 0.43848658)),
((0.5, -1.0), (0.6092589, -0.43848658)),
((0.5, 0.5), (0.98958486, 0.24982642)),
((0.5, -2.0), (-0.46925798, -0.47383064)),
((0.5, 3.0), (-1.1163412, 0.07353698)),
((-2.0, f32::NAN), (f32::NAN, f32::NAN)),
((-2.0, f32::INFINITY), (f32::NAN, f32::NAN)),
((-2.0, f32::NEG_INFINITY), (f32::NAN, f32::NAN)),
((-2.0, 0.0), (3.7621958, -0.0)),
((-2.0, -0.0), (3.7621958, 0.0)),
((-2.0, 1.0), (2.032723, -3.0518978)),
((-2.0, -1.0), (2.032723, 3.0518978)),
((-2.0, 0.5), (3.3016374, -1.7388096)),
((-2.0, -2.0), (-1.5656259, 3.2978947)),
((-2.0, 3.0), (-3.7245457, -0.5118225)),
((3.0, f32::NAN), (f32::NAN, f32::NAN)),
((3.0, f32::INFINITY), (f32::NAN, f32::NAN)),
((3.0, f32::NEG_INFINITY), (f32::NAN, f32::NAN)),
((3.0, 0.0), (10.067662, 0.0)),
((3.0, -0.0), (10.067662, -0.0)),
((3.0, 1.0), (5.439581, 8.42975)),
((3.0, -1.0), (5.439581, -8.42975)),
((3.0, 0.5), (8.835205, 4.802825)),
((3.0, -2.0), (-4.1896257, -9.109227)),
((3.0, 3.0), (-9.96691, 1.4137225)),
((1.0, 2.0), (-0.64214814, 1.0686073)),
((-3.0, 0.5), (8.835205, -4.802825)),
((1e-05, 1e-05), (1.0, 9.9999994e-11)),
((25.0, 0.0), (3.600245e+10, 0.0)),
((0.0, 30.0), (0.15425146, -0.0)),
((22.5, -3.0), (-2.9256863e+09, -4.1704643e+08)),
((10.0, 100000.0), (-11006.192, 393.70984)),
((700.0, 1.0), (f32::INFINITY, f32::INFINITY)),
((750.0, 2.0), (f32::NEG_INFINITY, f32::INFINITY)),
((-750.0, 2.0), (f32::NEG_INFINITY, f32::NEG_INFINITY)),
((0.0, 0.0), (1.0, 0.0)),
((0.0, 0.0), (1.0, 0.0)),
((-4.0, 0.0), (27.308231, -0.0)),
((-4.0, 0.0), (27.308231, -0.0)),
((-4.0, 0.0), (27.308231, -0.0)),
((-4.0, -0.0), (27.308231, 0.0)),
((0.5, 1e-10), (1.127626, 5.2109535e-11)),
((1.0, 1e-10), (1.5430806, 1.1752012e-10)),
((1.0, -1e-10), (1.5430806, -1.1752012e-10)),
((0.999999, 0.001), (1.5430788, 0.0011751995)),
((3.0, 4.0), (-6.580663, -7.5815525)),
((-1.0, 0.0), (1.5430806, -0.0)),
((2.0, -2.0), (-1.5656259, -3.2978947)),
((8.5, 0.1), (2445.108, 245.3291)),
((-9.0, 40.0), (-2702.1277, -3018.8572)),
((12.0, 200.0), (39646.066, -71066.664)),
((-0.3, -0.4), (0.96282053, 0.11858579)),
((1e+08, 1e+08), (f32::NEG_INFINITY, f32::INFINITY)),
((100.0, 0.5), (f32::INFINITY, f32::INFINITY)),
((-100.0, -0.5), (f32::INFINITY, f32::INFINITY)),
((0.1, 0.1), (0.9999834, 0.0099999895)),
((709.5, 0.5), (f32::INFINITY, f32::INFINITY)),
((0.0, 2.0), (-0.41614684, 0.0)),
((0.0, -2.0), (-0.41614684, -0.0)),
((-0.0, -2.0), (-0.41614684, 0.0)),
];
for &((re, im), want) in CASES {
let z = Complex::new(re, im);
check_c(
"cosh",
&format!("{z:?}"),
z.cosh(),
want,
2e-4,
!finite_input(z),
);
}
}
#[test]
fn complex_tanh_f32() {
let _report = Report;
const CASES: &[((f32, f32), (f32, f32))] = &[
((f32::NAN, f32::NAN), (f32::NAN, f32::NAN)),
((f32::NAN, f32::INFINITY), (f32::NAN, f32::NAN)),
((f32::NAN, f32::NEG_INFINITY), (f32::NAN, f32::NAN)),
((f32::NAN, 0.0), (f32::NAN, 0.0)),
((f32::NAN, -0.0), (f32::NAN, -0.0)),
((f32::NAN, 1.0), (f32::NAN, f32::NAN)),
((f32::NAN, -1.0), (f32::NAN, f32::NAN)),
((f32::NAN, 0.5), (f32::NAN, f32::NAN)),
((f32::NAN, -2.0), (f32::NAN, f32::NAN)),
((f32::NAN, 3.0), (f32::NAN, f32::NAN)),
((f32::INFINITY, f32::NAN), (1.0, 0.0)),
((f32::INFINITY, f32::INFINITY), (1.0, 0.0)),
((f32::INFINITY, f32::NEG_INFINITY), (1.0, -0.0)),
((f32::INFINITY, 0.0), (1.0, 0.0)),
((f32::INFINITY, -0.0), (1.0, -0.0)),
((f32::INFINITY, 1.0), (1.0, 0.0)),
((f32::INFINITY, -1.0), (1.0, -0.0)),
((f32::INFINITY, 0.5), (1.0, 0.0)),
((f32::INFINITY, -2.0), (1.0, -0.0)),
((f32::INFINITY, 3.0), (1.0, 0.0)),
((f32::NEG_INFINITY, f32::NAN), (-1.0, 0.0)),
((f32::NEG_INFINITY, f32::INFINITY), (-1.0, 0.0)),
((f32::NEG_INFINITY, f32::NEG_INFINITY), (-1.0, -0.0)),
((f32::NEG_INFINITY, 0.0), (-1.0, 0.0)),
((f32::NEG_INFINITY, -0.0), (-1.0, -0.0)),
((f32::NEG_INFINITY, 1.0), (-1.0, 0.0)),
((f32::NEG_INFINITY, -1.0), (-1.0, -0.0)),
((f32::NEG_INFINITY, 0.5), (-1.0, 0.0)),
((f32::NEG_INFINITY, -2.0), (-1.0, -0.0)),
((f32::NEG_INFINITY, 3.0), (-1.0, 0.0)),
((0.0, f32::NAN), (f32::NAN, f32::NAN)),
((0.0, f32::INFINITY), (f32::NAN, f32::NAN)),
((0.0, f32::NEG_INFINITY), (f32::NAN, f32::NAN)),
((0.0, 0.0), (0.0, 0.0)),
((0.0, -0.0), (0.0, -0.0)),
((0.0, 1.0), (0.0, 1.5574077)),
((0.0, -1.0), (0.0, -1.5574077)),
((0.0, 0.5), (0.0, 0.5463025)),
((0.0, -2.0), (0.0, 2.1850398)),
((0.0, 3.0), (0.0, -0.14254655)),
((-0.0, f32::NAN), (f32::NAN, f32::NAN)),
((-0.0, f32::INFINITY), (f32::NAN, f32::NAN)),
((-0.0, f32::NEG_INFINITY), (f32::NAN, f32::NAN)),
((-0.0, 0.0), (-0.0, 0.0)),
((-0.0, -0.0), (-0.0, -0.0)),
((-0.0, 1.0), (-0.0, 1.5574077)),
((-0.0, -1.0), (-0.0, -1.5574077)),
((-0.0, 0.5), (-0.0, 0.5463025)),
((-0.0, -2.0), (-0.0, 2.1850398)),
((-0.0, 3.0), (-0.0, -0.14254655)),
((1.0, f32::NAN), (f32::NAN, f32::NAN)),
((1.0, f32::INFINITY), (f32::NAN, f32::NAN)),
((1.0, f32::NEG_INFINITY), (f32::NAN, f32::NAN)),
((1.0, 0.0), (0.7615941, 0.0)),
((1.0, -0.0), (0.7615941, -0.0)),
((1.0, 1.0), (1.0839233, 0.2717526)),
((1.0, -1.0), (1.0839233, -0.2717526)),
((1.0, 0.5), (0.8429662, 0.19557731)),
((1.0, -2.0), (1.1667362, 0.2434582)),
((1.0, 3.0), (0.76801753, -0.059168544)),
((-1.0, f32::NAN), (f32::NAN, f32::NAN)),
((-1.0, f32::INFINITY), (f32::NAN, f32::NAN)),
((-1.0, f32::NEG_INFINITY), (f32::NAN, f32::NAN)),
((-1.0, 0.0), (-0.7615941, 0.0)),
((-1.0, -0.0), (-0.7615941, -0.0)),
((-1.0, 1.0), (-1.0839233, 0.2717526)),
((-1.0, -1.0), (-1.0839233, -0.2717526)),
((-1.0, 0.5), (-0.8429662, 0.19557731)),
((-1.0, -2.0), (-1.1667362, 0.2434582)),
((-1.0, 3.0), (-0.76801753, -0.059168544)),
((0.5, f32::NAN), (f32::NAN, f32::NAN)),
((0.5, f32::INFINITY), (f32::NAN, f32::NAN)),
((0.5, f32::NEG_INFINITY), (f32::NAN, f32::NAN)),
((0.5, 0.0), (0.4621171, 0.0)),
((0.5, -0.0), (0.4621171, -0.0)),
((0.5, 1.0), (1.0428307, 0.80687743)),
((0.5, -1.0), (1.0428307, -0.80687743)),
((0.5, 0.5), (0.5640831, 0.40389645)),
((0.5, -2.0), (1.3212866, 0.8508782)),
((0.5, 3.0), (0.4694699, -0.11162105)),
((-2.0, f32::NAN), (f32::NAN, f32::NAN)),
((-2.0, f32::INFINITY), (f32::NAN, f32::NAN)),
((-2.0, f32::NEG_INFINITY), (f32::NAN, f32::NAN)),
((-2.0, 0.0), (-0.96402764, 0.0)),
((-2.0, -0.0), (-0.96402764, -0.0)),
((-2.0, 1.0), (-1.0147936, 0.033812825)),
((-2.0, -1.0), (-1.0147936, -0.033812825)),
((-2.0, 0.5), (-0.9799409, 0.03021599)),
((-2.0, -2.0), (-1.0238357, 0.028392954)),
((-2.0, 3.0), (-0.9653859, -0.009884376)),
((3.0, f32::NAN), (f32::NAN, f32::NAN)),
((3.0, f32::INFINITY), (f32::NAN, f32::NAN)),
((3.0, f32::NEG_INFINITY), (f32::NAN, f32::NAN)),
((3.0, 0.0), (0.9950547, 0.0)),
((3.0, -0.0), (0.9950547, -0.0)),
((3.0, 1.0), (1.0020549, 0.0045171375)),
((3.0, -1.0), (1.0020549, -0.0045171375)),
((3.0, 0.5), (0.99731636, 0.004160427)),
((3.0, -2.0), (1.0032386, 0.0037640259)),
((3.0, 3.0), (0.9952502, -0.0013786328)),
((1.0, 2.0), (1.1667362, -0.2434582)),
((-3.0, 0.5), (-0.99731636, 0.004160427)),
((1e-05, 1e-05), (1e-05, 1e-05)),
((25.0, 0.0), (1.0, 0.0)),
((0.0, 30.0), (0.0, -6.405331)),
((22.5, -3.0), (1.0, 1.5996644e-20)),
((10.0, 100000.0), (1.0, -2.945467e-10)),
((700.0, 1.0), (1.0, 0.0)),
((710.0, 1.0), (1.0, 0.0)),
((750.0, 2.0), (1.0, -0.0)),
((-750.0, 2.0), (-1.0, -0.0)),
((0.0, 0.0), (0.0, 0.0)),
((0.0, 0.0), (0.0, 0.0)),
((-4.0, 0.0), (-0.9993294, 0.0)),
((-4.0, 0.0), (-0.9993294, 0.0)),
((-4.0, 0.0), (-0.9993294, 0.0)),
((-4.0, -0.0), (-0.9993294, -0.0)),
((0.5, 1e-10), (0.4621171, 7.864478e-11)),
((1.0, 1e-10), (0.7615941, 4.1997437e-11)),
((1.0, -1e-10), (0.7615941, -4.1997437e-11)),
((0.999999, 0.001), (0.76159406, 0.00041997494)),
((3.0, 4.0), (1.0007094, 0.004908258)),
((-1.0, 0.0), (-0.7615941, 0.0)),
((2.0, -2.0), (1.0238357, 0.028392954)),
((8.5, 0.1), (1.0, 1.6449572e-08)),
((-9.0, 40.0), (-1.0000001, -3.0273807e-08)),
((12.0, 200.0), (1.0, -6.42467e-11)),
((-0.3, -0.4), (-0.33825472, -0.3811321)),
((1e+08, 1e+08), (1.0, -0.0)),
((100.0, 0.5), (1.0, 0.0)),
((-100.0, -0.5), (-1.0, -0.0)),
((0.1, 0.1), (0.10066131, 0.09932805)),
((709.5, 0.5), (1.0, 0.0)),
((709.9, 1.5707964), (1.0, -0.0)),
((0.0, 2.0), (0.0, -2.1850398)),
((0.0, -2.0), (0.0, 2.1850398)),
((-0.0, -2.0), (-0.0, 2.1850398)),
];
for &((re, im), want) in CASES {
let z = Complex::new(re, im);
check_c(
"tanh",
&format!("{z:?}"),
z.tanh(),
want,
2e-4,
!finite_input(z),
);
}
}
#[test]
fn complex_abs_arg_conj_flags_f64() {
let _report = Report;
const CASES: &[(f64, f64, f64, f64, f64, f64, bool, bool, bool)] = &[
(
f64::NAN,
f64::NAN,
f64::NAN,
f64::NAN,
f64::NAN,
f64::NAN,
true,
false,
false,
),
(
f64::NAN,
f64::INFINITY,
f64::INFINITY,
f64::NAN,
f64::NAN,
f64::NEG_INFINITY,
true,
false,
true,
),
(
f64::NAN,
f64::NEG_INFINITY,
f64::INFINITY,
f64::NAN,
f64::NAN,
f64::INFINITY,
true,
false,
true,
),
(
f64::NAN,
0.0,
f64::NAN,
f64::NAN,
f64::NAN,
-0.0,
true,
false,
false,
),
(
f64::NAN,
-0.0,
f64::NAN,
f64::NAN,
f64::NAN,
0.0,
true,
false,
false,
),
(
f64::NAN,
1.0,
f64::NAN,
f64::NAN,
f64::NAN,
-1.0,
true,
false,
false,
),
(
f64::NAN,
-1.0,
f64::NAN,
f64::NAN,
f64::NAN,
1.0,
true,
false,
false,
),
(
f64::NAN,
0.5,
f64::NAN,
f64::NAN,
f64::NAN,
-0.5,
true,
false,
false,
),
(
f64::NAN,
-2.0,
f64::NAN,
f64::NAN,
f64::NAN,
2.0,
true,
false,
false,
),
(
f64::NAN,
3.0,
f64::NAN,
f64::NAN,
f64::NAN,
-3.0,
true,
false,
false,
),
(
f64::INFINITY,
f64::NAN,
f64::INFINITY,
f64::NAN,
f64::INFINITY,
f64::NAN,
true,
false,
true,
),
(
f64::INFINITY,
f64::INFINITY,
f64::INFINITY,
0.7853981633974483,
f64::INFINITY,
f64::NEG_INFINITY,
false,
false,
true,
),
(
f64::INFINITY,
f64::NEG_INFINITY,
f64::INFINITY,
-0.7853981633974483,
f64::INFINITY,
f64::INFINITY,
false,
false,
true,
),
(
f64::INFINITY,
0.0,
f64::INFINITY,
0.0,
f64::INFINITY,
-0.0,
false,
false,
true,
),
(
f64::INFINITY,
-0.0,
f64::INFINITY,
-0.0,
f64::INFINITY,
0.0,
false,
false,
true,
),
(
f64::INFINITY,
1.0,
f64::INFINITY,
0.0,
f64::INFINITY,
-1.0,
false,
false,
true,
),
(
f64::INFINITY,
-1.0,
f64::INFINITY,
-0.0,
f64::INFINITY,
1.0,
false,
false,
true,
),
(
f64::INFINITY,
0.5,
f64::INFINITY,
0.0,
f64::INFINITY,
-0.5,
false,
false,
true,
),
(
f64::INFINITY,
-2.0,
f64::INFINITY,
-0.0,
f64::INFINITY,
2.0,
false,
false,
true,
),
(
f64::INFINITY,
3.0,
f64::INFINITY,
0.0,
f64::INFINITY,
-3.0,
false,
false,
true,
),
(
f64::NEG_INFINITY,
f64::NAN,
f64::INFINITY,
f64::NAN,
f64::NEG_INFINITY,
f64::NAN,
true,
false,
true,
),
(
f64::NEG_INFINITY,
f64::INFINITY,
f64::INFINITY,
2.356194490192345,
f64::NEG_INFINITY,
f64::NEG_INFINITY,
false,
false,
true,
),
(
f64::NEG_INFINITY,
f64::NEG_INFINITY,
f64::INFINITY,
-2.356194490192345,
f64::NEG_INFINITY,
f64::INFINITY,
false,
false,
true,
),
(
f64::NEG_INFINITY,
0.0,
f64::INFINITY,
3.141592653589793,
f64::NEG_INFINITY,
-0.0,
false,
false,
true,
),
(
f64::NEG_INFINITY,
-0.0,
f64::INFINITY,
-3.141592653589793,
f64::NEG_INFINITY,
0.0,
false,
false,
true,
),
(
f64::NEG_INFINITY,
1.0,
f64::INFINITY,
3.141592653589793,
f64::NEG_INFINITY,
-1.0,
false,
false,
true,
),
(
f64::NEG_INFINITY,
-1.0,
f64::INFINITY,
-3.141592653589793,
f64::NEG_INFINITY,
1.0,
false,
false,
true,
),
(
f64::NEG_INFINITY,
0.5,
f64::INFINITY,
3.141592653589793,
f64::NEG_INFINITY,
-0.5,
false,
false,
true,
),
(
f64::NEG_INFINITY,
-2.0,
f64::INFINITY,
-3.141592653589793,
f64::NEG_INFINITY,
2.0,
false,
false,
true,
),
(
f64::NEG_INFINITY,
3.0,
f64::INFINITY,
3.141592653589793,
f64::NEG_INFINITY,
-3.0,
false,
false,
true,
),
(
0.0,
f64::NAN,
f64::NAN,
f64::NAN,
0.0,
f64::NAN,
true,
false,
false,
),
(
0.0,
f64::INFINITY,
f64::INFINITY,
1.5707963267948966,
0.0,
f64::NEG_INFINITY,
false,
false,
true,
),
(
0.0,
f64::NEG_INFINITY,
f64::INFINITY,
-1.5707963267948966,
0.0,
f64::INFINITY,
false,
false,
true,
),
(0.0, 0.0, 0.0, 0.0, 0.0, -0.0, false, true, false),
(0.0, -0.0, 0.0, -0.0, 0.0, 0.0, false, true, false),
(
0.0,
1.0,
1.0,
1.5707963267948966,
0.0,
-1.0,
false,
true,
false,
),
(
0.0,
-1.0,
1.0,
-1.5707963267948966,
0.0,
1.0,
false,
true,
false,
),
(
0.0,
0.5,
0.5,
1.5707963267948966,
0.0,
-0.5,
false,
true,
false,
),
(
0.0,
-2.0,
2.0,
-1.5707963267948966,
0.0,
2.0,
false,
true,
false,
),
(
0.0,
3.0,
3.0,
1.5707963267948966,
0.0,
-3.0,
false,
true,
false,
),
(
-0.0,
f64::NAN,
f64::NAN,
f64::NAN,
-0.0,
f64::NAN,
true,
false,
false,
),
(
-0.0,
f64::INFINITY,
f64::INFINITY,
1.5707963267948966,
-0.0,
f64::NEG_INFINITY,
false,
false,
true,
),
(
-0.0,
f64::NEG_INFINITY,
f64::INFINITY,
-1.5707963267948966,
-0.0,
f64::INFINITY,
false,
false,
true,
),
(
-0.0,
0.0,
0.0,
3.141592653589793,
-0.0,
-0.0,
false,
true,
false,
),
(
-0.0,
-0.0,
0.0,
-3.141592653589793,
-0.0,
0.0,
false,
true,
false,
),
(
-0.0,
1.0,
1.0,
1.5707963267948966,
-0.0,
-1.0,
false,
true,
false,
),
(
-0.0,
-1.0,
1.0,
-1.5707963267948966,
-0.0,
1.0,
false,
true,
false,
),
(
-0.0,
0.5,
0.5,
1.5707963267948966,
-0.0,
-0.5,
false,
true,
false,
),
(
-0.0,
-2.0,
2.0,
-1.5707963267948966,
-0.0,
2.0,
false,
true,
false,
),
(
-0.0,
3.0,
3.0,
1.5707963267948966,
-0.0,
-3.0,
false,
true,
false,
),
(
1.0,
f64::NAN,
f64::NAN,
f64::NAN,
1.0,
f64::NAN,
true,
false,
false,
),
(
1.0,
f64::INFINITY,
f64::INFINITY,
1.5707963267948966,
1.0,
f64::NEG_INFINITY,
false,
false,
true,
),
(
1.0,
f64::NEG_INFINITY,
f64::INFINITY,
-1.5707963267948966,
1.0,
f64::INFINITY,
false,
false,
true,
),
(1.0, 0.0, 1.0, 0.0, 1.0, -0.0, false, true, false),
(1.0, -0.0, 1.0, -0.0, 1.0, 0.0, false, true, false),
(
1.0,
1.0,
1.4142135623730951,
0.7853981633974483,
1.0,
-1.0,
false,
true,
false,
),
(
1.0,
-1.0,
1.4142135623730951,
-0.7853981633974483,
1.0,
1.0,
false,
true,
false,
),
(
1.0,
0.5,
1.118033988749895,
0.4636476090008061,
1.0,
-0.5,
false,
true,
false,
),
(
1.0,
-2.0,
2.23606797749979,
-1.1071487177940904,
1.0,
2.0,
false,
true,
false,
),
(
1.0,
3.0,
3.1622776601683795,
1.2490457723982544,
1.0,
-3.0,
false,
true,
false,
),
(
-1.0,
f64::NAN,
f64::NAN,
f64::NAN,
-1.0,
f64::NAN,
true,
false,
false,
),
(
-1.0,
f64::INFINITY,
f64::INFINITY,
1.5707963267948966,
-1.0,
f64::NEG_INFINITY,
false,
false,
true,
),
(
-1.0,
f64::NEG_INFINITY,
f64::INFINITY,
-1.5707963267948966,
-1.0,
f64::INFINITY,
false,
false,
true,
),
(
-1.0,
0.0,
1.0,
3.141592653589793,
-1.0,
-0.0,
false,
true,
false,
),
(
-1.0,
-0.0,
1.0,
-3.141592653589793,
-1.0,
0.0,
false,
true,
false,
),
(
-1.0,
1.0,
1.4142135623730951,
2.356194490192345,
-1.0,
-1.0,
false,
true,
false,
),
(
-1.0,
-1.0,
1.4142135623730951,
-2.356194490192345,
-1.0,
1.0,
false,
true,
false,
),
(
-1.0,
0.5,
1.118033988749895,
2.677945044588987,
-1.0,
-0.5,
false,
true,
false,
),
(
-1.0,
-2.0,
2.23606797749979,
-2.0344439357957027,
-1.0,
2.0,
false,
true,
false,
),
(
-1.0,
3.0,
3.1622776601683795,
1.892546881191539,
-1.0,
-3.0,
false,
true,
false,
),
(
0.5,
f64::NAN,
f64::NAN,
f64::NAN,
0.5,
f64::NAN,
true,
false,
false,
),
(
0.5,
f64::INFINITY,
f64::INFINITY,
1.5707963267948966,
0.5,
f64::NEG_INFINITY,
false,
false,
true,
),
(
0.5,
f64::NEG_INFINITY,
f64::INFINITY,
-1.5707963267948966,
0.5,
f64::INFINITY,
false,
false,
true,
),
(0.5, 0.0, 0.5, 0.0, 0.5, -0.0, false, true, false),
(0.5, -0.0, 0.5, -0.0, 0.5, 0.0, false, true, false),
(
0.5,
1.0,
1.118033988749895,
1.1071487177940904,
0.5,
-1.0,
false,
true,
false,
),
(
0.5,
-1.0,
1.118033988749895,
-1.1071487177940904,
0.5,
1.0,
false,
true,
false,
),
(
0.5,
0.5,
0.7071067811865476,
0.7853981633974483,
0.5,
-0.5,
false,
true,
false,
),
(
0.5,
-2.0,
2.0615528128088303,
-1.3258176636680326,
0.5,
2.0,
false,
true,
false,
),
(
0.5,
3.0,
3.0413812651491092,
1.4056476493802699,
0.5,
-3.0,
false,
true,
false,
),
(
-2.0,
f64::NAN,
f64::NAN,
f64::NAN,
-2.0,
f64::NAN,
true,
false,
false,
),
(
-2.0,
f64::INFINITY,
f64::INFINITY,
1.5707963267948966,
-2.0,
f64::NEG_INFINITY,
false,
false,
true,
),
(
-2.0,
f64::NEG_INFINITY,
f64::INFINITY,
-1.5707963267948966,
-2.0,
f64::INFINITY,
false,
false,
true,
),
(
-2.0,
0.0,
2.0,
3.141592653589793,
-2.0,
-0.0,
false,
true,
false,
),
(
-2.0,
-0.0,
2.0,
-3.141592653589793,
-2.0,
0.0,
false,
true,
false,
),
(
-2.0,
1.0,
2.23606797749979,
2.677945044588987,
-2.0,
-1.0,
false,
true,
false,
),
(
-2.0,
-1.0,
2.23606797749979,
-2.677945044588987,
-2.0,
1.0,
false,
true,
false,
),
(
-2.0,
0.5,
2.0615528128088303,
2.896613990462929,
-2.0,
-0.5,
false,
true,
false,
),
(
-2.0,
-2.0,
2.8284271247461903,
-2.356194490192345,
-2.0,
2.0,
false,
true,
false,
),
(
-2.0,
3.0,
3.6055512754639896,
2.158798930342464,
-2.0,
-3.0,
false,
true,
false,
),
(
3.0,
f64::NAN,
f64::NAN,
f64::NAN,
3.0,
f64::NAN,
true,
false,
false,
),
(
3.0,
f64::INFINITY,
f64::INFINITY,
1.5707963267948966,
3.0,
f64::NEG_INFINITY,
false,
false,
true,
),
(
3.0,
f64::NEG_INFINITY,
f64::INFINITY,
-1.5707963267948966,
3.0,
f64::INFINITY,
false,
false,
true,
),
(3.0, 0.0, 3.0, 0.0, 3.0, -0.0, false, true, false),
(3.0, -0.0, 3.0, -0.0, 3.0, 0.0, false, true, false),
(
3.0,
1.0,
3.1622776601683795,
0.3217505543966422,
3.0,
-1.0,
false,
true,
false,
),
(
3.0,
-1.0,
3.1622776601683795,
-0.3217505543966422,
3.0,
1.0,
false,
true,
false,
),
(
3.0,
0.5,
3.0413812651491092,
0.16514867741462683,
3.0,
-0.5,
false,
true,
false,
),
(
3.0,
-2.0,
3.6055512754639896,
-0.5880026035475675,
3.0,
2.0,
false,
true,
false,
),
(
3.0,
3.0,
4.242640687119286,
0.7853981633974483,
3.0,
-3.0,
false,
true,
false,
),
(
1.0,
2.0,
2.23606797749979,
1.1071487177940904,
1.0,
-2.0,
false,
true,
false,
),
(
-3.0,
0.5,
3.0413812651491092,
2.976443976175166,
-3.0,
-0.5,
false,
true,
false,
),
(
1e-05,
1e-05,
1.4142135623730953e-05,
0.7853981633974483,
1e-05,
-1e-05,
false,
true,
false,
),
(25.0, 0.0, 25.0, 0.0, 25.0, -0.0, false, true, false),
(
0.0,
30.0,
30.0,
1.5707963267948966,
0.0,
-30.0,
false,
true,
false,
),
(
22.5,
-3.0,
22.69911892563233,
-0.13255153229667402,
22.5,
3.0,
false,
true,
false,
),
(
10.0,
100000.0,
100000.0005,
1.5706963267952299,
10.0,
-100000.0,
false,
true,
false,
),
(
700.0,
1.0,
700.0007142853498,
0.0014285704567553203,
700.0,
-1.0,
false,
true,
false,
),
(
710.0,
1.0,
710.0007042250028,
0.0014084497728962322,
710.0,
-1.0,
false,
true,
false,
),
(
750.0,
2.0,
750.0026666619259,
0.0026666603457059816,
750.0,
-2.0,
false,
true,
false,
),
(
-750.0,
2.0,
750.0026666619259,
3.1389259932440874,
-750.0,
-2.0,
false,
true,
false,
),
(
1e+300,
1e+300,
1.4142135623730952e+300,
0.7853981633974483,
1e+300,
-1e+300,
false,
true,
false,
),
(
-1e+300,
-1e+300,
1.4142135623730952e+300,
-2.356194490192345,
-1e+300,
1e+300,
false,
true,
false,
),
(
1e-300,
1e-300,
1.4142135623730952e-300,
0.7853981633974483,
1e-300,
-1e-300,
false,
true,
false,
),
(5e-324, 0.0, 5e-324, 0.0, 5e-324, -0.0, false, true, false),
(
-4.0,
0.0,
4.0,
3.141592653589793,
-4.0,
-0.0,
false,
true,
false,
),
(
-4.0,
0.0,
4.0,
3.141592653589793,
-4.0,
-0.0,
false,
true,
false,
),
(
-4.0,
0.0,
4.0,
3.141592653589793,
-4.0,
-0.0,
false,
true,
false,
),
(
-4.0,
-0.0,
4.0,
-3.141592653589793,
-4.0,
0.0,
false,
true,
false,
),
(0.5, 1e-10, 0.5, 2e-10, 0.5, -1e-10, false, true, false),
(1.0, 1e-10, 1.0, 1e-10, 1.0, -1e-10, false, true, false),
(1.0, -1e-10, 1.0, -1e-10, 1.0, 1e-10, false, true, false),
(
0.999999,
0.001,
0.9999995000003751,
0.0010000006666668667,
0.999999,
-0.001,
false,
true,
false,
),
(
3.0,
4.0,
5.0,
0.9272952180016122,
3.0,
-4.0,
false,
true,
false,
),
(
-1.0,
1e-300,
1.0,
3.141592653589793,
-1.0,
-1e-300,
false,
true,
false,
),
(
2.0,
-2.0,
2.8284271247461903,
-0.7853981633974483,
2.0,
2.0,
false,
true,
false,
),
(
8.5,
0.1,
8.500588214941363,
0.011764163149758748,
8.5,
-0.1,
false,
true,
false,
),
(
-9.0,
40.0,
41.0,
1.7921107691426879,
-9.0,
-40.0,
false,
true,
false,
),
(
12.0,
200.0,
200.35967658189108,
1.5108681716736887,
12.0,
-200.0,
false,
true,
false,
),
(
-0.3,
-0.4,
0.5,
-2.214297435588181,
-0.3,
0.4,
false,
true,
false,
),
(
100000000.0,
100000000.0,
141421356.23730952,
0.7853981633974483,
100000000.0,
-100000000.0,
false,
true,
false,
),
(
1.7e+308,
1.7e+308,
f64::INFINITY,
0.7853981633974483,
1.7e+308,
-1.7e+308,
false,
true,
false,
),
(
-1.7e+308,
1.0,
1.7e+308,
3.141592653589793,
-1.7e+308,
-1.0,
false,
true,
false,
),
(
100.0,
0.5,
100.0012499921876,
0.0049999583339583225,
100.0,
-0.5,
false,
true,
false,
),
(
-100.0,
-0.5,
100.0012499921876,
-3.136592695255835,
-100.0,
0.5,
false,
true,
false,
),
(
0.1,
0.1,
0.14142135623730953,
0.7853981633974483,
0.1,
-0.1,
false,
true,
false,
),
(
709.5,
0.5,
709.5001761803869,
0.0007047215182916526,
709.5,
-0.5,
false,
true,
false,
),
(
709.9,
1.5707963267948966,
709.9017378490491,
0.0022126972295242356,
709.9,
-1.5707963267948966,
false,
true,
false,
),
(
0.0,
2.0,
2.0,
1.5707963267948966,
0.0,
-2.0,
false,
true,
false,
),
(
0.0,
-2.0,
2.0,
-1.5707963267948966,
0.0,
2.0,
false,
true,
false,
),
(
-0.0,
-2.0,
2.0,
-1.5707963267948966,
-0.0,
2.0,
false,
true,
false,
),
];
for &(re, im, wabs, warg, wcr, wci, wnan, wfin, winf) in CASES {
let z = Complex::new(re, im);
let s = format!("{z:?}");
check("norm", &s, z.norm(), wabs, 1e-6, 0.0);
check("arg", &s, z.arg(), warg, 1e-6, 0.0);
let cj = z.conj();
check("conj.re", &s, cj.re, wcr, 0.0, 0.0);
check("conj.im", &s, cj.im, wci, 0.0, 0.0);
assert_eq!(z.is_nan(), wnan, "is_nan {s}");
assert_eq!(z.is_finite(), wfin, "is_finite {s}");
assert_eq!(z.is_infinite(), winf, "is_infinite {s}");
}
}
#[test]
fn complex_abs_arg_conj_flags_f32() {
let _report = Report;
const CASES: &[(f32, f32, f32, f32, f32, f32, bool, bool, bool)] = &[
(
f32::NAN,
f32::NAN,
f32::NAN,
f32::NAN,
f32::NAN,
f32::NAN,
true,
false,
false,
),
(
f32::NAN,
f32::INFINITY,
f32::INFINITY,
f32::NAN,
f32::NAN,
f32::NEG_INFINITY,
true,
false,
true,
),
(
f32::NAN,
f32::NEG_INFINITY,
f32::INFINITY,
f32::NAN,
f32::NAN,
f32::INFINITY,
true,
false,
true,
),
(
f32::NAN,
0.0,
f32::NAN,
f32::NAN,
f32::NAN,
-0.0,
true,
false,
false,
),
(
f32::NAN,
-0.0,
f32::NAN,
f32::NAN,
f32::NAN,
0.0,
true,
false,
false,
),
(
f32::NAN,
1.0,
f32::NAN,
f32::NAN,
f32::NAN,
-1.0,
true,
false,
false,
),
(
f32::NAN,
-1.0,
f32::NAN,
f32::NAN,
f32::NAN,
1.0,
true,
false,
false,
),
(
f32::NAN,
0.5,
f32::NAN,
f32::NAN,
f32::NAN,
-0.5,
true,
false,
false,
),
(
f32::NAN,
-2.0,
f32::NAN,
f32::NAN,
f32::NAN,
2.0,
true,
false,
false,
),
(
f32::NAN,
3.0,
f32::NAN,
f32::NAN,
f32::NAN,
-3.0,
true,
false,
false,
),
(
f32::INFINITY,
f32::NAN,
f32::INFINITY,
f32::NAN,
f32::INFINITY,
f32::NAN,
true,
false,
true,
),
(
f32::INFINITY,
f32::INFINITY,
f32::INFINITY,
0.7853982,
f32::INFINITY,
f32::NEG_INFINITY,
false,
false,
true,
),
(
f32::INFINITY,
f32::NEG_INFINITY,
f32::INFINITY,
-0.7853982,
f32::INFINITY,
f32::INFINITY,
false,
false,
true,
),
(
f32::INFINITY,
0.0,
f32::INFINITY,
0.0,
f32::INFINITY,
-0.0,
false,
false,
true,
),
(
f32::INFINITY,
-0.0,
f32::INFINITY,
-0.0,
f32::INFINITY,
0.0,
false,
false,
true,
),
(
f32::INFINITY,
1.0,
f32::INFINITY,
0.0,
f32::INFINITY,
-1.0,
false,
false,
true,
),
(
f32::INFINITY,
-1.0,
f32::INFINITY,
-0.0,
f32::INFINITY,
1.0,
false,
false,
true,
),
(
f32::INFINITY,
0.5,
f32::INFINITY,
0.0,
f32::INFINITY,
-0.5,
false,
false,
true,
),
(
f32::INFINITY,
-2.0,
f32::INFINITY,
-0.0,
f32::INFINITY,
2.0,
false,
false,
true,
),
(
f32::INFINITY,
3.0,
f32::INFINITY,
0.0,
f32::INFINITY,
-3.0,
false,
false,
true,
),
(
f32::NEG_INFINITY,
f32::NAN,
f32::INFINITY,
f32::NAN,
f32::NEG_INFINITY,
f32::NAN,
true,
false,
true,
),
(
f32::NEG_INFINITY,
f32::INFINITY,
f32::INFINITY,
2.3561945,
f32::NEG_INFINITY,
f32::NEG_INFINITY,
false,
false,
true,
),
(
f32::NEG_INFINITY,
f32::NEG_INFINITY,
f32::INFINITY,
-2.3561945,
f32::NEG_INFINITY,
f32::INFINITY,
false,
false,
true,
),
(
f32::NEG_INFINITY,
0.0,
f32::INFINITY,
3.1415927,
f32::NEG_INFINITY,
-0.0,
false,
false,
true,
),
(
f32::NEG_INFINITY,
-0.0,
f32::INFINITY,
-3.1415927,
f32::NEG_INFINITY,
0.0,
false,
false,
true,
),
(
f32::NEG_INFINITY,
1.0,
f32::INFINITY,
3.1415927,
f32::NEG_INFINITY,
-1.0,
false,
false,
true,
),
(
f32::NEG_INFINITY,
-1.0,
f32::INFINITY,
-3.1415927,
f32::NEG_INFINITY,
1.0,
false,
false,
true,
),
(
f32::NEG_INFINITY,
0.5,
f32::INFINITY,
3.1415927,
f32::NEG_INFINITY,
-0.5,
false,
false,
true,
),
(
f32::NEG_INFINITY,
-2.0,
f32::INFINITY,
-3.1415927,
f32::NEG_INFINITY,
2.0,
false,
false,
true,
),
(
f32::NEG_INFINITY,
3.0,
f32::INFINITY,
3.1415927,
f32::NEG_INFINITY,
-3.0,
false,
false,
true,
),
(
0.0,
f32::NAN,
f32::NAN,
f32::NAN,
0.0,
f32::NAN,
true,
false,
false,
),
(
0.0,
f32::INFINITY,
f32::INFINITY,
1.5707964,
0.0,
f32::NEG_INFINITY,
false,
false,
true,
),
(
0.0,
f32::NEG_INFINITY,
f32::INFINITY,
-1.5707964,
0.0,
f32::INFINITY,
false,
false,
true,
),
(0.0, 0.0, 0.0, 0.0, 0.0, -0.0, false, true, false),
(0.0, -0.0, 0.0, -0.0, 0.0, 0.0, false, true, false),
(0.0, 1.0, 1.0, 1.5707964, 0.0, -1.0, false, true, false),
(0.0, -1.0, 1.0, -1.5707964, 0.0, 1.0, false, true, false),
(0.0, 0.5, 0.5, 1.5707964, 0.0, -0.5, false, true, false),
(0.0, -2.0, 2.0, -1.5707964, 0.0, 2.0, false, true, false),
(0.0, 3.0, 3.0, 1.5707964, 0.0, -3.0, false, true, false),
(
-0.0,
f32::NAN,
f32::NAN,
f32::NAN,
-0.0,
f32::NAN,
true,
false,
false,
),
(
-0.0,
f32::INFINITY,
f32::INFINITY,
1.5707964,
-0.0,
f32::NEG_INFINITY,
false,
false,
true,
),
(
-0.0,
f32::NEG_INFINITY,
f32::INFINITY,
-1.5707964,
-0.0,
f32::INFINITY,
false,
false,
true,
),
(-0.0, 0.0, 0.0, 3.1415927, -0.0, -0.0, false, true, false),
(-0.0, -0.0, 0.0, -3.1415927, -0.0, 0.0, false, true, false),
(-0.0, 1.0, 1.0, 1.5707964, -0.0, -1.0, false, true, false),
(-0.0, -1.0, 1.0, -1.5707964, -0.0, 1.0, false, true, false),
(-0.0, 0.5, 0.5, 1.5707964, -0.0, -0.5, false, true, false),
(-0.0, -2.0, 2.0, -1.5707964, -0.0, 2.0, false, true, false),
(-0.0, 3.0, 3.0, 1.5707964, -0.0, -3.0, false, true, false),
(
1.0,
f32::NAN,
f32::NAN,
f32::NAN,
1.0,
f32::NAN,
true,
false,
false,
),
(
1.0,
f32::INFINITY,
f32::INFINITY,
1.5707964,
1.0,
f32::NEG_INFINITY,
false,
false,
true,
),
(
1.0,
f32::NEG_INFINITY,
f32::INFINITY,
-1.5707964,
1.0,
f32::INFINITY,
false,
false,
true,
),
(1.0, 0.0, 1.0, 0.0, 1.0, -0.0, false, true, false),
(1.0, -0.0, 1.0, -0.0, 1.0, 0.0, false, true, false),
(
1.0, 1.0, 1.4142135, 0.7853982, 1.0, -1.0, false, true, false,
),
(
1.0, -1.0, 1.4142135, -0.7853982, 1.0, 1.0, false, true, false,
),
(1.0, 0.5, 1.118034, 0.4636476, 1.0, -0.5, false, true, false),
(
1.0, -2.0, 2.236068, -1.1071488, 1.0, 2.0, false, true, false,
),
(
1.0, 3.0, 3.1622777, 1.2490457, 1.0, -3.0, false, true, false,
),
(
-1.0,
f32::NAN,
f32::NAN,
f32::NAN,
-1.0,
f32::NAN,
true,
false,
false,
),
(
-1.0,
f32::INFINITY,
f32::INFINITY,
1.5707964,
-1.0,
f32::NEG_INFINITY,
false,
false,
true,
),
(
-1.0,
f32::NEG_INFINITY,
f32::INFINITY,
-1.5707964,
-1.0,
f32::INFINITY,
false,
false,
true,
),
(-1.0, 0.0, 1.0, 3.1415927, -1.0, -0.0, false, true, false),
(-1.0, -0.0, 1.0, -3.1415927, -1.0, 0.0, false, true, false),
(
-1.0, 1.0, 1.4142135, 2.3561945, -1.0, -1.0, false, true, false,
),
(
-1.0, -1.0, 1.4142135, -2.3561945, -1.0, 1.0, false, true, false,
),
(
-1.0, 0.5, 1.118034, 2.6779451, -1.0, -0.5, false, true, false,
),
(
-1.0, -2.0, 2.236068, -2.0344439, -1.0, 2.0, false, true, false,
),
(
-1.0, 3.0, 3.1622777, 1.8925469, -1.0, -3.0, false, true, false,
),
(
0.5,
f32::NAN,
f32::NAN,
f32::NAN,
0.5,
f32::NAN,
true,
false,
false,
),
(
0.5,
f32::INFINITY,
f32::INFINITY,
1.5707964,
0.5,
f32::NEG_INFINITY,
false,
false,
true,
),
(
0.5,
f32::NEG_INFINITY,
f32::INFINITY,
-1.5707964,
0.5,
f32::INFINITY,
false,
false,
true,
),
(0.5, 0.0, 0.5, 0.0, 0.5, -0.0, false, true, false),
(0.5, -0.0, 0.5, -0.0, 0.5, 0.0, false, true, false),
(0.5, 1.0, 1.118034, 1.1071488, 0.5, -1.0, false, true, false),
(
0.5, -1.0, 1.118034, -1.1071488, 0.5, 1.0, false, true, false,
),
(
0.5, 0.5, 0.70710677, 0.7853982, 0.5, -0.5, false, true, false,
),
(
0.5, -2.0, 2.0615528, -1.3258177, 0.5, 2.0, false, true, false,
),
(
0.5, 3.0, 3.0413811, 1.4056476, 0.5, -3.0, false, true, false,
),
(
-2.0,
f32::NAN,
f32::NAN,
f32::NAN,
-2.0,
f32::NAN,
true,
false,
false,
),
(
-2.0,
f32::INFINITY,
f32::INFINITY,
1.5707964,
-2.0,
f32::NEG_INFINITY,
false,
false,
true,
),
(
-2.0,
f32::NEG_INFINITY,
f32::INFINITY,
-1.5707964,
-2.0,
f32::INFINITY,
false,
false,
true,
),
(-2.0, 0.0, 2.0, 3.1415927, -2.0, -0.0, false, true, false),
(-2.0, -0.0, 2.0, -3.1415927, -2.0, 0.0, false, true, false),
(
-2.0, 1.0, 2.236068, 2.6779451, -2.0, -1.0, false, true, false,
),
(
-2.0, -1.0, 2.236068, -2.6779451, -2.0, 1.0, false, true, false,
),
(
-2.0, 0.5, 2.0615528, 2.896614, -2.0, -0.5, false, true, false,
),
(
-2.0, -2.0, 2.828427, -2.3561945, -2.0, 2.0, false, true, false,
),
(
-2.0, 3.0, 3.6055512, 2.158799, -2.0, -3.0, false, true, false,
),
(
3.0,
f32::NAN,
f32::NAN,
f32::NAN,
3.0,
f32::NAN,
true,
false,
false,
),
(
3.0,
f32::INFINITY,
f32::INFINITY,
1.5707964,
3.0,
f32::NEG_INFINITY,
false,
false,
true,
),
(
3.0,
f32::NEG_INFINITY,
f32::INFINITY,
-1.5707964,
3.0,
f32::INFINITY,
false,
false,
true,
),
(3.0, 0.0, 3.0, 0.0, 3.0, -0.0, false, true, false),
(3.0, -0.0, 3.0, -0.0, 3.0, 0.0, false, true, false),
(
3.0, 1.0, 3.1622777, 0.32175055, 3.0, -1.0, false, true, false,
),
(
3.0,
-1.0,
3.1622777,
-0.32175055,
3.0,
1.0,
false,
true,
false,
),
(
3.0, 0.5, 3.0413811, 0.16514868, 3.0, -0.5, false, true, false,
),
(
3.0, -2.0, 3.6055512, -0.5880026, 3.0, 2.0, false, true, false,
),
(
3.0, 3.0, 4.2426405, 0.7853982, 3.0, -3.0, false, true, false,
),
(1.0, 2.0, 2.236068, 1.1071488, 1.0, -2.0, false, true, false),
(
-3.0, 0.5, 3.0413811, 2.976444, -3.0, -0.5, false, true, false,
),
(
1e-05,
1e-05,
1.4142135e-05,
0.7853982,
1e-05,
-1e-05,
false,
true,
false,
),
(25.0, 0.0, 25.0, 0.0, 25.0, -0.0, false, true, false),
(0.0, 30.0, 30.0, 1.5707964, 0.0, -30.0, false, true, false),
(
22.5,
-3.0,
22.69912,
-0.13255154,
22.5,
3.0,
false,
true,
false,
),
(
10.0, 100000.0, 100000.0, 1.5706964, 10.0, -100000.0, false, true, false,
),
(
700.0,
1.0,
700.0007,
0.0014285705,
700.0,
-1.0,
false,
true,
false,
),
(
710.0,
1.0,
710.0007,
0.0014084497,
710.0,
-1.0,
false,
true,
false,
),
(
750.0,
2.0,
750.0027,
0.0026666604,
750.0,
-2.0,
false,
true,
false,
),
(
-750.0, 2.0, 750.0027, 3.138926, -750.0, -2.0, false, true, false,
),
(0.0, 0.0, 0.0, 0.0, 0.0, -0.0, false, true, false),
(0.0, 0.0, 0.0, 0.0, 0.0, -0.0, false, true, false),
(-4.0, 0.0, 4.0, 3.1415927, -4.0, -0.0, false, true, false),
(-4.0, 0.0, 4.0, 3.1415927, -4.0, -0.0, false, true, false),
(-4.0, 0.0, 4.0, 3.1415927, -4.0, -0.0, false, true, false),
(-4.0, -0.0, 4.0, -3.1415927, -4.0, 0.0, false, true, false),
(0.5, 1e-10, 0.5, 2e-10, 0.5, -1e-10, false, true, false),
(1.0, 1e-10, 1.0, 1e-10, 1.0, -1e-10, false, true, false),
(1.0, -1e-10, 1.0, -1e-10, 1.0, 1e-10, false, true, false),
(
0.999999,
0.001,
0.99999946,
0.0010000007,
0.999999,
-0.001,
false,
true,
false,
),
(3.0, 4.0, 5.0, 0.9272952, 3.0, -4.0, false, true, false),
(-1.0, 0.0, 1.0, 3.1415927, -1.0, -0.0, false, true, false),
(
2.0, -2.0, 2.828427, -0.7853982, 2.0, 2.0, false, true, false,
),
(
8.5,
0.1,
8.500587,
0.011764163,
8.5,
-0.1,
false,
true,
false,
),
(-9.0, 40.0, 41.0, 1.7921108, -9.0, -40.0, false, true, false),
(
12.0, 200.0, 200.35968, 1.5108682, 12.0, -200.0, false, true, false,
),
(-0.3, -0.4, 0.5, -2.2142975, -0.3, 0.4, false, true, false),
(
1e+08,
1e+08,
1.4142136e+08,
0.7853982,
1e+08,
-1e+08,
false,
true,
false,
),
(
100.0,
0.5,
100.00125,
0.0049999584,
100.0,
-0.5,
false,
true,
false,
),
(
-100.0, -0.5, 100.00125, -3.1365926, -100.0, 0.5, false, true, false,
),
(
0.1, 0.1, 0.14142136, 0.7853982, 0.1, -0.1, false, true, false,
),
(
709.5,
0.5,
709.5002,
0.0007047215,
709.5,
-0.5,
false,
true,
false,
),
(
709.9,
1.5707964,
709.90173,
0.0022126972,
709.9,
-1.5707964,
false,
true,
false,
),
(0.0, 2.0, 2.0, 1.5707964, 0.0, -2.0, false, true, false),
(0.0, -2.0, 2.0, -1.5707964, 0.0, 2.0, false, true, false),
(-0.0, -2.0, 2.0, -1.5707964, -0.0, 2.0, false, true, false),
];
for &(re, im, wabs, warg, wcr, wci, wnan, wfin, winf) in CASES {
let z = Complex::new(re, im);
let s = format!("{z:?}");
check("norm", &s, z.norm(), wabs, 1e-6, 0.0);
check("arg", &s, z.arg(), warg, 1e-6, 0.0);
let cj = z.conj();
check("conj.re", &s, cj.re, wcr, 0.0, 0.0);
check("conj.im", &s, cj.im, wci, 0.0, 0.0);
assert_eq!(z.is_nan(), wnan, "is_nan {s}");
assert_eq!(z.is_finite(), wfin, "is_finite {s}");
assert_eq!(z.is_infinite(), winf, "is_infinite {s}");
}
}
#[test]
fn complex_add_f64() {
let _report = Report;
const CASES: &[((f64, f64), (f64, f64), (f64, f64))] = &[
((f64::NAN, 0.0), (f64::NAN, 0.0), (f64::NAN, 0.0)),
((f64::NAN, 0.0), (f64::INFINITY, 1.0), (f64::NAN, 1.0)),
(
(f64::NAN, 0.0),
(f64::NEG_INFINITY, f64::NEG_INFINITY),
(f64::NAN, f64::NEG_INFINITY),
),
((f64::NAN, 0.0), (0.0, 0.0), (f64::NAN, 0.0)),
((f64::NAN, 0.0), (-0.0, 0.0), (f64::NAN, 0.0)),
((f64::NAN, 0.0), (0.0, -0.0), (f64::NAN, 0.0)),
((f64::NAN, 0.0), (1.0, 2.0), (f64::NAN, 2.0)),
((f64::NAN, 0.0), (-3.0, 0.5), (f64::NAN, 0.5)),
((f64::NAN, 0.0), (1e+300, 1e+300), (f64::NAN, 1e+300)),
((f64::NAN, 0.0), (1e-300, -1e-300), (f64::NAN, -1e-300)),
((f64::NAN, 0.0), (2.0, 0.0), (f64::NAN, 0.0)),
((f64::NAN, 0.0), (0.0, 1.0), (f64::NAN, 1.0)),
(
(f64::NAN, 0.0),
(f64::INFINITY, f64::NAN),
(f64::NAN, f64::NAN),
),
((f64::NAN, 0.0), (f64::NAN, f64::NAN), (f64::NAN, f64::NAN)),
((f64::NAN, 0.0), (5.0, -7.0), (f64::NAN, -7.0)),
((f64::NAN, 0.0), (1e+308, 1e-308), (f64::NAN, 1e-308)),
((f64::NAN, 0.0), (-1.0, -0.0), (f64::NAN, 0.0)),
((f64::INFINITY, 1.0), (f64::NAN, 0.0), (f64::NAN, 1.0)),
(
(f64::INFINITY, 1.0),
(f64::INFINITY, 1.0),
(f64::INFINITY, 2.0),
),
(
(f64::INFINITY, 1.0),
(f64::NEG_INFINITY, f64::NEG_INFINITY),
(f64::NAN, f64::NEG_INFINITY),
),
((f64::INFINITY, 1.0), (0.0, 0.0), (f64::INFINITY, 1.0)),
((f64::INFINITY, 1.0), (-0.0, 0.0), (f64::INFINITY, 1.0)),
((f64::INFINITY, 1.0), (0.0, -0.0), (f64::INFINITY, 1.0)),
((f64::INFINITY, 1.0), (1.0, 2.0), (f64::INFINITY, 3.0)),
((f64::INFINITY, 1.0), (-3.0, 0.5), (f64::INFINITY, 1.5)),
(
(f64::INFINITY, 1.0),
(1e+300, 1e+300),
(f64::INFINITY, 1e+300),
),
(
(f64::INFINITY, 1.0),
(1e-300, -1e-300),
(f64::INFINITY, 1.0),
),
((f64::INFINITY, 1.0), (2.0, 0.0), (f64::INFINITY, 1.0)),
((f64::INFINITY, 1.0), (0.0, 1.0), (f64::INFINITY, 2.0)),
(
(f64::INFINITY, 1.0),
(f64::INFINITY, f64::NAN),
(f64::INFINITY, f64::NAN),
),
(
(f64::INFINITY, 1.0),
(f64::NAN, f64::NAN),
(f64::NAN, f64::NAN),
),
((f64::INFINITY, 1.0), (5.0, -7.0), (f64::INFINITY, -6.0)),
((f64::INFINITY, 1.0), (1e+308, 1e-308), (f64::INFINITY, 1.0)),
((f64::INFINITY, 1.0), (-1.0, -0.0), (f64::INFINITY, 1.0)),
(
(f64::NEG_INFINITY, f64::NEG_INFINITY),
(f64::NAN, 0.0),
(f64::NAN, f64::NEG_INFINITY),
),
(
(f64::NEG_INFINITY, f64::NEG_INFINITY),
(f64::INFINITY, 1.0),
(f64::NAN, f64::NEG_INFINITY),
),
(
(f64::NEG_INFINITY, f64::NEG_INFINITY),
(f64::NEG_INFINITY, f64::NEG_INFINITY),
(f64::NEG_INFINITY, f64::NEG_INFINITY),
),
(
(f64::NEG_INFINITY, f64::NEG_INFINITY),
(0.0, 0.0),
(f64::NEG_INFINITY, f64::NEG_INFINITY),
),
(
(f64::NEG_INFINITY, f64::NEG_INFINITY),
(-0.0, 0.0),
(f64::NEG_INFINITY, f64::NEG_INFINITY),
),
(
(f64::NEG_INFINITY, f64::NEG_INFINITY),
(0.0, -0.0),
(f64::NEG_INFINITY, f64::NEG_INFINITY),
),
(
(f64::NEG_INFINITY, f64::NEG_INFINITY),
(1.0, 2.0),
(f64::NEG_INFINITY, f64::NEG_INFINITY),
),
(
(f64::NEG_INFINITY, f64::NEG_INFINITY),
(-3.0, 0.5),
(f64::NEG_INFINITY, f64::NEG_INFINITY),
),
(
(f64::NEG_INFINITY, f64::NEG_INFINITY),
(1e+300, 1e+300),
(f64::NEG_INFINITY, f64::NEG_INFINITY),
),
(
(f64::NEG_INFINITY, f64::NEG_INFINITY),
(1e-300, -1e-300),
(f64::NEG_INFINITY, f64::NEG_INFINITY),
),
(
(f64::NEG_INFINITY, f64::NEG_INFINITY),
(2.0, 0.0),
(f64::NEG_INFINITY, f64::NEG_INFINITY),
),
(
(f64::NEG_INFINITY, f64::NEG_INFINITY),
(0.0, 1.0),
(f64::NEG_INFINITY, f64::NEG_INFINITY),
),
(
(f64::NEG_INFINITY, f64::NEG_INFINITY),
(f64::INFINITY, f64::NAN),
(f64::NAN, f64::NAN),
),
(
(f64::NEG_INFINITY, f64::NEG_INFINITY),
(f64::NAN, f64::NAN),
(f64::NAN, f64::NAN),
),
(
(f64::NEG_INFINITY, f64::NEG_INFINITY),
(5.0, -7.0),
(f64::NEG_INFINITY, f64::NEG_INFINITY),
),
(
(f64::NEG_INFINITY, f64::NEG_INFINITY),
(1e+308, 1e-308),
(f64::NEG_INFINITY, f64::NEG_INFINITY),
),
(
(f64::NEG_INFINITY, f64::NEG_INFINITY),
(-1.0, -0.0),
(f64::NEG_INFINITY, f64::NEG_INFINITY),
),
((0.0, 0.0), (f64::NAN, 0.0), (f64::NAN, 0.0)),
((0.0, 0.0), (f64::INFINITY, 1.0), (f64::INFINITY, 1.0)),
(
(0.0, 0.0),
(f64::NEG_INFINITY, f64::NEG_INFINITY),
(f64::NEG_INFINITY, f64::NEG_INFINITY),
),
((0.0, 0.0), (0.0, 0.0), (0.0, 0.0)),
((0.0, 0.0), (-0.0, 0.0), (0.0, 0.0)),
((0.0, 0.0), (0.0, -0.0), (0.0, 0.0)),
((0.0, 0.0), (1.0, 2.0), (1.0, 2.0)),
((0.0, 0.0), (-3.0, 0.5), (-3.0, 0.5)),
((0.0, 0.0), (1e+300, 1e+300), (1e+300, 1e+300)),
((0.0, 0.0), (1e-300, -1e-300), (1e-300, -1e-300)),
((0.0, 0.0), (2.0, 0.0), (2.0, 0.0)),
((0.0, 0.0), (0.0, 1.0), (0.0, 1.0)),
(
(0.0, 0.0),
(f64::INFINITY, f64::NAN),
(f64::INFINITY, f64::NAN),
),
((0.0, 0.0), (f64::NAN, f64::NAN), (f64::NAN, f64::NAN)),
((0.0, 0.0), (5.0, -7.0), (5.0, -7.0)),
((0.0, 0.0), (1e+308, 1e-308), (1e+308, 1e-308)),
((0.0, 0.0), (-1.0, -0.0), (-1.0, 0.0)),
((-0.0, 0.0), (f64::NAN, 0.0), (f64::NAN, 0.0)),
((-0.0, 0.0), (f64::INFINITY, 1.0), (f64::INFINITY, 1.0)),
(
(-0.0, 0.0),
(f64::NEG_INFINITY, f64::NEG_INFINITY),
(f64::NEG_INFINITY, f64::NEG_INFINITY),
),
((-0.0, 0.0), (0.0, 0.0), (0.0, 0.0)),
((-0.0, 0.0), (-0.0, 0.0), (-0.0, 0.0)),
((-0.0, 0.0), (0.0, -0.0), (0.0, 0.0)),
((-0.0, 0.0), (1.0, 2.0), (1.0, 2.0)),
((-0.0, 0.0), (-3.0, 0.5), (-3.0, 0.5)),
((-0.0, 0.0), (1e+300, 1e+300), (1e+300, 1e+300)),
((-0.0, 0.0), (1e-300, -1e-300), (1e-300, -1e-300)),
((-0.0, 0.0), (2.0, 0.0), (2.0, 0.0)),
((-0.0, 0.0), (0.0, 1.0), (0.0, 1.0)),
(
(-0.0, 0.0),
(f64::INFINITY, f64::NAN),
(f64::INFINITY, f64::NAN),
),
((-0.0, 0.0), (f64::NAN, f64::NAN), (f64::NAN, f64::NAN)),
((-0.0, 0.0), (5.0, -7.0), (5.0, -7.0)),
((-0.0, 0.0), (1e+308, 1e-308), (1e+308, 1e-308)),
((-0.0, 0.0), (-1.0, -0.0), (-1.0, 0.0)),
((0.0, -0.0), (f64::NAN, 0.0), (f64::NAN, 0.0)),
((0.0, -0.0), (f64::INFINITY, 1.0), (f64::INFINITY, 1.0)),
(
(0.0, -0.0),
(f64::NEG_INFINITY, f64::NEG_INFINITY),
(f64::NEG_INFINITY, f64::NEG_INFINITY),
),
((0.0, -0.0), (0.0, 0.0), (0.0, 0.0)),
((0.0, -0.0), (-0.0, 0.0), (0.0, 0.0)),
((0.0, -0.0), (0.0, -0.0), (0.0, -0.0)),
((0.0, -0.0), (1.0, 2.0), (1.0, 2.0)),
((0.0, -0.0), (-3.0, 0.5), (-3.0, 0.5)),
((0.0, -0.0), (1e+300, 1e+300), (1e+300, 1e+300)),
((0.0, -0.0), (1e-300, -1e-300), (1e-300, -1e-300)),
((0.0, -0.0), (2.0, 0.0), (2.0, 0.0)),
((0.0, -0.0), (0.0, 1.0), (0.0, 1.0)),
(
(0.0, -0.0),
(f64::INFINITY, f64::NAN),
(f64::INFINITY, f64::NAN),
),
((0.0, -0.0), (f64::NAN, f64::NAN), (f64::NAN, f64::NAN)),
((0.0, -0.0), (5.0, -7.0), (5.0, -7.0)),
((0.0, -0.0), (1e+308, 1e-308), (1e+308, 1e-308)),
((0.0, -0.0), (-1.0, -0.0), (-1.0, -0.0)),
((1.0, 2.0), (f64::NAN, 0.0), (f64::NAN, 2.0)),
((1.0, 2.0), (f64::INFINITY, 1.0), (f64::INFINITY, 3.0)),
(
(1.0, 2.0),
(f64::NEG_INFINITY, f64::NEG_INFINITY),
(f64::NEG_INFINITY, f64::NEG_INFINITY),
),
((1.0, 2.0), (0.0, 0.0), (1.0, 2.0)),
((1.0, 2.0), (-0.0, 0.0), (1.0, 2.0)),
((1.0, 2.0), (0.0, -0.0), (1.0, 2.0)),
((1.0, 2.0), (1.0, 2.0), (2.0, 4.0)),
((1.0, 2.0), (-3.0, 0.5), (-2.0, 2.5)),
((1.0, 2.0), (1e+300, 1e+300), (1e+300, 1e+300)),
((1.0, 2.0), (1e-300, -1e-300), (1.0, 2.0)),
((1.0, 2.0), (2.0, 0.0), (3.0, 2.0)),
((1.0, 2.0), (0.0, 1.0), (1.0, 3.0)),
(
(1.0, 2.0),
(f64::INFINITY, f64::NAN),
(f64::INFINITY, f64::NAN),
),
((1.0, 2.0), (f64::NAN, f64::NAN), (f64::NAN, f64::NAN)),
((1.0, 2.0), (5.0, -7.0), (6.0, -5.0)),
((1.0, 2.0), (1e+308, 1e-308), (1e+308, 2.0)),
((1.0, 2.0), (-1.0, -0.0), (0.0, 2.0)),
((-3.0, 0.5), (f64::NAN, 0.0), (f64::NAN, 0.5)),
((-3.0, 0.5), (f64::INFINITY, 1.0), (f64::INFINITY, 1.5)),
(
(-3.0, 0.5),
(f64::NEG_INFINITY, f64::NEG_INFINITY),
(f64::NEG_INFINITY, f64::NEG_INFINITY),
),
((-3.0, 0.5), (0.0, 0.0), (-3.0, 0.5)),
((-3.0, 0.5), (-0.0, 0.0), (-3.0, 0.5)),
((-3.0, 0.5), (0.0, -0.0), (-3.0, 0.5)),
((-3.0, 0.5), (1.0, 2.0), (-2.0, 2.5)),
((-3.0, 0.5), (-3.0, 0.5), (-6.0, 1.0)),
((-3.0, 0.5), (1e+300, 1e+300), (1e+300, 1e+300)),
((-3.0, 0.5), (1e-300, -1e-300), (-3.0, 0.5)),
((-3.0, 0.5), (2.0, 0.0), (-1.0, 0.5)),
((-3.0, 0.5), (0.0, 1.0), (-3.0, 1.5)),
(
(-3.0, 0.5),
(f64::INFINITY, f64::NAN),
(f64::INFINITY, f64::NAN),
),
((-3.0, 0.5), (f64::NAN, f64::NAN), (f64::NAN, f64::NAN)),
((-3.0, 0.5), (5.0, -7.0), (2.0, -6.5)),
((-3.0, 0.5), (1e+308, 1e-308), (1e+308, 0.5)),
((-3.0, 0.5), (-1.0, -0.0), (-4.0, 0.5)),
((1e+300, 1e+300), (f64::NAN, 0.0), (f64::NAN, 1e+300)),
(
(1e+300, 1e+300),
(f64::INFINITY, 1.0),
(f64::INFINITY, 1e+300),
),
(
(1e+300, 1e+300),
(f64::NEG_INFINITY, f64::NEG_INFINITY),
(f64::NEG_INFINITY, f64::NEG_INFINITY),
),
((1e+300, 1e+300), (0.0, 0.0), (1e+300, 1e+300)),
((1e+300, 1e+300), (-0.0, 0.0), (1e+300, 1e+300)),
((1e+300, 1e+300), (0.0, -0.0), (1e+300, 1e+300)),
((1e+300, 1e+300), (1.0, 2.0), (1e+300, 1e+300)),
((1e+300, 1e+300), (-3.0, 0.5), (1e+300, 1e+300)),
((1e+300, 1e+300), (1e-300, -1e-300), (1e+300, 1e+300)),
((1e+300, 1e+300), (2.0, 0.0), (1e+300, 1e+300)),
((1e+300, 1e+300), (0.0, 1.0), (1e+300, 1e+300)),
(
(1e+300, 1e+300),
(f64::INFINITY, f64::NAN),
(f64::INFINITY, f64::NAN),
),
((1e+300, 1e+300), (f64::NAN, f64::NAN), (f64::NAN, f64::NAN)),
((1e+300, 1e+300), (5.0, -7.0), (1e+300, 1e+300)),
(
(1e+300, 1e+300),
(1e+308, 1e-308),
(1.00000001e+308, 1e+300),
),
((1e+300, 1e+300), (-1.0, -0.0), (1e+300, 1e+300)),
((1e-300, -1e-300), (f64::NAN, 0.0), (f64::NAN, -1e-300)),
(
(1e-300, -1e-300),
(f64::INFINITY, 1.0),
(f64::INFINITY, 1.0),
),
(
(1e-300, -1e-300),
(f64::NEG_INFINITY, f64::NEG_INFINITY),
(f64::NEG_INFINITY, f64::NEG_INFINITY),
),
((1e-300, -1e-300), (0.0, 0.0), (1e-300, -1e-300)),
((1e-300, -1e-300), (-0.0, 0.0), (1e-300, -1e-300)),
((1e-300, -1e-300), (0.0, -0.0), (1e-300, -1e-300)),
((1e-300, -1e-300), (1.0, 2.0), (1.0, 2.0)),
((1e-300, -1e-300), (-3.0, 0.5), (-3.0, 0.5)),
((1e-300, -1e-300), (1e+300, 1e+300), (1e+300, 1e+300)),
((1e-300, -1e-300), (1e-300, -1e-300), (2e-300, -2e-300)),
((1e-300, -1e-300), (2.0, 0.0), (2.0, -1e-300)),
((1e-300, -1e-300), (0.0, 1.0), (1e-300, 1.0)),
(
(1e-300, -1e-300),
(f64::INFINITY, f64::NAN),
(f64::INFINITY, f64::NAN),
),
(
(1e-300, -1e-300),
(f64::NAN, f64::NAN),
(f64::NAN, f64::NAN),
),
((1e-300, -1e-300), (5.0, -7.0), (5.0, -7.0)),
(
(1e-300, -1e-300),
(1e+308, 1e-308),
(1e+308, -9.9999999e-301),
),
((1e-300, -1e-300), (-1.0, -0.0), (-1.0, -1e-300)),
((2.0, 0.0), (f64::NAN, 0.0), (f64::NAN, 0.0)),
((2.0, 0.0), (f64::INFINITY, 1.0), (f64::INFINITY, 1.0)),
(
(2.0, 0.0),
(f64::NEG_INFINITY, f64::NEG_INFINITY),
(f64::NEG_INFINITY, f64::NEG_INFINITY),
),
((2.0, 0.0), (0.0, 0.0), (2.0, 0.0)),
((2.0, 0.0), (-0.0, 0.0), (2.0, 0.0)),
((2.0, 0.0), (0.0, -0.0), (2.0, 0.0)),
((2.0, 0.0), (1.0, 2.0), (3.0, 2.0)),
((2.0, 0.0), (-3.0, 0.5), (-1.0, 0.5)),
((2.0, 0.0), (1e+300, 1e+300), (1e+300, 1e+300)),
((2.0, 0.0), (1e-300, -1e-300), (2.0, -1e-300)),
((2.0, 0.0), (2.0, 0.0), (4.0, 0.0)),
((2.0, 0.0), (0.0, 1.0), (2.0, 1.0)),
(
(2.0, 0.0),
(f64::INFINITY, f64::NAN),
(f64::INFINITY, f64::NAN),
),
((2.0, 0.0), (f64::NAN, f64::NAN), (f64::NAN, f64::NAN)),
((2.0, 0.0), (5.0, -7.0), (7.0, -7.0)),
((2.0, 0.0), (1e+308, 1e-308), (1e+308, 1e-308)),
((2.0, 0.0), (-1.0, -0.0), (1.0, 0.0)),
((0.0, 1.0), (f64::NAN, 0.0), (f64::NAN, 1.0)),
((0.0, 1.0), (f64::INFINITY, 1.0), (f64::INFINITY, 2.0)),
(
(0.0, 1.0),
(f64::NEG_INFINITY, f64::NEG_INFINITY),
(f64::NEG_INFINITY, f64::NEG_INFINITY),
),
((0.0, 1.0), (0.0, 0.0), (0.0, 1.0)),
((0.0, 1.0), (-0.0, 0.0), (0.0, 1.0)),
((0.0, 1.0), (0.0, -0.0), (0.0, 1.0)),
((0.0, 1.0), (1.0, 2.0), (1.0, 3.0)),
((0.0, 1.0), (-3.0, 0.5), (-3.0, 1.5)),
((0.0, 1.0), (1e+300, 1e+300), (1e+300, 1e+300)),
((0.0, 1.0), (1e-300, -1e-300), (1e-300, 1.0)),
((0.0, 1.0), (2.0, 0.0), (2.0, 1.0)),
((0.0, 1.0), (0.0, 1.0), (0.0, 2.0)),
(
(0.0, 1.0),
(f64::INFINITY, f64::NAN),
(f64::INFINITY, f64::NAN),
),
((0.0, 1.0), (f64::NAN, f64::NAN), (f64::NAN, f64::NAN)),
((0.0, 1.0), (5.0, -7.0), (5.0, -6.0)),
((0.0, 1.0), (1e+308, 1e-308), (1e+308, 1.0)),
((0.0, 1.0), (-1.0, -0.0), (-1.0, 1.0)),
(
(f64::INFINITY, f64::NAN),
(f64::NAN, 0.0),
(f64::NAN, f64::NAN),
),
(
(f64::INFINITY, f64::NAN),
(f64::INFINITY, 1.0),
(f64::INFINITY, f64::NAN),
),
(
(f64::INFINITY, f64::NAN),
(f64::NEG_INFINITY, f64::NEG_INFINITY),
(f64::NAN, f64::NAN),
),
(
(f64::INFINITY, f64::NAN),
(0.0, 0.0),
(f64::INFINITY, f64::NAN),
),
(
(f64::INFINITY, f64::NAN),
(-0.0, 0.0),
(f64::INFINITY, f64::NAN),
),
(
(f64::INFINITY, f64::NAN),
(0.0, -0.0),
(f64::INFINITY, f64::NAN),
),
(
(f64::INFINITY, f64::NAN),
(1.0, 2.0),
(f64::INFINITY, f64::NAN),
),
(
(f64::INFINITY, f64::NAN),
(-3.0, 0.5),
(f64::INFINITY, f64::NAN),
),
(
(f64::INFINITY, f64::NAN),
(1e+300, 1e+300),
(f64::INFINITY, f64::NAN),
),
(
(f64::INFINITY, f64::NAN),
(1e-300, -1e-300),
(f64::INFINITY, f64::NAN),
),
(
(f64::INFINITY, f64::NAN),
(2.0, 0.0),
(f64::INFINITY, f64::NAN),
),
(
(f64::INFINITY, f64::NAN),
(0.0, 1.0),
(f64::INFINITY, f64::NAN),
),
(
(f64::INFINITY, f64::NAN),
(f64::INFINITY, f64::NAN),
(f64::INFINITY, f64::NAN),
),
(
(f64::INFINITY, f64::NAN),
(f64::NAN, f64::NAN),
(f64::NAN, f64::NAN),
),
(
(f64::INFINITY, f64::NAN),
(5.0, -7.0),
(f64::INFINITY, f64::NAN),
),
(
(f64::INFINITY, f64::NAN),
(1e+308, 1e-308),
(f64::INFINITY, f64::NAN),
),
(
(f64::INFINITY, f64::NAN),
(-1.0, -0.0),
(f64::INFINITY, f64::NAN),
),
((f64::NAN, f64::NAN), (f64::NAN, 0.0), (f64::NAN, f64::NAN)),
(
(f64::NAN, f64::NAN),
(f64::INFINITY, 1.0),
(f64::NAN, f64::NAN),
),
(
(f64::NAN, f64::NAN),
(f64::NEG_INFINITY, f64::NEG_INFINITY),
(f64::NAN, f64::NAN),
),
((f64::NAN, f64::NAN), (0.0, 0.0), (f64::NAN, f64::NAN)),
((f64::NAN, f64::NAN), (-0.0, 0.0), (f64::NAN, f64::NAN)),
((f64::NAN, f64::NAN), (0.0, -0.0), (f64::NAN, f64::NAN)),
((f64::NAN, f64::NAN), (1.0, 2.0), (f64::NAN, f64::NAN)),
((f64::NAN, f64::NAN), (-3.0, 0.5), (f64::NAN, f64::NAN)),
((f64::NAN, f64::NAN), (1e+300, 1e+300), (f64::NAN, f64::NAN)),
(
(f64::NAN, f64::NAN),
(1e-300, -1e-300),
(f64::NAN, f64::NAN),
),
((f64::NAN, f64::NAN), (2.0, 0.0), (f64::NAN, f64::NAN)),
((f64::NAN, f64::NAN), (0.0, 1.0), (f64::NAN, f64::NAN)),
(
(f64::NAN, f64::NAN),
(f64::INFINITY, f64::NAN),
(f64::NAN, f64::NAN),
),
(
(f64::NAN, f64::NAN),
(f64::NAN, f64::NAN),
(f64::NAN, f64::NAN),
),
((f64::NAN, f64::NAN), (5.0, -7.0), (f64::NAN, f64::NAN)),
((f64::NAN, f64::NAN), (1e+308, 1e-308), (f64::NAN, f64::NAN)),
((f64::NAN, f64::NAN), (-1.0, -0.0), (f64::NAN, f64::NAN)),
((5.0, -7.0), (f64::NAN, 0.0), (f64::NAN, -7.0)),
((5.0, -7.0), (f64::INFINITY, 1.0), (f64::INFINITY, -6.0)),
(
(5.0, -7.0),
(f64::NEG_INFINITY, f64::NEG_INFINITY),
(f64::NEG_INFINITY, f64::NEG_INFINITY),
),
((5.0, -7.0), (0.0, 0.0), (5.0, -7.0)),
((5.0, -7.0), (-0.0, 0.0), (5.0, -7.0)),
((5.0, -7.0), (0.0, -0.0), (5.0, -7.0)),
((5.0, -7.0), (1.0, 2.0), (6.0, -5.0)),
((5.0, -7.0), (-3.0, 0.5), (2.0, -6.5)),
((5.0, -7.0), (1e+300, 1e+300), (1e+300, 1e+300)),
((5.0, -7.0), (1e-300, -1e-300), (5.0, -7.0)),
((5.0, -7.0), (2.0, 0.0), (7.0, -7.0)),
((5.0, -7.0), (0.0, 1.0), (5.0, -6.0)),
(
(5.0, -7.0),
(f64::INFINITY, f64::NAN),
(f64::INFINITY, f64::NAN),
),
((5.0, -7.0), (f64::NAN, f64::NAN), (f64::NAN, f64::NAN)),
((5.0, -7.0), (5.0, -7.0), (10.0, -14.0)),
((5.0, -7.0), (1e+308, 1e-308), (1e+308, -7.0)),
((5.0, -7.0), (-1.0, -0.0), (4.0, -7.0)),
((1e+308, 1e-308), (f64::NAN, 0.0), (f64::NAN, 1e-308)),
((1e+308, 1e-308), (f64::INFINITY, 1.0), (f64::INFINITY, 1.0)),
(
(1e+308, 1e-308),
(f64::NEG_INFINITY, f64::NEG_INFINITY),
(f64::NEG_INFINITY, f64::NEG_INFINITY),
),
((1e+308, 1e-308), (0.0, 0.0), (1e+308, 1e-308)),
((1e+308, 1e-308), (-0.0, 0.0), (1e+308, 1e-308)),
((1e+308, 1e-308), (0.0, -0.0), (1e+308, 1e-308)),
((1e+308, 1e-308), (1.0, 2.0), (1e+308, 2.0)),
((1e+308, 1e-308), (-3.0, 0.5), (1e+308, 0.5)),
(
(1e+308, 1e-308),
(1e+300, 1e+300),
(1.00000001e+308, 1e+300),
),
(
(1e+308, 1e-308),
(1e-300, -1e-300),
(1e+308, -9.9999999e-301),
),
((1e+308, 1e-308), (2.0, 0.0), (1e+308, 1e-308)),
((1e+308, 1e-308), (0.0, 1.0), (1e+308, 1.0)),
(
(1e+308, 1e-308),
(f64::INFINITY, f64::NAN),
(f64::INFINITY, f64::NAN),
),
((1e+308, 1e-308), (f64::NAN, f64::NAN), (f64::NAN, f64::NAN)),
((1e+308, 1e-308), (5.0, -7.0), (1e+308, -7.0)),
((1e+308, 1e-308), (1e+308, 1e-308), (f64::INFINITY, 2e-308)),
((1e+308, 1e-308), (-1.0, -0.0), (1e+308, 1e-308)),
((-1.0, -0.0), (f64::NAN, 0.0), (f64::NAN, 0.0)),
((-1.0, -0.0), (f64::INFINITY, 1.0), (f64::INFINITY, 1.0)),
(
(-1.0, -0.0),
(f64::NEG_INFINITY, f64::NEG_INFINITY),
(f64::NEG_INFINITY, f64::NEG_INFINITY),
),
((-1.0, -0.0), (0.0, 0.0), (-1.0, 0.0)),
((-1.0, -0.0), (-0.0, 0.0), (-1.0, 0.0)),
((-1.0, -0.0), (0.0, -0.0), (-1.0, -0.0)),
((-1.0, -0.0), (1.0, 2.0), (0.0, 2.0)),
((-1.0, -0.0), (-3.0, 0.5), (-4.0, 0.5)),
((-1.0, -0.0), (1e+300, 1e+300), (1e+300, 1e+300)),
((-1.0, -0.0), (1e-300, -1e-300), (-1.0, -1e-300)),
((-1.0, -0.0), (2.0, 0.0), (1.0, 0.0)),
((-1.0, -0.0), (0.0, 1.0), (-1.0, 1.0)),
(
(-1.0, -0.0),
(f64::INFINITY, f64::NAN),
(f64::INFINITY, f64::NAN),
),
((-1.0, -0.0), (f64::NAN, f64::NAN), (f64::NAN, f64::NAN)),
((-1.0, -0.0), (5.0, -7.0), (4.0, -7.0)),
((-1.0, -0.0), (1e+308, 1e-308), (1e+308, 1e-308)),
((-1.0, -0.0), (-1.0, -0.0), (-2.0, -0.0)),
];
for &((ar, ai), (br, bi), want) in CASES {
let (a, b) = (Complex::new(ar, ai), Complex::new(br, bi));
check_c("add", &format!("{a:?}, {b:?}"), a + b, want, 1e-5, false);
let mut t = a;
t += b;
check_c("add_assign", &format!("{a:?}, {b:?}"), t, want, 1e-5, false);
}
}
#[test]
fn complex_sub_f64() {
let _report = Report;
const CASES: &[((f64, f64), (f64, f64), (f64, f64))] = &[
((f64::NAN, 0.0), (f64::NAN, 0.0), (f64::NAN, 0.0)),
((f64::NAN, 0.0), (f64::INFINITY, 1.0), (f64::NAN, -1.0)),
(
(f64::NAN, 0.0),
(f64::NEG_INFINITY, f64::NEG_INFINITY),
(f64::NAN, f64::INFINITY),
),
((f64::NAN, 0.0), (0.0, 0.0), (f64::NAN, 0.0)),
((f64::NAN, 0.0), (-0.0, 0.0), (f64::NAN, 0.0)),
((f64::NAN, 0.0), (0.0, -0.0), (f64::NAN, 0.0)),
((f64::NAN, 0.0), (1.0, 2.0), (f64::NAN, -2.0)),
((f64::NAN, 0.0), (-3.0, 0.5), (f64::NAN, -0.5)),
((f64::NAN, 0.0), (1e+300, 1e+300), (f64::NAN, -1e+300)),
((f64::NAN, 0.0), (1e-300, -1e-300), (f64::NAN, 1e-300)),
((f64::NAN, 0.0), (2.0, 0.0), (f64::NAN, 0.0)),
((f64::NAN, 0.0), (0.0, 1.0), (f64::NAN, -1.0)),
(
(f64::NAN, 0.0),
(f64::INFINITY, f64::NAN),
(f64::NAN, f64::NAN),
),
((f64::NAN, 0.0), (f64::NAN, f64::NAN), (f64::NAN, f64::NAN)),
((f64::NAN, 0.0), (5.0, -7.0), (f64::NAN, 7.0)),
((f64::NAN, 0.0), (1e+308, 1e-308), (f64::NAN, -1e-308)),
((f64::NAN, 0.0), (-1.0, -0.0), (f64::NAN, 0.0)),
((f64::INFINITY, 1.0), (f64::NAN, 0.0), (f64::NAN, 1.0)),
((f64::INFINITY, 1.0), (f64::INFINITY, 1.0), (f64::NAN, 0.0)),
(
(f64::INFINITY, 1.0),
(f64::NEG_INFINITY, f64::NEG_INFINITY),
(f64::INFINITY, f64::INFINITY),
),
((f64::INFINITY, 1.0), (0.0, 0.0), (f64::INFINITY, 1.0)),
((f64::INFINITY, 1.0), (-0.0, 0.0), (f64::INFINITY, 1.0)),
((f64::INFINITY, 1.0), (0.0, -0.0), (f64::INFINITY, 1.0)),
((f64::INFINITY, 1.0), (1.0, 2.0), (f64::INFINITY, -1.0)),
((f64::INFINITY, 1.0), (-3.0, 0.5), (f64::INFINITY, 0.5)),
(
(f64::INFINITY, 1.0),
(1e+300, 1e+300),
(f64::INFINITY, -1e+300),
),
(
(f64::INFINITY, 1.0),
(1e-300, -1e-300),
(f64::INFINITY, 1.0),
),
((f64::INFINITY, 1.0), (2.0, 0.0), (f64::INFINITY, 1.0)),
((f64::INFINITY, 1.0), (0.0, 1.0), (f64::INFINITY, 0.0)),
(
(f64::INFINITY, 1.0),
(f64::INFINITY, f64::NAN),
(f64::NAN, f64::NAN),
),
(
(f64::INFINITY, 1.0),
(f64::NAN, f64::NAN),
(f64::NAN, f64::NAN),
),
((f64::INFINITY, 1.0), (5.0, -7.0), (f64::INFINITY, 8.0)),
((f64::INFINITY, 1.0), (1e+308, 1e-308), (f64::INFINITY, 1.0)),
((f64::INFINITY, 1.0), (-1.0, -0.0), (f64::INFINITY, 1.0)),
(
(f64::NEG_INFINITY, f64::NEG_INFINITY),
(f64::NAN, 0.0),
(f64::NAN, f64::NEG_INFINITY),
),
(
(f64::NEG_INFINITY, f64::NEG_INFINITY),
(f64::INFINITY, 1.0),
(f64::NEG_INFINITY, f64::NEG_INFINITY),
),
(
(f64::NEG_INFINITY, f64::NEG_INFINITY),
(f64::NEG_INFINITY, f64::NEG_INFINITY),
(f64::NAN, f64::NAN),
),
(
(f64::NEG_INFINITY, f64::NEG_INFINITY),
(0.0, 0.0),
(f64::NEG_INFINITY, f64::NEG_INFINITY),
),
(
(f64::NEG_INFINITY, f64::NEG_INFINITY),
(-0.0, 0.0),
(f64::NEG_INFINITY, f64::NEG_INFINITY),
),
(
(f64::NEG_INFINITY, f64::NEG_INFINITY),
(0.0, -0.0),
(f64::NEG_INFINITY, f64::NEG_INFINITY),
),
(
(f64::NEG_INFINITY, f64::NEG_INFINITY),
(1.0, 2.0),
(f64::NEG_INFINITY, f64::NEG_INFINITY),
),
(
(f64::NEG_INFINITY, f64::NEG_INFINITY),
(-3.0, 0.5),
(f64::NEG_INFINITY, f64::NEG_INFINITY),
),
(
(f64::NEG_INFINITY, f64::NEG_INFINITY),
(1e+300, 1e+300),
(f64::NEG_INFINITY, f64::NEG_INFINITY),
),
(
(f64::NEG_INFINITY, f64::NEG_INFINITY),
(1e-300, -1e-300),
(f64::NEG_INFINITY, f64::NEG_INFINITY),
),
(
(f64::NEG_INFINITY, f64::NEG_INFINITY),
(2.0, 0.0),
(f64::NEG_INFINITY, f64::NEG_INFINITY),
),
(
(f64::NEG_INFINITY, f64::NEG_INFINITY),
(0.0, 1.0),
(f64::NEG_INFINITY, f64::NEG_INFINITY),
),
(
(f64::NEG_INFINITY, f64::NEG_INFINITY),
(f64::INFINITY, f64::NAN),
(f64::NEG_INFINITY, f64::NAN),
),
(
(f64::NEG_INFINITY, f64::NEG_INFINITY),
(f64::NAN, f64::NAN),
(f64::NAN, f64::NAN),
),
(
(f64::NEG_INFINITY, f64::NEG_INFINITY),
(5.0, -7.0),
(f64::NEG_INFINITY, f64::NEG_INFINITY),
),
(
(f64::NEG_INFINITY, f64::NEG_INFINITY),
(1e+308, 1e-308),
(f64::NEG_INFINITY, f64::NEG_INFINITY),
),
(
(f64::NEG_INFINITY, f64::NEG_INFINITY),
(-1.0, -0.0),
(f64::NEG_INFINITY, f64::NEG_INFINITY),
),
((0.0, 0.0), (f64::NAN, 0.0), (f64::NAN, 0.0)),
((0.0, 0.0), (f64::INFINITY, 1.0), (f64::NEG_INFINITY, -1.0)),
(
(0.0, 0.0),
(f64::NEG_INFINITY, f64::NEG_INFINITY),
(f64::INFINITY, f64::INFINITY),
),
((0.0, 0.0), (0.0, 0.0), (0.0, 0.0)),
((0.0, 0.0), (-0.0, 0.0), (0.0, 0.0)),
((0.0, 0.0), (0.0, -0.0), (0.0, 0.0)),
((0.0, 0.0), (1.0, 2.0), (-1.0, -2.0)),
((0.0, 0.0), (-3.0, 0.5), (3.0, -0.5)),
((0.0, 0.0), (1e+300, 1e+300), (-1e+300, -1e+300)),
((0.0, 0.0), (1e-300, -1e-300), (-1e-300, 1e-300)),
((0.0, 0.0), (2.0, 0.0), (-2.0, 0.0)),
((0.0, 0.0), (0.0, 1.0), (0.0, -1.0)),
(
(0.0, 0.0),
(f64::INFINITY, f64::NAN),
(f64::NEG_INFINITY, f64::NAN),
),
((0.0, 0.0), (f64::NAN, f64::NAN), (f64::NAN, f64::NAN)),
((0.0, 0.0), (5.0, -7.0), (-5.0, 7.0)),
((0.0, 0.0), (1e+308, 1e-308), (-1e+308, -1e-308)),
((0.0, 0.0), (-1.0, -0.0), (1.0, 0.0)),
((-0.0, 0.0), (f64::NAN, 0.0), (f64::NAN, 0.0)),
((-0.0, 0.0), (f64::INFINITY, 1.0), (f64::NEG_INFINITY, -1.0)),
(
(-0.0, 0.0),
(f64::NEG_INFINITY, f64::NEG_INFINITY),
(f64::INFINITY, f64::INFINITY),
),
((-0.0, 0.0), (0.0, 0.0), (-0.0, 0.0)),
((-0.0, 0.0), (-0.0, 0.0), (0.0, 0.0)),
((-0.0, 0.0), (0.0, -0.0), (-0.0, 0.0)),
((-0.0, 0.0), (1.0, 2.0), (-1.0, -2.0)),
((-0.0, 0.0), (-3.0, 0.5), (3.0, -0.5)),
((-0.0, 0.0), (1e+300, 1e+300), (-1e+300, -1e+300)),
((-0.0, 0.0), (1e-300, -1e-300), (-1e-300, 1e-300)),
((-0.0, 0.0), (2.0, 0.0), (-2.0, 0.0)),
((-0.0, 0.0), (0.0, 1.0), (-0.0, -1.0)),
(
(-0.0, 0.0),
(f64::INFINITY, f64::NAN),
(f64::NEG_INFINITY, f64::NAN),
),
((-0.0, 0.0), (f64::NAN, f64::NAN), (f64::NAN, f64::NAN)),
((-0.0, 0.0), (5.0, -7.0), (-5.0, 7.0)),
((-0.0, 0.0), (1e+308, 1e-308), (-1e+308, -1e-308)),
((-0.0, 0.0), (-1.0, -0.0), (1.0, 0.0)),
((0.0, -0.0), (f64::NAN, 0.0), (f64::NAN, -0.0)),
((0.0, -0.0), (f64::INFINITY, 1.0), (f64::NEG_INFINITY, -1.0)),
(
(0.0, -0.0),
(f64::NEG_INFINITY, f64::NEG_INFINITY),
(f64::INFINITY, f64::INFINITY),
),
((0.0, -0.0), (0.0, 0.0), (0.0, -0.0)),
((0.0, -0.0), (-0.0, 0.0), (0.0, -0.0)),
((0.0, -0.0), (0.0, -0.0), (0.0, 0.0)),
((0.0, -0.0), (1.0, 2.0), (-1.0, -2.0)),
((0.0, -0.0), (-3.0, 0.5), (3.0, -0.5)),
((0.0, -0.0), (1e+300, 1e+300), (-1e+300, -1e+300)),
((0.0, -0.0), (1e-300, -1e-300), (-1e-300, 1e-300)),
((0.0, -0.0), (2.0, 0.0), (-2.0, -0.0)),
((0.0, -0.0), (0.0, 1.0), (0.0, -1.0)),
(
(0.0, -0.0),
(f64::INFINITY, f64::NAN),
(f64::NEG_INFINITY, f64::NAN),
),
((0.0, -0.0), (f64::NAN, f64::NAN), (f64::NAN, f64::NAN)),
((0.0, -0.0), (5.0, -7.0), (-5.0, 7.0)),
((0.0, -0.0), (1e+308, 1e-308), (-1e+308, -1e-308)),
((0.0, -0.0), (-1.0, -0.0), (1.0, 0.0)),
((1.0, 2.0), (f64::NAN, 0.0), (f64::NAN, 2.0)),
((1.0, 2.0), (f64::INFINITY, 1.0), (f64::NEG_INFINITY, 1.0)),
(
(1.0, 2.0),
(f64::NEG_INFINITY, f64::NEG_INFINITY),
(f64::INFINITY, f64::INFINITY),
),
((1.0, 2.0), (0.0, 0.0), (1.0, 2.0)),
((1.0, 2.0), (-0.0, 0.0), (1.0, 2.0)),
((1.0, 2.0), (0.0, -0.0), (1.0, 2.0)),
((1.0, 2.0), (1.0, 2.0), (0.0, 0.0)),
((1.0, 2.0), (-3.0, 0.5), (4.0, 1.5)),
((1.0, 2.0), (1e+300, 1e+300), (-1e+300, -1e+300)),
((1.0, 2.0), (1e-300, -1e-300), (1.0, 2.0)),
((1.0, 2.0), (2.0, 0.0), (-1.0, 2.0)),
((1.0, 2.0), (0.0, 1.0), (1.0, 1.0)),
(
(1.0, 2.0),
(f64::INFINITY, f64::NAN),
(f64::NEG_INFINITY, f64::NAN),
),
((1.0, 2.0), (f64::NAN, f64::NAN), (f64::NAN, f64::NAN)),
((1.0, 2.0), (5.0, -7.0), (-4.0, 9.0)),
((1.0, 2.0), (1e+308, 1e-308), (-1e+308, 2.0)),
((1.0, 2.0), (-1.0, -0.0), (2.0, 2.0)),
((-3.0, 0.5), (f64::NAN, 0.0), (f64::NAN, 0.5)),
((-3.0, 0.5), (f64::INFINITY, 1.0), (f64::NEG_INFINITY, -0.5)),
(
(-3.0, 0.5),
(f64::NEG_INFINITY, f64::NEG_INFINITY),
(f64::INFINITY, f64::INFINITY),
),
((-3.0, 0.5), (0.0, 0.0), (-3.0, 0.5)),
((-3.0, 0.5), (-0.0, 0.0), (-3.0, 0.5)),
((-3.0, 0.5), (0.0, -0.0), (-3.0, 0.5)),
((-3.0, 0.5), (1.0, 2.0), (-4.0, -1.5)),
((-3.0, 0.5), (-3.0, 0.5), (0.0, 0.0)),
((-3.0, 0.5), (1e+300, 1e+300), (-1e+300, -1e+300)),
((-3.0, 0.5), (1e-300, -1e-300), (-3.0, 0.5)),
((-3.0, 0.5), (2.0, 0.0), (-5.0, 0.5)),
((-3.0, 0.5), (0.0, 1.0), (-3.0, -0.5)),
(
(-3.0, 0.5),
(f64::INFINITY, f64::NAN),
(f64::NEG_INFINITY, f64::NAN),
),
((-3.0, 0.5), (f64::NAN, f64::NAN), (f64::NAN, f64::NAN)),
((-3.0, 0.5), (5.0, -7.0), (-8.0, 7.5)),
((-3.0, 0.5), (1e+308, 1e-308), (-1e+308, 0.5)),
((-3.0, 0.5), (-1.0, -0.0), (-2.0, 0.5)),
((1e+300, 1e+300), (f64::NAN, 0.0), (f64::NAN, 1e+300)),
(
(1e+300, 1e+300),
(f64::INFINITY, 1.0),
(f64::NEG_INFINITY, 1e+300),
),
(
(1e+300, 1e+300),
(f64::NEG_INFINITY, f64::NEG_INFINITY),
(f64::INFINITY, f64::INFINITY),
),
((1e+300, 1e+300), (0.0, 0.0), (1e+300, 1e+300)),
((1e+300, 1e+300), (-0.0, 0.0), (1e+300, 1e+300)),
((1e+300, 1e+300), (0.0, -0.0), (1e+300, 1e+300)),
((1e+300, 1e+300), (1.0, 2.0), (1e+300, 1e+300)),
((1e+300, 1e+300), (-3.0, 0.5), (1e+300, 1e+300)),
((1e+300, 1e+300), (1e-300, -1e-300), (1e+300, 1e+300)),
((1e+300, 1e+300), (2.0, 0.0), (1e+300, 1e+300)),
((1e+300, 1e+300), (0.0, 1.0), (1e+300, 1e+300)),
(
(1e+300, 1e+300),
(f64::INFINITY, f64::NAN),
(f64::NEG_INFINITY, f64::NAN),
),
((1e+300, 1e+300), (f64::NAN, f64::NAN), (f64::NAN, f64::NAN)),
((1e+300, 1e+300), (5.0, -7.0), (1e+300, 1e+300)),
(
(1e+300, 1e+300),
(1e+308, 1e-308),
(-9.9999999e+307, 1e+300),
),
((1e+300, 1e+300), (-1.0, -0.0), (1e+300, 1e+300)),
((1e-300, -1e-300), (f64::NAN, 0.0), (f64::NAN, -1e-300)),
(
(1e-300, -1e-300),
(f64::INFINITY, 1.0),
(f64::NEG_INFINITY, -1.0),
),
(
(1e-300, -1e-300),
(f64::NEG_INFINITY, f64::NEG_INFINITY),
(f64::INFINITY, f64::INFINITY),
),
((1e-300, -1e-300), (0.0, 0.0), (1e-300, -1e-300)),
((1e-300, -1e-300), (-0.0, 0.0), (1e-300, -1e-300)),
((1e-300, -1e-300), (0.0, -0.0), (1e-300, -1e-300)),
((1e-300, -1e-300), (1.0, 2.0), (-1.0, -2.0)),
((1e-300, -1e-300), (-3.0, 0.5), (3.0, -0.5)),
((1e-300, -1e-300), (1e+300, 1e+300), (-1e+300, -1e+300)),
((1e-300, -1e-300), (1e-300, -1e-300), (0.0, 0.0)),
((1e-300, -1e-300), (2.0, 0.0), (-2.0, -1e-300)),
((1e-300, -1e-300), (0.0, 1.0), (1e-300, -1.0)),
(
(1e-300, -1e-300),
(f64::INFINITY, f64::NAN),
(f64::NEG_INFINITY, f64::NAN),
),
(
(1e-300, -1e-300),
(f64::NAN, f64::NAN),
(f64::NAN, f64::NAN),
),
((1e-300, -1e-300), (5.0, -7.0), (-5.0, 7.0)),
(
(1e-300, -1e-300),
(1e+308, 1e-308),
(-1e+308, -1.00000001e-300),
),
((1e-300, -1e-300), (-1.0, -0.0), (1.0, -1e-300)),
((2.0, 0.0), (f64::NAN, 0.0), (f64::NAN, 0.0)),
((2.0, 0.0), (f64::INFINITY, 1.0), (f64::NEG_INFINITY, -1.0)),
(
(2.0, 0.0),
(f64::NEG_INFINITY, f64::NEG_INFINITY),
(f64::INFINITY, f64::INFINITY),
),
((2.0, 0.0), (0.0, 0.0), (2.0, 0.0)),
((2.0, 0.0), (-0.0, 0.0), (2.0, 0.0)),
((2.0, 0.0), (0.0, -0.0), (2.0, 0.0)),
((2.0, 0.0), (1.0, 2.0), (1.0, -2.0)),
((2.0, 0.0), (-3.0, 0.5), (5.0, -0.5)),
((2.0, 0.0), (1e+300, 1e+300), (-1e+300, -1e+300)),
((2.0, 0.0), (1e-300, -1e-300), (2.0, 1e-300)),
((2.0, 0.0), (2.0, 0.0), (0.0, 0.0)),
((2.0, 0.0), (0.0, 1.0), (2.0, -1.0)),
(
(2.0, 0.0),
(f64::INFINITY, f64::NAN),
(f64::NEG_INFINITY, f64::NAN),
),
((2.0, 0.0), (f64::NAN, f64::NAN), (f64::NAN, f64::NAN)),
((2.0, 0.0), (5.0, -7.0), (-3.0, 7.0)),
((2.0, 0.0), (1e+308, 1e-308), (-1e+308, -1e-308)),
((2.0, 0.0), (-1.0, -0.0), (3.0, 0.0)),
((0.0, 1.0), (f64::NAN, 0.0), (f64::NAN, 1.0)),
((0.0, 1.0), (f64::INFINITY, 1.0), (f64::NEG_INFINITY, 0.0)),
(
(0.0, 1.0),
(f64::NEG_INFINITY, f64::NEG_INFINITY),
(f64::INFINITY, f64::INFINITY),
),
((0.0, 1.0), (0.0, 0.0), (0.0, 1.0)),
((0.0, 1.0), (-0.0, 0.0), (0.0, 1.0)),
((0.0, 1.0), (0.0, -0.0), (0.0, 1.0)),
((0.0, 1.0), (1.0, 2.0), (-1.0, -1.0)),
((0.0, 1.0), (-3.0, 0.5), (3.0, 0.5)),
((0.0, 1.0), (1e+300, 1e+300), (-1e+300, -1e+300)),
((0.0, 1.0), (1e-300, -1e-300), (-1e-300, 1.0)),
((0.0, 1.0), (2.0, 0.0), (-2.0, 1.0)),
((0.0, 1.0), (0.0, 1.0), (0.0, 0.0)),
(
(0.0, 1.0),
(f64::INFINITY, f64::NAN),
(f64::NEG_INFINITY, f64::NAN),
),
((0.0, 1.0), (f64::NAN, f64::NAN), (f64::NAN, f64::NAN)),
((0.0, 1.0), (5.0, -7.0), (-5.0, 8.0)),
((0.0, 1.0), (1e+308, 1e-308), (-1e+308, 1.0)),
((0.0, 1.0), (-1.0, -0.0), (1.0, 1.0)),
(
(f64::INFINITY, f64::NAN),
(f64::NAN, 0.0),
(f64::NAN, f64::NAN),
),
(
(f64::INFINITY, f64::NAN),
(f64::INFINITY, 1.0),
(f64::NAN, f64::NAN),
),
(
(f64::INFINITY, f64::NAN),
(f64::NEG_INFINITY, f64::NEG_INFINITY),
(f64::INFINITY, f64::NAN),
),
(
(f64::INFINITY, f64::NAN),
(0.0, 0.0),
(f64::INFINITY, f64::NAN),
),
(
(f64::INFINITY, f64::NAN),
(-0.0, 0.0),
(f64::INFINITY, f64::NAN),
),
(
(f64::INFINITY, f64::NAN),
(0.0, -0.0),
(f64::INFINITY, f64::NAN),
),
(
(f64::INFINITY, f64::NAN),
(1.0, 2.0),
(f64::INFINITY, f64::NAN),
),
(
(f64::INFINITY, f64::NAN),
(-3.0, 0.5),
(f64::INFINITY, f64::NAN),
),
(
(f64::INFINITY, f64::NAN),
(1e+300, 1e+300),
(f64::INFINITY, f64::NAN),
),
(
(f64::INFINITY, f64::NAN),
(1e-300, -1e-300),
(f64::INFINITY, f64::NAN),
),
(
(f64::INFINITY, f64::NAN),
(2.0, 0.0),
(f64::INFINITY, f64::NAN),
),
(
(f64::INFINITY, f64::NAN),
(0.0, 1.0),
(f64::INFINITY, f64::NAN),
),
(
(f64::INFINITY, f64::NAN),
(f64::INFINITY, f64::NAN),
(f64::NAN, f64::NAN),
),
(
(f64::INFINITY, f64::NAN),
(f64::NAN, f64::NAN),
(f64::NAN, f64::NAN),
),
(
(f64::INFINITY, f64::NAN),
(5.0, -7.0),
(f64::INFINITY, f64::NAN),
),
(
(f64::INFINITY, f64::NAN),
(1e+308, 1e-308),
(f64::INFINITY, f64::NAN),
),
(
(f64::INFINITY, f64::NAN),
(-1.0, -0.0),
(f64::INFINITY, f64::NAN),
),
((f64::NAN, f64::NAN), (f64::NAN, 0.0), (f64::NAN, f64::NAN)),
(
(f64::NAN, f64::NAN),
(f64::INFINITY, 1.0),
(f64::NAN, f64::NAN),
),
(
(f64::NAN, f64::NAN),
(f64::NEG_INFINITY, f64::NEG_INFINITY),
(f64::NAN, f64::NAN),
),
((f64::NAN, f64::NAN), (0.0, 0.0), (f64::NAN, f64::NAN)),
((f64::NAN, f64::NAN), (-0.0, 0.0), (f64::NAN, f64::NAN)),
((f64::NAN, f64::NAN), (0.0, -0.0), (f64::NAN, f64::NAN)),
((f64::NAN, f64::NAN), (1.0, 2.0), (f64::NAN, f64::NAN)),
((f64::NAN, f64::NAN), (-3.0, 0.5), (f64::NAN, f64::NAN)),
((f64::NAN, f64::NAN), (1e+300, 1e+300), (f64::NAN, f64::NAN)),
(
(f64::NAN, f64::NAN),
(1e-300, -1e-300),
(f64::NAN, f64::NAN),
),
((f64::NAN, f64::NAN), (2.0, 0.0), (f64::NAN, f64::NAN)),
((f64::NAN, f64::NAN), (0.0, 1.0), (f64::NAN, f64::NAN)),
(
(f64::NAN, f64::NAN),
(f64::INFINITY, f64::NAN),
(f64::NAN, f64::NAN),
),
(
(f64::NAN, f64::NAN),
(f64::NAN, f64::NAN),
(f64::NAN, f64::NAN),
),
((f64::NAN, f64::NAN), (5.0, -7.0), (f64::NAN, f64::NAN)),
((f64::NAN, f64::NAN), (1e+308, 1e-308), (f64::NAN, f64::NAN)),
((f64::NAN, f64::NAN), (-1.0, -0.0), (f64::NAN, f64::NAN)),
((5.0, -7.0), (f64::NAN, 0.0), (f64::NAN, -7.0)),
((5.0, -7.0), (f64::INFINITY, 1.0), (f64::NEG_INFINITY, -8.0)),
(
(5.0, -7.0),
(f64::NEG_INFINITY, f64::NEG_INFINITY),
(f64::INFINITY, f64::INFINITY),
),
((5.0, -7.0), (0.0, 0.0), (5.0, -7.0)),
((5.0, -7.0), (-0.0, 0.0), (5.0, -7.0)),
((5.0, -7.0), (0.0, -0.0), (5.0, -7.0)),
((5.0, -7.0), (1.0, 2.0), (4.0, -9.0)),
((5.0, -7.0), (-3.0, 0.5), (8.0, -7.5)),
((5.0, -7.0), (1e+300, 1e+300), (-1e+300, -1e+300)),
((5.0, -7.0), (1e-300, -1e-300), (5.0, -7.0)),
((5.0, -7.0), (2.0, 0.0), (3.0, -7.0)),
((5.0, -7.0), (0.0, 1.0), (5.0, -8.0)),
(
(5.0, -7.0),
(f64::INFINITY, f64::NAN),
(f64::NEG_INFINITY, f64::NAN),
),
((5.0, -7.0), (f64::NAN, f64::NAN), (f64::NAN, f64::NAN)),
((5.0, -7.0), (5.0, -7.0), (0.0, 0.0)),
((5.0, -7.0), (1e+308, 1e-308), (-1e+308, -7.0)),
((5.0, -7.0), (-1.0, -0.0), (6.0, -7.0)),
((1e+308, 1e-308), (f64::NAN, 0.0), (f64::NAN, 1e-308)),
(
(1e+308, 1e-308),
(f64::INFINITY, 1.0),
(f64::NEG_INFINITY, -1.0),
),
(
(1e+308, 1e-308),
(f64::NEG_INFINITY, f64::NEG_INFINITY),
(f64::INFINITY, f64::INFINITY),
),
((1e+308, 1e-308), (0.0, 0.0), (1e+308, 1e-308)),
((1e+308, 1e-308), (-0.0, 0.0), (1e+308, 1e-308)),
((1e+308, 1e-308), (0.0, -0.0), (1e+308, 1e-308)),
((1e+308, 1e-308), (1.0, 2.0), (1e+308, -2.0)),
((1e+308, 1e-308), (-3.0, 0.5), (1e+308, -0.5)),
(
(1e+308, 1e-308),
(1e+300, 1e+300),
(9.9999999e+307, -1e+300),
),
(
(1e+308, 1e-308),
(1e-300, -1e-300),
(1e+308, 1.00000001e-300),
),
((1e+308, 1e-308), (2.0, 0.0), (1e+308, 1e-308)),
((1e+308, 1e-308), (0.0, 1.0), (1e+308, -1.0)),
(
(1e+308, 1e-308),
(f64::INFINITY, f64::NAN),
(f64::NEG_INFINITY, f64::NAN),
),
((1e+308, 1e-308), (f64::NAN, f64::NAN), (f64::NAN, f64::NAN)),
((1e+308, 1e-308), (5.0, -7.0), (1e+308, 7.0)),
((1e+308, 1e-308), (1e+308, 1e-308), (0.0, 0.0)),
((1e+308, 1e-308), (-1.0, -0.0), (1e+308, 1e-308)),
((-1.0, -0.0), (f64::NAN, 0.0), (f64::NAN, -0.0)),
(
(-1.0, -0.0),
(f64::INFINITY, 1.0),
(f64::NEG_INFINITY, -1.0),
),
(
(-1.0, -0.0),
(f64::NEG_INFINITY, f64::NEG_INFINITY),
(f64::INFINITY, f64::INFINITY),
),
((-1.0, -0.0), (0.0, 0.0), (-1.0, -0.0)),
((-1.0, -0.0), (-0.0, 0.0), (-1.0, -0.0)),
((-1.0, -0.0), (0.0, -0.0), (-1.0, 0.0)),
((-1.0, -0.0), (1.0, 2.0), (-2.0, -2.0)),
((-1.0, -0.0), (-3.0, 0.5), (2.0, -0.5)),
((-1.0, -0.0), (1e+300, 1e+300), (-1e+300, -1e+300)),
((-1.0, -0.0), (1e-300, -1e-300), (-1.0, 1e-300)),
((-1.0, -0.0), (2.0, 0.0), (-3.0, -0.0)),
((-1.0, -0.0), (0.0, 1.0), (-1.0, -1.0)),
(
(-1.0, -0.0),
(f64::INFINITY, f64::NAN),
(f64::NEG_INFINITY, f64::NAN),
),
((-1.0, -0.0), (f64::NAN, f64::NAN), (f64::NAN, f64::NAN)),
((-1.0, -0.0), (5.0, -7.0), (-6.0, 7.0)),
((-1.0, -0.0), (1e+308, 1e-308), (-1e+308, -1e-308)),
((-1.0, -0.0), (-1.0, -0.0), (0.0, 0.0)),
];
for &((ar, ai), (br, bi), want) in CASES {
let (a, b) = (Complex::new(ar, ai), Complex::new(br, bi));
check_c("sub", &format!("{a:?}, {b:?}"), a - b, want, 1e-5, false);
let mut t = a;
t -= b;
check_c("sub_assign", &format!("{a:?}, {b:?}"), t, want, 1e-5, false);
}
}
#[test]
fn complex_mul_f64() {
let _report = Report;
const CASES: &[((f64, f64), (f64, f64), (f64, f64))] = &[
((f64::NAN, 0.0), (f64::NAN, 0.0), (f64::NAN, f64::NAN)),
((f64::NAN, 0.0), (f64::INFINITY, 1.0), (f64::NAN, f64::NAN)),
(
(f64::NAN, 0.0),
(f64::NEG_INFINITY, f64::NEG_INFINITY),
(f64::NAN, f64::NAN),
),
((f64::NAN, 0.0), (0.0, 0.0), (f64::NAN, f64::NAN)),
((f64::NAN, 0.0), (-0.0, 0.0), (f64::NAN, f64::NAN)),
((f64::NAN, 0.0), (0.0, -0.0), (f64::NAN, f64::NAN)),
((f64::NAN, 0.0), (1.0, 2.0), (f64::NAN, f64::NAN)),
((f64::NAN, 0.0), (-3.0, 0.5), (f64::NAN, f64::NAN)),
((f64::NAN, 0.0), (1e+300, 1e+300), (f64::NAN, f64::NAN)),
((f64::NAN, 0.0), (1e-300, -1e-300), (f64::NAN, f64::NAN)),
((f64::NAN, 0.0), (2.0, 0.0), (f64::NAN, f64::NAN)),
((f64::NAN, 0.0), (0.0, 1.0), (f64::NAN, f64::NAN)),
(
(f64::NAN, 0.0),
(f64::INFINITY, f64::NAN),
(f64::NAN, f64::NAN),
),
((f64::NAN, 0.0), (f64::NAN, f64::NAN), (f64::NAN, f64::NAN)),
((f64::NAN, 0.0), (5.0, -7.0), (f64::NAN, f64::NAN)),
((f64::NAN, 0.0), (1e+308, 1e-308), (f64::NAN, f64::NAN)),
((f64::NAN, 0.0), (-1.0, -0.0), (f64::NAN, f64::NAN)),
((f64::INFINITY, 1.0), (f64::NAN, 0.0), (f64::NAN, f64::NAN)),
(
(f64::INFINITY, 1.0),
(f64::INFINITY, 1.0),
(f64::INFINITY, f64::INFINITY),
),
(
(f64::INFINITY, 1.0),
(f64::NEG_INFINITY, f64::NEG_INFINITY),
(f64::NAN, f64::NEG_INFINITY),
),
((f64::INFINITY, 1.0), (0.0, 0.0), (f64::NAN, f64::NAN)),
((f64::INFINITY, 1.0), (-0.0, 0.0), (f64::NAN, f64::NAN)),
((f64::INFINITY, 1.0), (0.0, -0.0), (f64::NAN, f64::NAN)),
(
(f64::INFINITY, 1.0),
(1.0, 2.0),
(f64::INFINITY, f64::INFINITY),
),
(
(f64::INFINITY, 1.0),
(-3.0, 0.5),
(f64::NEG_INFINITY, f64::INFINITY),
),
(
(f64::INFINITY, 1.0),
(1e+300, 1e+300),
(f64::INFINITY, f64::INFINITY),
),
(
(f64::INFINITY, 1.0),
(1e-300, -1e-300),
(f64::INFINITY, f64::NEG_INFINITY),
),
((f64::INFINITY, 1.0), (2.0, 0.0), (f64::INFINITY, f64::NAN)),
((f64::INFINITY, 1.0), (0.0, 1.0), (f64::NAN, f64::INFINITY)),
(
(f64::INFINITY, 1.0),
(f64::INFINITY, f64::NAN),
(f64::NAN, f64::NAN),
),
(
(f64::INFINITY, 1.0),
(f64::NAN, f64::NAN),
(f64::NAN, f64::NAN),
),
(
(f64::INFINITY, 1.0),
(5.0, -7.0),
(f64::INFINITY, f64::NEG_INFINITY),
),
(
(f64::INFINITY, 1.0),
(1e+308, 1e-308),
(f64::INFINITY, f64::INFINITY),
),
(
(f64::INFINITY, 1.0),
(-1.0, -0.0),
(f64::NEG_INFINITY, f64::NAN),
),
(
(f64::NEG_INFINITY, f64::NEG_INFINITY),
(f64::NAN, 0.0),
(f64::NAN, f64::NAN),
),
(
(f64::NEG_INFINITY, f64::NEG_INFINITY),
(f64::INFINITY, 1.0),
(f64::NAN, f64::NEG_INFINITY),
),
(
(f64::NEG_INFINITY, f64::NEG_INFINITY),
(f64::NEG_INFINITY, f64::NEG_INFINITY),
(f64::NAN, f64::INFINITY),
),
(
(f64::NEG_INFINITY, f64::NEG_INFINITY),
(0.0, 0.0),
(f64::NAN, f64::NAN),
),
(
(f64::NEG_INFINITY, f64::NEG_INFINITY),
(-0.0, 0.0),
(f64::NAN, f64::NAN),
),
(
(f64::NEG_INFINITY, f64::NEG_INFINITY),
(0.0, -0.0),
(f64::NAN, f64::NAN),
),
(
(f64::NEG_INFINITY, f64::NEG_INFINITY),
(1.0, 2.0),
(f64::NAN, f64::NEG_INFINITY),
),
(
(f64::NEG_INFINITY, f64::NEG_INFINITY),
(-3.0, 0.5),
(f64::INFINITY, f64::NAN),
),
(
(f64::NEG_INFINITY, f64::NEG_INFINITY),
(1e+300, 1e+300),
(f64::NAN, f64::NEG_INFINITY),
),
(
(f64::NEG_INFINITY, f64::NEG_INFINITY),
(1e-300, -1e-300),
(f64::NEG_INFINITY, f64::NAN),
),
(
(f64::NEG_INFINITY, f64::NEG_INFINITY),
(2.0, 0.0),
(f64::NAN, f64::NAN),
),
(
(f64::NEG_INFINITY, f64::NEG_INFINITY),
(0.0, 1.0),
(f64::NAN, f64::NAN),
),
(
(f64::NEG_INFINITY, f64::NEG_INFINITY),
(f64::INFINITY, f64::NAN),
(f64::NAN, f64::NAN),
),
(
(f64::NEG_INFINITY, f64::NEG_INFINITY),
(f64::NAN, f64::NAN),
(f64::NAN, f64::NAN),
),
(
(f64::NEG_INFINITY, f64::NEG_INFINITY),
(5.0, -7.0),
(f64::NEG_INFINITY, f64::NAN),
),
(
(f64::NEG_INFINITY, f64::NEG_INFINITY),
(1e+308, 1e-308),
(f64::NAN, f64::NEG_INFINITY),
),
(
(f64::NEG_INFINITY, f64::NEG_INFINITY),
(-1.0, -0.0),
(f64::NAN, f64::NAN),
),
((0.0, 0.0), (f64::NAN, 0.0), (f64::NAN, f64::NAN)),
((0.0, 0.0), (f64::INFINITY, 1.0), (f64::NAN, f64::NAN)),
(
(0.0, 0.0),
(f64::NEG_INFINITY, f64::NEG_INFINITY),
(f64::NAN, f64::NAN),
),
((0.0, 0.0), (0.0, 0.0), (0.0, 0.0)),
((0.0, 0.0), (-0.0, 0.0), (-0.0, 0.0)),
((0.0, 0.0), (0.0, -0.0), (0.0, 0.0)),
((0.0, 0.0), (1.0, 2.0), (0.0, 0.0)),
((0.0, 0.0), (-3.0, 0.5), (-0.0, 0.0)),
((0.0, 0.0), (1e+300, 1e+300), (0.0, 0.0)),
((0.0, 0.0), (1e-300, -1e-300), (0.0, 0.0)),
((0.0, 0.0), (2.0, 0.0), (0.0, 0.0)),
((0.0, 0.0), (0.0, 1.0), (0.0, 0.0)),
((0.0, 0.0), (f64::INFINITY, f64::NAN), (f64::NAN, f64::NAN)),
((0.0, 0.0), (f64::NAN, f64::NAN), (f64::NAN, f64::NAN)),
((0.0, 0.0), (5.0, -7.0), (0.0, 0.0)),
((0.0, 0.0), (1e+308, 1e-308), (0.0, 0.0)),
((0.0, 0.0), (-1.0, -0.0), (0.0, -0.0)),
((-0.0, 0.0), (f64::NAN, 0.0), (f64::NAN, f64::NAN)),
((-0.0, 0.0), (f64::INFINITY, 1.0), (f64::NAN, f64::NAN)),
(
(-0.0, 0.0),
(f64::NEG_INFINITY, f64::NEG_INFINITY),
(f64::NAN, f64::NAN),
),
((-0.0, 0.0), (0.0, 0.0), (-0.0, 0.0)),
((-0.0, 0.0), (-0.0, 0.0), (0.0, -0.0)),
((-0.0, 0.0), (0.0, -0.0), (0.0, 0.0)),
((-0.0, 0.0), (1.0, 2.0), (-0.0, 0.0)),
((-0.0, 0.0), (-3.0, 0.5), (0.0, -0.0)),
((-0.0, 0.0), (1e+300, 1e+300), (-0.0, 0.0)),
((-0.0, 0.0), (1e-300, -1e-300), (0.0, 0.0)),
((-0.0, 0.0), (2.0, 0.0), (-0.0, 0.0)),
((-0.0, 0.0), (0.0, 1.0), (-0.0, 0.0)),
((-0.0, 0.0), (f64::INFINITY, f64::NAN), (f64::NAN, f64::NAN)),
((-0.0, 0.0), (f64::NAN, f64::NAN), (f64::NAN, f64::NAN)),
((-0.0, 0.0), (5.0, -7.0), (0.0, 0.0)),
((-0.0, 0.0), (1e+308, 1e-308), (-0.0, 0.0)),
((-0.0, 0.0), (-1.0, -0.0), (0.0, 0.0)),
((0.0, -0.0), (f64::NAN, 0.0), (f64::NAN, f64::NAN)),
((0.0, -0.0), (f64::INFINITY, 1.0), (f64::NAN, f64::NAN)),
(
(0.0, -0.0),
(f64::NEG_INFINITY, f64::NEG_INFINITY),
(f64::NAN, f64::NAN),
),
((0.0, -0.0), (0.0, 0.0), (0.0, 0.0)),
((0.0, -0.0), (-0.0, 0.0), (0.0, 0.0)),
((0.0, -0.0), (0.0, -0.0), (0.0, -0.0)),
((0.0, -0.0), (1.0, 2.0), (0.0, 0.0)),
((0.0, -0.0), (-3.0, 0.5), (0.0, 0.0)),
((0.0, -0.0), (1e+300, 1e+300), (0.0, 0.0)),
((0.0, -0.0), (1e-300, -1e-300), (0.0, -0.0)),
((0.0, -0.0), (2.0, 0.0), (0.0, 0.0)),
((0.0, -0.0), (0.0, 1.0), (0.0, 0.0)),
((0.0, -0.0), (f64::INFINITY, f64::NAN), (f64::NAN, f64::NAN)),
((0.0, -0.0), (f64::NAN, f64::NAN), (f64::NAN, f64::NAN)),
((0.0, -0.0), (5.0, -7.0), (0.0, -0.0)),
((0.0, -0.0), (1e+308, 1e-308), (0.0, 0.0)),
((0.0, -0.0), (-1.0, -0.0), (-0.0, 0.0)),
((1.0, 2.0), (f64::NAN, 0.0), (f64::NAN, f64::NAN)),
(
(1.0, 2.0),
(f64::INFINITY, 1.0),
(f64::INFINITY, f64::INFINITY),
),
(
(1.0, 2.0),
(f64::NEG_INFINITY, f64::NEG_INFINITY),
(f64::NAN, f64::NEG_INFINITY),
),
((1.0, 2.0), (0.0, 0.0), (0.0, 0.0)),
((1.0, 2.0), (-0.0, 0.0), (-0.0, 0.0)),
((1.0, 2.0), (0.0, -0.0), (0.0, 0.0)),
((1.0, 2.0), (1.0, 2.0), (-3.0, 4.0)),
((1.0, 2.0), (-3.0, 0.5), (-4.0, -5.5)),
((1.0, 2.0), (1e+300, 1e+300), (-1e+300, 3e+300)),
((1.0, 2.0), (1e-300, -1e-300), (3e-300, 1e-300)),
((1.0, 2.0), (2.0, 0.0), (2.0, 4.0)),
((1.0, 2.0), (0.0, 1.0), (-2.0, 1.0)),
((1.0, 2.0), (f64::INFINITY, f64::NAN), (f64::NAN, f64::NAN)),
((1.0, 2.0), (f64::NAN, f64::NAN), (f64::NAN, f64::NAN)),
((1.0, 2.0), (5.0, -7.0), (19.0, 3.0)),
((1.0, 2.0), (1e+308, 1e-308), (1e+308, f64::INFINITY)),
((1.0, 2.0), (-1.0, -0.0), (-1.0, -2.0)),
((-3.0, 0.5), (f64::NAN, 0.0), (f64::NAN, f64::NAN)),
(
(-3.0, 0.5),
(f64::INFINITY, 1.0),
(f64::NEG_INFINITY, f64::INFINITY),
),
(
(-3.0, 0.5),
(f64::NEG_INFINITY, f64::NEG_INFINITY),
(f64::INFINITY, f64::NAN),
),
((-3.0, 0.5), (0.0, 0.0), (-0.0, 0.0)),
((-3.0, 0.5), (-0.0, 0.0), (0.0, -0.0)),
((-3.0, 0.5), (0.0, -0.0), (0.0, 0.0)),
((-3.0, 0.5), (1.0, 2.0), (-4.0, -5.5)),
((-3.0, 0.5), (-3.0, 0.5), (8.75, -3.0)),
((-3.0, 0.5), (1e+300, 1e+300), (-3.5e+300, -2.5e+300)),
((-3.0, 0.5), (1e-300, -1e-300), (-2.5e-300, 3.5e-300)),
((-3.0, 0.5), (2.0, 0.0), (-6.0, 1.0)),
((-3.0, 0.5), (0.0, 1.0), (-0.5, -3.0)),
((-3.0, 0.5), (f64::INFINITY, f64::NAN), (f64::NAN, f64::NAN)),
((-3.0, 0.5), (f64::NAN, f64::NAN), (f64::NAN, f64::NAN)),
((-3.0, 0.5), (5.0, -7.0), (-11.5, 23.5)),
((-3.0, 0.5), (1e+308, 1e-308), (f64::NEG_INFINITY, 5e+307)),
((-3.0, 0.5), (-1.0, -0.0), (3.0, -0.5)),
((1e+300, 1e+300), (f64::NAN, 0.0), (f64::NAN, f64::NAN)),
(
(1e+300, 1e+300),
(f64::INFINITY, 1.0),
(f64::INFINITY, f64::INFINITY),
),
(
(1e+300, 1e+300),
(f64::NEG_INFINITY, f64::NEG_INFINITY),
(f64::NAN, f64::NEG_INFINITY),
),
((1e+300, 1e+300), (0.0, 0.0), (0.0, 0.0)),
((1e+300, 1e+300), (-0.0, 0.0), (-0.0, 0.0)),
((1e+300, 1e+300), (0.0, -0.0), (0.0, 0.0)),
((1e+300, 1e+300), (1.0, 2.0), (-1e+300, 3e+300)),
((1e+300, 1e+300), (-3.0, 0.5), (-3.5e+300, -2.5e+300)),
(
(1e+300, 1e+300),
(1e-300, -1e-300),
(2.0, -7.756385209041318e-17),
),
((1e+300, 1e+300), (2.0, 0.0), (2e+300, 2e+300)),
((1e+300, 1e+300), (0.0, 1.0), (-1e+300, 1e+300)),
(
(1e+300, 1e+300),
(f64::INFINITY, f64::NAN),
(f64::NAN, f64::NAN),
),
((1e+300, 1e+300), (f64::NAN, f64::NAN), (f64::NAN, f64::NAN)),
((1e+300, 1e+300), (5.0, -7.0), (1.2e+301, -2e+300)),
(
(1e+300, 1e+300),
(1e+308, 1e-308),
(f64::INFINITY, f64::INFINITY),
),
((1e+300, 1e+300), (-1.0, -0.0), (-1e+300, -1e+300)),
((1e-300, -1e-300), (f64::NAN, 0.0), (f64::NAN, f64::NAN)),
(
(1e-300, -1e-300),
(f64::INFINITY, 1.0),
(f64::INFINITY, f64::NEG_INFINITY),
),
(
(1e-300, -1e-300),
(f64::NEG_INFINITY, f64::NEG_INFINITY),
(f64::NEG_INFINITY, f64::NAN),
),
((1e-300, -1e-300), (0.0, 0.0), (0.0, 0.0)),
((1e-300, -1e-300), (-0.0, 0.0), (0.0, 0.0)),
((1e-300, -1e-300), (0.0, -0.0), (0.0, -0.0)),
((1e-300, -1e-300), (1.0, 2.0), (3e-300, 1e-300)),
((1e-300, -1e-300), (-3.0, 0.5), (-2.5e-300, 3.5e-300)),
(
(1e-300, -1e-300),
(1e+300, 1e+300),
(2.0, 7.756385209041318e-17),
),
((1e-300, -1e-300), (1e-300, -1e-300), (0.0, -0.0)),
((1e-300, -1e-300), (2.0, 0.0), (2e-300, -2e-300)),
((1e-300, -1e-300), (0.0, 1.0), (1e-300, 1e-300)),
(
(1e-300, -1e-300),
(f64::INFINITY, f64::NAN),
(f64::NAN, f64::NAN),
),
(
(1e-300, -1e-300),
(f64::NAN, f64::NAN),
(f64::NAN, f64::NAN),
),
(
(1e-300, -1e-300),
(5.0, -7.0),
(-2.0000000000000004e-300, -1.2e-299),
),
(
(1e-300, -1e-300),
(1e+308, 1e-308),
(100000000.0, -100000000.0),
),
((1e-300, -1e-300), (-1.0, -0.0), (-1e-300, 1e-300)),
((2.0, 0.0), (f64::NAN, 0.0), (f64::NAN, f64::NAN)),
((2.0, 0.0), (f64::INFINITY, 1.0), (f64::INFINITY, f64::NAN)),
(
(2.0, 0.0),
(f64::NEG_INFINITY, f64::NEG_INFINITY),
(f64::NAN, f64::NAN),
),
((2.0, 0.0), (0.0, 0.0), (0.0, 0.0)),
((2.0, 0.0), (-0.0, 0.0), (-0.0, 0.0)),
((2.0, 0.0), (0.0, -0.0), (0.0, 0.0)),
((2.0, 0.0), (1.0, 2.0), (2.0, 4.0)),
((2.0, 0.0), (-3.0, 0.5), (-6.0, 1.0)),
((2.0, 0.0), (1e+300, 1e+300), (2e+300, 2e+300)),
((2.0, 0.0), (1e-300, -1e-300), (2e-300, -2e-300)),
((2.0, 0.0), (2.0, 0.0), (4.0, 0.0)),
((2.0, 0.0), (0.0, 1.0), (0.0, 2.0)),
((2.0, 0.0), (f64::INFINITY, f64::NAN), (f64::NAN, f64::NAN)),
((2.0, 0.0), (f64::NAN, f64::NAN), (f64::NAN, f64::NAN)),
((2.0, 0.0), (5.0, -7.0), (10.0, -14.0)),
((2.0, 0.0), (1e+308, 1e-308), (f64::INFINITY, 2e-308)),
((2.0, 0.0), (-1.0, -0.0), (-2.0, -0.0)),
((0.0, 1.0), (f64::NAN, 0.0), (f64::NAN, f64::NAN)),
((0.0, 1.0), (f64::INFINITY, 1.0), (f64::NAN, f64::INFINITY)),
(
(0.0, 1.0),
(f64::NEG_INFINITY, f64::NEG_INFINITY),
(f64::NAN, f64::NAN),
),
((0.0, 1.0), (0.0, 0.0), (0.0, 0.0)),
((0.0, 1.0), (-0.0, 0.0), (-0.0, 0.0)),
((0.0, 1.0), (0.0, -0.0), (0.0, 0.0)),
((0.0, 1.0), (1.0, 2.0), (-2.0, 1.0)),
((0.0, 1.0), (-3.0, 0.5), (-0.5, -3.0)),
((0.0, 1.0), (1e+300, 1e+300), (-1e+300, 1e+300)),
((0.0, 1.0), (1e-300, -1e-300), (1e-300, 1e-300)),
((0.0, 1.0), (2.0, 0.0), (0.0, 2.0)),
((0.0, 1.0), (0.0, 1.0), (-1.0, 0.0)),
((0.0, 1.0), (f64::INFINITY, f64::NAN), (f64::NAN, f64::NAN)),
((0.0, 1.0), (f64::NAN, f64::NAN), (f64::NAN, f64::NAN)),
((0.0, 1.0), (5.0, -7.0), (7.0, 5.0)),
((0.0, 1.0), (1e+308, 1e-308), (-1e-308, 1e+308)),
((0.0, 1.0), (-1.0, -0.0), (0.0, -1.0)),
(
(f64::INFINITY, f64::NAN),
(f64::NAN, 0.0),
(f64::NAN, f64::NAN),
),
(
(f64::INFINITY, f64::NAN),
(f64::INFINITY, 1.0),
(f64::NAN, f64::NAN),
),
(
(f64::INFINITY, f64::NAN),
(f64::NEG_INFINITY, f64::NEG_INFINITY),
(f64::NAN, f64::NAN),
),
((f64::INFINITY, f64::NAN), (0.0, 0.0), (f64::NAN, f64::NAN)),
((f64::INFINITY, f64::NAN), (-0.0, 0.0), (f64::NAN, f64::NAN)),
((f64::INFINITY, f64::NAN), (0.0, -0.0), (f64::NAN, f64::NAN)),
((f64::INFINITY, f64::NAN), (1.0, 2.0), (f64::NAN, f64::NAN)),
((f64::INFINITY, f64::NAN), (-3.0, 0.5), (f64::NAN, f64::NAN)),
(
(f64::INFINITY, f64::NAN),
(1e+300, 1e+300),
(f64::NAN, f64::NAN),
),
(
(f64::INFINITY, f64::NAN),
(1e-300, -1e-300),
(f64::NAN, f64::NAN),
),
((f64::INFINITY, f64::NAN), (2.0, 0.0), (f64::NAN, f64::NAN)),
((f64::INFINITY, f64::NAN), (0.0, 1.0), (f64::NAN, f64::NAN)),
(
(f64::INFINITY, f64::NAN),
(f64::INFINITY, f64::NAN),
(f64::NAN, f64::NAN),
),
(
(f64::INFINITY, f64::NAN),
(f64::NAN, f64::NAN),
(f64::NAN, f64::NAN),
),
((f64::INFINITY, f64::NAN), (5.0, -7.0), (f64::NAN, f64::NAN)),
(
(f64::INFINITY, f64::NAN),
(1e+308, 1e-308),
(f64::NAN, f64::NAN),
),
(
(f64::INFINITY, f64::NAN),
(-1.0, -0.0),
(f64::NAN, f64::NAN),
),
((f64::NAN, f64::NAN), (f64::NAN, 0.0), (f64::NAN, f64::NAN)),
(
(f64::NAN, f64::NAN),
(f64::INFINITY, 1.0),
(f64::NAN, f64::NAN),
),
(
(f64::NAN, f64::NAN),
(f64::NEG_INFINITY, f64::NEG_INFINITY),
(f64::NAN, f64::NAN),
),
((f64::NAN, f64::NAN), (0.0, 0.0), (f64::NAN, f64::NAN)),
((f64::NAN, f64::NAN), (-0.0, 0.0), (f64::NAN, f64::NAN)),
((f64::NAN, f64::NAN), (0.0, -0.0), (f64::NAN, f64::NAN)),
((f64::NAN, f64::NAN), (1.0, 2.0), (f64::NAN, f64::NAN)),
((f64::NAN, f64::NAN), (-3.0, 0.5), (f64::NAN, f64::NAN)),
((f64::NAN, f64::NAN), (1e+300, 1e+300), (f64::NAN, f64::NAN)),
(
(f64::NAN, f64::NAN),
(1e-300, -1e-300),
(f64::NAN, f64::NAN),
),
((f64::NAN, f64::NAN), (2.0, 0.0), (f64::NAN, f64::NAN)),
((f64::NAN, f64::NAN), (0.0, 1.0), (f64::NAN, f64::NAN)),
(
(f64::NAN, f64::NAN),
(f64::INFINITY, f64::NAN),
(f64::NAN, f64::NAN),
),
(
(f64::NAN, f64::NAN),
(f64::NAN, f64::NAN),
(f64::NAN, f64::NAN),
),
((f64::NAN, f64::NAN), (5.0, -7.0), (f64::NAN, f64::NAN)),
((f64::NAN, f64::NAN), (1e+308, 1e-308), (f64::NAN, f64::NAN)),
((f64::NAN, f64::NAN), (-1.0, -0.0), (f64::NAN, f64::NAN)),
((5.0, -7.0), (f64::NAN, 0.0), (f64::NAN, f64::NAN)),
(
(5.0, -7.0),
(f64::INFINITY, 1.0),
(f64::INFINITY, f64::NEG_INFINITY),
),
(
(5.0, -7.0),
(f64::NEG_INFINITY, f64::NEG_INFINITY),
(f64::NEG_INFINITY, f64::NAN),
),
((5.0, -7.0), (0.0, 0.0), (0.0, 0.0)),
((5.0, -7.0), (-0.0, 0.0), (0.0, 0.0)),
((5.0, -7.0), (0.0, -0.0), (0.0, -0.0)),
((5.0, -7.0), (1.0, 2.0), (19.0, 3.0)),
((5.0, -7.0), (-3.0, 0.5), (-11.5, 23.5)),
(
(5.0, -7.0),
(1e+300, 1e+300),
(1.2e+301, -1.9999999999999995e+300),
),
(
(5.0, -7.0),
(1e-300, -1e-300),
(-2.0000000000000004e-300, -1.2e-299),
),
((5.0, -7.0), (2.0, 0.0), (10.0, -14.0)),
((5.0, -7.0), (0.0, 1.0), (7.0, 5.0)),
((5.0, -7.0), (f64::INFINITY, f64::NAN), (f64::NAN, f64::NAN)),
((5.0, -7.0), (f64::NAN, f64::NAN), (f64::NAN, f64::NAN)),
((5.0, -7.0), (5.0, -7.0), (-24.0, -70.0)),
(
(5.0, -7.0),
(1e+308, 1e-308),
(f64::INFINITY, f64::NEG_INFINITY),
),
((5.0, -7.0), (-1.0, -0.0), (-5.0, 7.0)),
((1e+308, 1e-308), (f64::NAN, 0.0), (f64::NAN, f64::NAN)),
(
(1e+308, 1e-308),
(f64::INFINITY, 1.0),
(f64::INFINITY, f64::INFINITY),
),
(
(1e+308, 1e-308),
(f64::NEG_INFINITY, f64::NEG_INFINITY),
(f64::NAN, f64::NEG_INFINITY),
),
((1e+308, 1e-308), (0.0, 0.0), (0.0, 0.0)),
((1e+308, 1e-308), (-0.0, 0.0), (-0.0, 0.0)),
((1e+308, 1e-308), (0.0, -0.0), (0.0, 0.0)),
((1e+308, 1e-308), (1.0, 2.0), (1e+308, f64::INFINITY)),
((1e+308, 1e-308), (-3.0, 0.5), (f64::NEG_INFINITY, 5e+307)),
(
(1e+308, 1e-308),
(1e+300, 1e+300),
(f64::INFINITY, f64::INFINITY),
),
(
(1e+308, 1e-308),
(1e-300, -1e-300),
(100000000.0, -100000000.0),
),
((1e+308, 1e-308), (2.0, 0.0), (f64::INFINITY, 2e-308)),
((1e+308, 1e-308), (0.0, 1.0), (-1e-308, 1e+308)),
(
(1e+308, 1e-308),
(f64::INFINITY, f64::NAN),
(f64::NAN, f64::NAN),
),
((1e+308, 1e-308), (f64::NAN, f64::NAN), (f64::NAN, f64::NAN)),
(
(1e+308, 1e-308),
(5.0, -7.0),
(f64::INFINITY, f64::NEG_INFINITY),
),
(
(1e+308, 1e-308),
(1e+308, 1e-308),
(f64::INFINITY, 1.9999999999999998),
),
((1e+308, 1e-308), (-1.0, -0.0), (-1e+308, -1e-308)),
((-1.0, -0.0), (f64::NAN, 0.0), (f64::NAN, f64::NAN)),
(
(-1.0, -0.0),
(f64::INFINITY, 1.0),
(f64::NEG_INFINITY, f64::NAN),
),
(
(-1.0, -0.0),
(f64::NEG_INFINITY, f64::NEG_INFINITY),
(f64::NAN, f64::NAN),
),
((-1.0, -0.0), (0.0, 0.0), (0.0, -0.0)),
((-1.0, -0.0), (-0.0, 0.0), (0.0, 0.0)),
((-1.0, -0.0), (0.0, -0.0), (-0.0, 0.0)),
((-1.0, -0.0), (1.0, 2.0), (-1.0, -2.0)),
((-1.0, -0.0), (-3.0, 0.5), (3.0, -0.5)),
((-1.0, -0.0), (1e+300, 1e+300), (-1e+300, -1e+300)),
((-1.0, -0.0), (1e-300, -1e-300), (-1e-300, 1e-300)),
((-1.0, -0.0), (2.0, 0.0), (-2.0, -0.0)),
((-1.0, -0.0), (0.0, 1.0), (0.0, -1.0)),
(
(-1.0, -0.0),
(f64::INFINITY, f64::NAN),
(f64::NAN, f64::NAN),
),
((-1.0, -0.0), (f64::NAN, f64::NAN), (f64::NAN, f64::NAN)),
((-1.0, -0.0), (5.0, -7.0), (-5.0, 7.0)),
((-1.0, -0.0), (1e+308, 1e-308), (-1e+308, -1e-308)),
((-1.0, -0.0), (-1.0, -0.0), (1.0, 0.0)),
];
for &((ar, ai), (br, bi), want) in CASES {
let (a, b) = (Complex::new(ar, ai), Complex::new(br, bi));
check_c("mul", &format!("{a:?}, {b:?}"), a * b, want, 1e-5, false);
let mut t = a;
t *= b;
check_c("mul_assign", &format!("{a:?}, {b:?}"), t, want, 1e-5, false);
}
}
#[test]
fn complex_div_f64() {
let _report = Report;
const CASES: &[((f64, f64), (f64, f64), (f64, f64))] = &[
((f64::NAN, 0.0), (f64::NAN, 0.0), (f64::NAN, f64::NAN)),
((f64::NAN, 0.0), (f64::INFINITY, 1.0), (f64::NAN, f64::NAN)),
(
(f64::NAN, 0.0),
(f64::NEG_INFINITY, f64::NEG_INFINITY),
(f64::NAN, f64::NAN),
),
((f64::NAN, 0.0), (0.0, 0.0), (f64::NAN, f64::NAN)),
((f64::NAN, 0.0), (-0.0, 0.0), (f64::NAN, f64::NAN)),
((f64::NAN, 0.0), (0.0, -0.0), (f64::NAN, f64::NAN)),
((f64::NAN, 0.0), (1.0, 2.0), (f64::NAN, f64::NAN)),
((f64::NAN, 0.0), (-3.0, 0.5), (f64::NAN, f64::NAN)),
((f64::NAN, 0.0), (1e+300, 1e+300), (f64::NAN, f64::NAN)),
((f64::NAN, 0.0), (1e-300, -1e-300), (f64::NAN, f64::NAN)),
((f64::NAN, 0.0), (2.0, 0.0), (f64::NAN, f64::NAN)),
((f64::NAN, 0.0), (0.0, 1.0), (f64::NAN, f64::NAN)),
(
(f64::NAN, 0.0),
(f64::INFINITY, f64::NAN),
(f64::NAN, f64::NAN),
),
((f64::NAN, 0.0), (f64::NAN, f64::NAN), (f64::NAN, f64::NAN)),
((f64::NAN, 0.0), (5.0, -7.0), (f64::NAN, f64::NAN)),
((f64::NAN, 0.0), (1e+308, 1e-308), (f64::NAN, f64::NAN)),
((f64::NAN, 0.0), (-1.0, -0.0), (f64::NAN, f64::NAN)),
((f64::INFINITY, 1.0), (f64::NAN, 0.0), (f64::NAN, f64::NAN)),
(
(f64::INFINITY, 1.0),
(f64::INFINITY, 1.0),
(f64::NAN, f64::NAN),
),
(
(f64::INFINITY, 1.0),
(f64::NEG_INFINITY, f64::NEG_INFINITY),
(f64::NAN, f64::NAN),
),
(
(f64::INFINITY, 1.0),
(0.0, 0.0),
(f64::INFINITY, f64::INFINITY),
),
(
(f64::INFINITY, 1.0),
(-0.0, 0.0),
(f64::INFINITY, f64::INFINITY),
),
(
(f64::INFINITY, 1.0),
(0.0, -0.0),
(f64::INFINITY, f64::INFINITY),
),
(
(f64::INFINITY, 1.0),
(1.0, 2.0),
(f64::INFINITY, f64::NEG_INFINITY),
),
(
(f64::INFINITY, 1.0),
(-3.0, 0.5),
(f64::NEG_INFINITY, f64::NEG_INFINITY),
),
(
(f64::INFINITY, 1.0),
(1e+300, 1e+300),
(f64::INFINITY, f64::NEG_INFINITY),
),
(
(f64::INFINITY, 1.0),
(1e-300, -1e-300),
(f64::INFINITY, f64::INFINITY),
),
((f64::INFINITY, 1.0), (2.0, 0.0), (f64::INFINITY, f64::NAN)),
(
(f64::INFINITY, 1.0),
(0.0, 1.0),
(f64::NAN, f64::NEG_INFINITY),
),
(
(f64::INFINITY, 1.0),
(f64::INFINITY, f64::NAN),
(f64::NAN, f64::NAN),
),
(
(f64::INFINITY, 1.0),
(f64::NAN, f64::NAN),
(f64::NAN, f64::NAN),
),
(
(f64::INFINITY, 1.0),
(5.0, -7.0),
(f64::INFINITY, f64::INFINITY),
),
(
(f64::INFINITY, 1.0),
(1e+308, 1e-308),
(f64::INFINITY, f64::NAN),
),
(
(f64::INFINITY, 1.0),
(-1.0, -0.0),
(f64::NEG_INFINITY, f64::NAN),
),
(
(f64::NEG_INFINITY, f64::NEG_INFINITY),
(f64::NAN, 0.0),
(f64::NAN, f64::NAN),
),
(
(f64::NEG_INFINITY, f64::NEG_INFINITY),
(f64::INFINITY, 1.0),
(f64::NAN, f64::NAN),
),
(
(f64::NEG_INFINITY, f64::NEG_INFINITY),
(f64::NEG_INFINITY, f64::NEG_INFINITY),
(f64::NAN, f64::NAN),
),
(
(f64::NEG_INFINITY, f64::NEG_INFINITY),
(0.0, 0.0),
(f64::NEG_INFINITY, f64::NEG_INFINITY),
),
(
(f64::NEG_INFINITY, f64::NEG_INFINITY),
(-0.0, 0.0),
(f64::NEG_INFINITY, f64::NEG_INFINITY),
),
(
(f64::NEG_INFINITY, f64::NEG_INFINITY),
(0.0, -0.0),
(f64::NEG_INFINITY, f64::NEG_INFINITY),
),
(
(f64::NEG_INFINITY, f64::NEG_INFINITY),
(1.0, 2.0),
(f64::NEG_INFINITY, f64::NAN),
),
(
(f64::NEG_INFINITY, f64::NEG_INFINITY),
(-3.0, 0.5),
(f64::NAN, f64::INFINITY),
),
(
(f64::NEG_INFINITY, f64::NEG_INFINITY),
(1e+300, 1e+300),
(f64::NEG_INFINITY, f64::NAN),
),
(
(f64::NEG_INFINITY, f64::NEG_INFINITY),
(1e-300, -1e-300),
(f64::NAN, f64::NEG_INFINITY),
),
(
(f64::NEG_INFINITY, f64::NEG_INFINITY),
(2.0, 0.0),
(f64::NAN, f64::NAN),
),
(
(f64::NEG_INFINITY, f64::NEG_INFINITY),
(0.0, 1.0),
(f64::NAN, f64::NAN),
),
(
(f64::NEG_INFINITY, f64::NEG_INFINITY),
(f64::INFINITY, f64::NAN),
(f64::NAN, f64::NAN),
),
(
(f64::NEG_INFINITY, f64::NEG_INFINITY),
(f64::NAN, f64::NAN),
(f64::NAN, f64::NAN),
),
(
(f64::NEG_INFINITY, f64::NEG_INFINITY),
(5.0, -7.0),
(f64::NAN, f64::NEG_INFINITY),
),
(
(f64::NEG_INFINITY, f64::NEG_INFINITY),
(1e+308, 1e-308),
(f64::NAN, f64::NAN),
),
(
(f64::NEG_INFINITY, f64::NEG_INFINITY),
(-1.0, -0.0),
(f64::NAN, f64::NAN),
),
((0.0, 0.0), (f64::NAN, 0.0), (f64::NAN, f64::NAN)),
((0.0, 0.0), (f64::INFINITY, 1.0), (0.0, 0.0)),
(
(0.0, 0.0),
(f64::NEG_INFINITY, f64::NEG_INFINITY),
(f64::NAN, f64::NAN),
),
((0.0, 0.0), (0.0, 0.0), (f64::NAN, f64::NAN)),
((0.0, 0.0), (-0.0, 0.0), (f64::NAN, f64::NAN)),
((0.0, 0.0), (0.0, -0.0), (f64::NAN, f64::NAN)),
((0.0, 0.0), (1.0, 2.0), (0.0, 0.0)),
((0.0, 0.0), (-3.0, 0.5), (-0.0, -0.0)),
((0.0, 0.0), (1e+300, 1e+300), (0.0, 0.0)),
((0.0, 0.0), (1e-300, -1e-300), (0.0, 0.0)),
((0.0, 0.0), (2.0, 0.0), (0.0, 0.0)),
((0.0, 0.0), (0.0, 1.0), (0.0, 0.0)),
((0.0, 0.0), (f64::INFINITY, f64::NAN), (f64::NAN, f64::NAN)),
((0.0, 0.0), (f64::NAN, f64::NAN), (f64::NAN, f64::NAN)),
((0.0, 0.0), (5.0, -7.0), (-0.0, 0.0)),
((0.0, 0.0), (1e+308, 1e-308), (0.0, 0.0)),
((0.0, 0.0), (-1.0, -0.0), (-0.0, -0.0)),
((-0.0, 0.0), (f64::NAN, 0.0), (f64::NAN, f64::NAN)),
((-0.0, 0.0), (f64::INFINITY, 1.0), (0.0, 0.0)),
(
(-0.0, 0.0),
(f64::NEG_INFINITY, f64::NEG_INFINITY),
(f64::NAN, f64::NAN),
),
((-0.0, 0.0), (0.0, 0.0), (f64::NAN, f64::NAN)),
((-0.0, 0.0), (-0.0, 0.0), (f64::NAN, f64::NAN)),
((-0.0, 0.0), (0.0, -0.0), (f64::NAN, f64::NAN)),
((-0.0, 0.0), (1.0, 2.0), (0.0, 0.0)),
((-0.0, 0.0), (-3.0, 0.5), (0.0, -0.0)),
((-0.0, 0.0), (1e+300, 1e+300), (0.0, 0.0)),
((-0.0, 0.0), (1e-300, -1e-300), (-0.0, 0.0)),
((-0.0, 0.0), (2.0, 0.0), (0.0, 0.0)),
((-0.0, 0.0), (0.0, 1.0), (0.0, 0.0)),
((-0.0, 0.0), (f64::INFINITY, f64::NAN), (f64::NAN, f64::NAN)),
((-0.0, 0.0), (f64::NAN, f64::NAN), (f64::NAN, f64::NAN)),
((-0.0, 0.0), (5.0, -7.0), (-0.0, -0.0)),
((-0.0, 0.0), (1e+308, 1e-308), (0.0, 0.0)),
((-0.0, 0.0), (-1.0, -0.0), (-0.0, -0.0)),
((0.0, -0.0), (f64::NAN, 0.0), (f64::NAN, f64::NAN)),
((0.0, -0.0), (f64::INFINITY, 1.0), (0.0, -0.0)),
(
(0.0, -0.0),
(f64::NEG_INFINITY, f64::NEG_INFINITY),
(f64::NAN, f64::NAN),
),
((0.0, -0.0), (0.0, 0.0), (f64::NAN, f64::NAN)),
((0.0, -0.0), (-0.0, 0.0), (f64::NAN, f64::NAN)),
((0.0, -0.0), (0.0, -0.0), (f64::NAN, f64::NAN)),
((0.0, -0.0), (1.0, 2.0), (0.0, -0.0)),
((0.0, -0.0), (-3.0, 0.5), (-0.0, -0.0)),
((0.0, -0.0), (1e+300, 1e+300), (0.0, -0.0)),
((0.0, -0.0), (1e-300, -1e-300), (0.0, 0.0)),
((0.0, -0.0), (2.0, 0.0), (0.0, -0.0)),
((0.0, -0.0), (0.0, 1.0), (0.0, -0.0)),
((0.0, -0.0), (f64::INFINITY, f64::NAN), (f64::NAN, f64::NAN)),
((0.0, -0.0), (f64::NAN, f64::NAN), (f64::NAN, f64::NAN)),
((0.0, -0.0), (5.0, -7.0), (0.0, -0.0)),
((0.0, -0.0), (1e+308, 1e-308), (0.0, -0.0)),
((0.0, -0.0), (-1.0, -0.0), (-0.0, 0.0)),
((1.0, 2.0), (f64::NAN, 0.0), (f64::NAN, f64::NAN)),
((1.0, 2.0), (f64::INFINITY, 1.0), (0.0, 0.0)),
(
(1.0, 2.0),
(f64::NEG_INFINITY, f64::NEG_INFINITY),
(f64::NAN, f64::NAN),
),
((1.0, 2.0), (0.0, 0.0), (f64::INFINITY, f64::INFINITY)),
((1.0, 2.0), (-0.0, 0.0), (f64::INFINITY, f64::INFINITY)),
((1.0, 2.0), (0.0, -0.0), (f64::INFINITY, f64::INFINITY)),
((1.0, 2.0), (1.0, 2.0), (1.0, 0.0)),
(
(1.0, 2.0),
(-3.0, 0.5),
(-0.21621621621621623, -0.7027027027027025),
),
((1.0, 2.0), (1e+300, 1e+300), (1.5e-300, 5e-301)),
(
(1.0, 2.0),
(1e-300, -1e-300),
(-4.9999999999999995e+299, 1.4999999999999998e+300),
),
((1.0, 2.0), (2.0, 0.0), (0.5, 1.0)),
((1.0, 2.0), (0.0, 1.0), (2.0, -1.0)),
((1.0, 2.0), (f64::INFINITY, f64::NAN), (f64::NAN, f64::NAN)),
((1.0, 2.0), (f64::NAN, f64::NAN), (f64::NAN, f64::NAN)),
(
(1.0, 2.0),
(5.0, -7.0),
(-0.12162162162162161, 0.22972972972972977),
),
((1.0, 2.0), (1e+308, 1e-308), (1e-308, 2e-308)),
((1.0, 2.0), (-1.0, -0.0), (-1.0, -2.0)),
((-3.0, 0.5), (f64::NAN, 0.0), (f64::NAN, f64::NAN)),
((-3.0, 0.5), (f64::INFINITY, 1.0), (-0.0, 0.0)),
(
(-3.0, 0.5),
(f64::NEG_INFINITY, f64::NEG_INFINITY),
(f64::NAN, f64::NAN),
),
((-3.0, 0.5), (0.0, 0.0), (f64::NEG_INFINITY, f64::INFINITY)),
((-3.0, 0.5), (-0.0, 0.0), (f64::NEG_INFINITY, f64::INFINITY)),
((-3.0, 0.5), (0.0, -0.0), (f64::NEG_INFINITY, f64::INFINITY)),
((-3.0, 0.5), (1.0, 2.0), (-0.4, 1.3)),
((-3.0, 0.5), (-3.0, 0.5), (0.9999999999999999, -0.0)),
((-3.0, 0.5), (1e+300, 1e+300), (-1.25e-300, 1.75e-300)),
(
(-3.0, 0.5),
(1e-300, -1e-300),
(-1.75e+300, -1.2499999999999999e+300),
),
((-3.0, 0.5), (2.0, 0.0), (-1.5, 0.25)),
((-3.0, 0.5), (0.0, 1.0), (0.5, 3.0)),
((-3.0, 0.5), (f64::INFINITY, f64::NAN), (f64::NAN, f64::NAN)),
((-3.0, 0.5), (f64::NAN, f64::NAN), (f64::NAN, f64::NAN)),
((-3.0, 0.5), (5.0, -7.0), (-0.25, -0.25)),
(
(-3.0, 0.5),
(1e+308, 1e-308),
(-2.9999999999999997e-308, 5e-309),
),
((-3.0, 0.5), (-1.0, -0.0), (3.0, -0.5)),
((1e+300, 1e+300), (f64::NAN, 0.0), (f64::NAN, f64::NAN)),
((1e+300, 1e+300), (f64::INFINITY, 1.0), (0.0, 0.0)),
(
(1e+300, 1e+300),
(f64::NEG_INFINITY, f64::NEG_INFINITY),
(f64::NAN, f64::NAN),
),
((1e+300, 1e+300), (0.0, 0.0), (f64::INFINITY, f64::INFINITY)),
(
(1e+300, 1e+300),
(-0.0, 0.0),
(f64::INFINITY, f64::INFINITY),
),
(
(1e+300, 1e+300),
(0.0, -0.0),
(f64::INFINITY, f64::INFINITY),
),
((1e+300, 1e+300), (1.0, 2.0), (6e+299, -2e+299)),
(
(1e+300, 1e+300),
(-3.0, 0.5),
(-2.7027027027027026e+299, -3.7837837837837835e+299),
),
((1e+300, 1e+300), (1e-300, -1e-300), (0.0, f64::INFINITY)),
((1e+300, 1e+300), (2.0, 0.0), (5e+299, 5e+299)),
((1e+300, 1e+300), (0.0, 1.0), (1e+300, -1e+300)),
(
(1e+300, 1e+300),
(f64::INFINITY, f64::NAN),
(f64::NAN, f64::NAN),
),
((1e+300, 1e+300), (f64::NAN, f64::NAN), (f64::NAN, f64::NAN)),
(
(1e+300, 1e+300),
(5.0, -7.0),
(-2.7027027027027024e+298, 1.6216216216216218e+299),
),
((1e+300, 1e+300), (1e+308, 1e-308), (1e-08, 1e-08)),
((1e+300, 1e+300), (-1.0, -0.0), (-1e+300, -1e+300)),
((1e-300, -1e-300), (f64::NAN, 0.0), (f64::NAN, f64::NAN)),
((1e-300, -1e-300), (f64::INFINITY, 1.0), (0.0, -0.0)),
(
(1e-300, -1e-300),
(f64::NEG_INFINITY, f64::NEG_INFINITY),
(f64::NAN, f64::NAN),
),
(
(1e-300, -1e-300),
(0.0, 0.0),
(f64::INFINITY, f64::NEG_INFINITY),
),
(
(1e-300, -1e-300),
(-0.0, 0.0),
(f64::INFINITY, f64::NEG_INFINITY),
),
(
(1e-300, -1e-300),
(0.0, -0.0),
(f64::INFINITY, f64::NEG_INFINITY),
),
(
(1e-300, -1e-300),
(1.0, 2.0),
(-2e-301, -6.000000000000001e-301),
),
(
(1e-300, -1e-300),
(-3.0, 0.5),
(-3.783783783783783e-301, 2.702702702702703e-301),
),
((1e-300, -1e-300), (1e+300, 1e+300), (0.0, -0.0)),
(
(1e-300, -1e-300),
(1e-300, -1e-300),
(0.9999999999999999, 0.0),
),
((1e-300, -1e-300), (2.0, 0.0), (5e-301, -5e-301)),
((1e-300, -1e-300), (0.0, 1.0), (-1e-300, -1e-300)),
(
(1e-300, -1e-300),
(f64::INFINITY, f64::NAN),
(f64::NAN, f64::NAN),
),
(
(1e-300, -1e-300),
(f64::NAN, f64::NAN),
(f64::NAN, f64::NAN),
),
(
(1e-300, -1e-300),
(5.0, -7.0),
(1.6216216216216218e-301, 2.702702702702703e-302),
),
((1e-300, -1e-300), (1e+308, 1e-308), (0.0, -0.0)),
((1e-300, -1e-300), (-1.0, -0.0), (-1e-300, 1e-300)),
((2.0, 0.0), (f64::NAN, 0.0), (f64::NAN, f64::NAN)),
((2.0, 0.0), (f64::INFINITY, 1.0), (0.0, 0.0)),
(
(2.0, 0.0),
(f64::NEG_INFINITY, f64::NEG_INFINITY),
(f64::NAN, f64::NAN),
),
((2.0, 0.0), (0.0, 0.0), (f64::INFINITY, f64::NAN)),
((2.0, 0.0), (-0.0, 0.0), (f64::INFINITY, f64::NAN)),
((2.0, 0.0), (0.0, -0.0), (f64::INFINITY, f64::NAN)),
((2.0, 0.0), (1.0, 2.0), (0.4, -0.8)),
(
(2.0, 0.0),
(-3.0, 0.5),
(-0.6486486486486486, -0.10810810810810809),
),
((2.0, 0.0), (1e+300, 1e+300), (1e-300, -1e-300)),
(
(2.0, 0.0),
(1e-300, -1e-300),
(9.999999999999999e+299, 9.999999999999999e+299),
),
((2.0, 0.0), (2.0, 0.0), (1.0, 0.0)),
((2.0, 0.0), (0.0, 1.0), (0.0, -2.0)),
((2.0, 0.0), (f64::INFINITY, f64::NAN), (f64::NAN, f64::NAN)),
((2.0, 0.0), (f64::NAN, f64::NAN), (f64::NAN, f64::NAN)),
(
(2.0, 0.0),
(5.0, -7.0),
(0.13513513513513514, 0.1891891891891892),
),
((2.0, 0.0), (1e+308, 1e-308), (2e-308, 0.0)),
((2.0, 0.0), (-1.0, -0.0), (-2.0, -0.0)),
((0.0, 1.0), (f64::NAN, 0.0), (f64::NAN, f64::NAN)),
((0.0, 1.0), (f64::INFINITY, 1.0), (0.0, 0.0)),
(
(0.0, 1.0),
(f64::NEG_INFINITY, f64::NEG_INFINITY),
(f64::NAN, f64::NAN),
),
((0.0, 1.0), (0.0, 0.0), (f64::NAN, f64::INFINITY)),
((0.0, 1.0), (-0.0, 0.0), (f64::NAN, f64::INFINITY)),
((0.0, 1.0), (0.0, -0.0), (f64::NAN, f64::INFINITY)),
((0.0, 1.0), (1.0, 2.0), (0.4, 0.2)),
(
(0.0, 1.0),
(-3.0, 0.5),
(0.05405405405405404, -0.3243243243243243),
),
((0.0, 1.0), (1e+300, 1e+300), (5e-301, 5e-301)),
(
(0.0, 1.0),
(1e-300, -1e-300),
(-4.9999999999999995e+299, 4.9999999999999995e+299),
),
((0.0, 1.0), (2.0, 0.0), (0.0, 0.5)),
((0.0, 1.0), (0.0, 1.0), (1.0, 0.0)),
((0.0, 1.0), (f64::INFINITY, f64::NAN), (f64::NAN, f64::NAN)),
((0.0, 1.0), (f64::NAN, f64::NAN), (f64::NAN, f64::NAN)),
(
(0.0, 1.0),
(5.0, -7.0),
(-0.0945945945945946, 0.06756756756756757),
),
((0.0, 1.0), (1e+308, 1e-308), (0.0, 1e-308)),
((0.0, 1.0), (-1.0, -0.0), (-0.0, -1.0)),
(
(f64::INFINITY, f64::NAN),
(f64::NAN, 0.0),
(f64::NAN, f64::NAN),
),
(
(f64::INFINITY, f64::NAN),
(f64::INFINITY, 1.0),
(f64::NAN, f64::NAN),
),
(
(f64::INFINITY, f64::NAN),
(f64::NEG_INFINITY, f64::NEG_INFINITY),
(f64::NAN, f64::NAN),
),
(
(f64::INFINITY, f64::NAN),
(0.0, 0.0),
(f64::INFINITY, f64::NAN),
),
(
(f64::INFINITY, f64::NAN),
(-0.0, 0.0),
(f64::INFINITY, f64::NAN),
),
(
(f64::INFINITY, f64::NAN),
(0.0, -0.0),
(f64::INFINITY, f64::NAN),
),
((f64::INFINITY, f64::NAN), (1.0, 2.0), (f64::NAN, f64::NAN)),
((f64::INFINITY, f64::NAN), (-3.0, 0.5), (f64::NAN, f64::NAN)),
(
(f64::INFINITY, f64::NAN),
(1e+300, 1e+300),
(f64::NAN, f64::NAN),
),
(
(f64::INFINITY, f64::NAN),
(1e-300, -1e-300),
(f64::NAN, f64::NAN),
),
((f64::INFINITY, f64::NAN), (2.0, 0.0), (f64::NAN, f64::NAN)),
((f64::INFINITY, f64::NAN), (0.0, 1.0), (f64::NAN, f64::NAN)),
(
(f64::INFINITY, f64::NAN),
(f64::INFINITY, f64::NAN),
(f64::NAN, f64::NAN),
),
(
(f64::INFINITY, f64::NAN),
(f64::NAN, f64::NAN),
(f64::NAN, f64::NAN),
),
((f64::INFINITY, f64::NAN), (5.0, -7.0), (f64::NAN, f64::NAN)),
(
(f64::INFINITY, f64::NAN),
(1e+308, 1e-308),
(f64::NAN, f64::NAN),
),
(
(f64::INFINITY, f64::NAN),
(-1.0, -0.0),
(f64::NAN, f64::NAN),
),
((f64::NAN, f64::NAN), (f64::NAN, 0.0), (f64::NAN, f64::NAN)),
(
(f64::NAN, f64::NAN),
(f64::INFINITY, 1.0),
(f64::NAN, f64::NAN),
),
(
(f64::NAN, f64::NAN),
(f64::NEG_INFINITY, f64::NEG_INFINITY),
(f64::NAN, f64::NAN),
),
((f64::NAN, f64::NAN), (0.0, 0.0), (f64::NAN, f64::NAN)),
((f64::NAN, f64::NAN), (-0.0, 0.0), (f64::NAN, f64::NAN)),
((f64::NAN, f64::NAN), (0.0, -0.0), (f64::NAN, f64::NAN)),
((f64::NAN, f64::NAN), (1.0, 2.0), (f64::NAN, f64::NAN)),
((f64::NAN, f64::NAN), (-3.0, 0.5), (f64::NAN, f64::NAN)),
((f64::NAN, f64::NAN), (1e+300, 1e+300), (f64::NAN, f64::NAN)),
(
(f64::NAN, f64::NAN),
(1e-300, -1e-300),
(f64::NAN, f64::NAN),
),
((f64::NAN, f64::NAN), (2.0, 0.0), (f64::NAN, f64::NAN)),
((f64::NAN, f64::NAN), (0.0, 1.0), (f64::NAN, f64::NAN)),
(
(f64::NAN, f64::NAN),
(f64::INFINITY, f64::NAN),
(f64::NAN, f64::NAN),
),
(
(f64::NAN, f64::NAN),
(f64::NAN, f64::NAN),
(f64::NAN, f64::NAN),
),
((f64::NAN, f64::NAN), (5.0, -7.0), (f64::NAN, f64::NAN)),
((f64::NAN, f64::NAN), (1e+308, 1e-308), (f64::NAN, f64::NAN)),
((f64::NAN, f64::NAN), (-1.0, -0.0), (f64::NAN, f64::NAN)),
((5.0, -7.0), (f64::NAN, 0.0), (f64::NAN, f64::NAN)),
((5.0, -7.0), (f64::INFINITY, 1.0), (0.0, -0.0)),
(
(5.0, -7.0),
(f64::NEG_INFINITY, f64::NEG_INFINITY),
(f64::NAN, f64::NAN),
),
((5.0, -7.0), (0.0, 0.0), (f64::INFINITY, f64::NEG_INFINITY)),
((5.0, -7.0), (-0.0, 0.0), (f64::INFINITY, f64::NEG_INFINITY)),
((5.0, -7.0), (0.0, -0.0), (f64::INFINITY, f64::NEG_INFINITY)),
((5.0, -7.0), (1.0, 2.0), (-1.8, -3.4000000000000004)),
(
(5.0, -7.0),
(-3.0, 0.5),
(-1.9999999999999996, 1.9999999999999998),
),
((5.0, -7.0), (1e+300, 1e+300), (-1e-300, -6e-300)),
(
(5.0, -7.0),
(1e-300, -1e-300),
(5.999999999999999e+300, -9.999999999999999e+299),
),
((5.0, -7.0), (2.0, 0.0), (2.5, -3.5)),
((5.0, -7.0), (0.0, 1.0), (-7.0, -5.0)),
((5.0, -7.0), (f64::INFINITY, f64::NAN), (f64::NAN, f64::NAN)),
((5.0, -7.0), (f64::NAN, f64::NAN), (f64::NAN, f64::NAN)),
((5.0, -7.0), (5.0, -7.0), (1.0, -0.0)),
(
(5.0, -7.0),
(1e+308, 1e-308),
(5e-308, -6.999999999999999e-308),
),
((5.0, -7.0), (-1.0, -0.0), (-5.0, 7.0)),
((1e+308, 1e-308), (f64::NAN, 0.0), (f64::NAN, f64::NAN)),
((1e+308, 1e-308), (f64::INFINITY, 1.0), (0.0, 0.0)),
(
(1e+308, 1e-308),
(f64::NEG_INFINITY, f64::NEG_INFINITY),
(f64::NAN, f64::NAN),
),
((1e+308, 1e-308), (0.0, 0.0), (f64::INFINITY, f64::INFINITY)),
(
(1e+308, 1e-308),
(-0.0, 0.0),
(f64::INFINITY, f64::INFINITY),
),
(
(1e+308, 1e-308),
(0.0, -0.0),
(f64::INFINITY, f64::INFINITY),
),
(
(1e+308, 1e-308),
(1.0, 2.0),
(2.0000000000000002e+307, -4.0000000000000004e+307),
),
(
(1e+308, 1e-308),
(-3.0, 0.5),
(-3.243243243243243e+307, -5.4054054054054045e+306),
),
(
(1e+308, 1e-308),
(1e+300, 1e+300),
(50000000.0, -50000000.0),
),
(
(1e+308, 1e-308),
(1e-300, -1e-300),
(f64::INFINITY, f64::INFINITY),
),
((1e+308, 1e-308), (2.0, 0.0), (5e+307, 5e-309)),
((1e+308, 1e-308), (0.0, 1.0), (1e-308, -1e+308)),
(
(1e+308, 1e-308),
(f64::INFINITY, f64::NAN),
(f64::NAN, f64::NAN),
),
((1e+308, 1e-308), (f64::NAN, f64::NAN), (f64::NAN, f64::NAN)),
(
(1e+308, 1e-308),
(5.0, -7.0),
(6.756756756756758e+306, 9.45945945945946e+306),
),
(
(1e+308, 1e-308),
(1e+308, 1e-308),
(0.9999999999999999, 0.0),
),
((1e+308, 1e-308), (-1.0, -0.0), (-1e+308, -1e-308)),
((-1.0, -0.0), (f64::NAN, 0.0), (f64::NAN, f64::NAN)),
((-1.0, -0.0), (f64::INFINITY, 1.0), (-0.0, 0.0)),
(
(-1.0, -0.0),
(f64::NEG_INFINITY, f64::NEG_INFINITY),
(f64::NAN, f64::NAN),
),
((-1.0, -0.0), (0.0, 0.0), (f64::NEG_INFINITY, f64::NAN)),
((-1.0, -0.0), (-0.0, 0.0), (f64::NEG_INFINITY, f64::NAN)),
((-1.0, -0.0), (0.0, -0.0), (f64::NEG_INFINITY, f64::NAN)),
((-1.0, -0.0), (1.0, 2.0), (-0.2, 0.4)),
(
(-1.0, -0.0),
(-3.0, 0.5),
(0.3243243243243243, 0.05405405405405404),
),
((-1.0, -0.0), (1e+300, 1e+300), (-5e-301, 5e-301)),
(
(-1.0, -0.0),
(1e-300, -1e-300),
(-4.9999999999999995e+299, -4.9999999999999995e+299),
),
((-1.0, -0.0), (2.0, 0.0), (-0.5, 0.0)),
((-1.0, -0.0), (0.0, 1.0), (-0.0, 1.0)),
(
(-1.0, -0.0),
(f64::INFINITY, f64::NAN),
(f64::NAN, f64::NAN),
),
((-1.0, -0.0), (f64::NAN, f64::NAN), (f64::NAN, f64::NAN)),
(
(-1.0, -0.0),
(5.0, -7.0),
(-0.06756756756756757, -0.0945945945945946),
),
((-1.0, -0.0), (1e+308, 1e-308), (-1e-308, 0.0)),
((-1.0, -0.0), (-1.0, -0.0), (1.0, -0.0)),
];
for &((ar, ai), (br, bi), want) in CASES {
let (a, b) = (Complex::new(ar, ai), Complex::new(br, bi));
check_c("div", &format!("{a:?}, {b:?}"), a / b, want, 1e-5, false);
let mut t = a;
t /= b;
check_c("div_assign", &format!("{a:?}, {b:?}"), t, want, 1e-5, false);
}
}
#[test]
fn complex_add_f32() {
let _report = Report;
const CASES: &[((f32, f32), (f32, f32), (f32, f32))] = &[
((f32::NAN, 0.0), (f32::NAN, 0.0), (f32::NAN, 0.0)),
((f32::NAN, 0.0), (f32::INFINITY, 1.0), (f32::NAN, 1.0)),
(
(f32::NAN, 0.0),
(f32::NEG_INFINITY, f32::NEG_INFINITY),
(f32::NAN, f32::NEG_INFINITY),
),
((f32::NAN, 0.0), (0.0, 0.0), (f32::NAN, 0.0)),
((f32::NAN, 0.0), (-0.0, 0.0), (f32::NAN, 0.0)),
((f32::NAN, 0.0), (0.0, -0.0), (f32::NAN, 0.0)),
((f32::NAN, 0.0), (1.0, 2.0), (f32::NAN, 2.0)),
((f32::NAN, 0.0), (-3.0, 0.5), (f32::NAN, 0.5)),
((f32::NAN, 0.0), (0.0, -0.0), (f32::NAN, 0.0)),
((f32::NAN, 0.0), (2.0, 0.0), (f32::NAN, 0.0)),
((f32::NAN, 0.0), (0.0, 1.0), (f32::NAN, 1.0)),
(
(f32::NAN, 0.0),
(f32::INFINITY, f32::NAN),
(f32::NAN, f32::NAN),
),
((f32::NAN, 0.0), (f32::NAN, f32::NAN), (f32::NAN, f32::NAN)),
((f32::NAN, 0.0), (5.0, -7.0), (f32::NAN, -7.0)),
((f32::NAN, 0.0), (-1.0, -0.0), (f32::NAN, 0.0)),
((f32::INFINITY, 1.0), (f32::NAN, 0.0), (f32::NAN, 1.0)),
(
(f32::INFINITY, 1.0),
(f32::INFINITY, 1.0),
(f32::INFINITY, 2.0),
),
(
(f32::INFINITY, 1.0),
(f32::NEG_INFINITY, f32::NEG_INFINITY),
(f32::NAN, f32::NEG_INFINITY),
),
((f32::INFINITY, 1.0), (0.0, 0.0), (f32::INFINITY, 1.0)),
((f32::INFINITY, 1.0), (-0.0, 0.0), (f32::INFINITY, 1.0)),
((f32::INFINITY, 1.0), (0.0, -0.0), (f32::INFINITY, 1.0)),
((f32::INFINITY, 1.0), (1.0, 2.0), (f32::INFINITY, 3.0)),
((f32::INFINITY, 1.0), (-3.0, 0.5), (f32::INFINITY, 1.5)),
((f32::INFINITY, 1.0), (0.0, -0.0), (f32::INFINITY, 1.0)),
((f32::INFINITY, 1.0), (2.0, 0.0), (f32::INFINITY, 1.0)),
((f32::INFINITY, 1.0), (0.0, 1.0), (f32::INFINITY, 2.0)),
(
(f32::INFINITY, 1.0),
(f32::INFINITY, f32::NAN),
(f32::INFINITY, f32::NAN),
),
(
(f32::INFINITY, 1.0),
(f32::NAN, f32::NAN),
(f32::NAN, f32::NAN),
),
((f32::INFINITY, 1.0), (5.0, -7.0), (f32::INFINITY, -6.0)),
((f32::INFINITY, 1.0), (-1.0, -0.0), (f32::INFINITY, 1.0)),
(
(f32::NEG_INFINITY, f32::NEG_INFINITY),
(f32::NAN, 0.0),
(f32::NAN, f32::NEG_INFINITY),
),
(
(f32::NEG_INFINITY, f32::NEG_INFINITY),
(f32::INFINITY, 1.0),
(f32::NAN, f32::NEG_INFINITY),
),
(
(f32::NEG_INFINITY, f32::NEG_INFINITY),
(f32::NEG_INFINITY, f32::NEG_INFINITY),
(f32::NEG_INFINITY, f32::NEG_INFINITY),
),
(
(f32::NEG_INFINITY, f32::NEG_INFINITY),
(0.0, 0.0),
(f32::NEG_INFINITY, f32::NEG_INFINITY),
),
(
(f32::NEG_INFINITY, f32::NEG_INFINITY),
(-0.0, 0.0),
(f32::NEG_INFINITY, f32::NEG_INFINITY),
),
(
(f32::NEG_INFINITY, f32::NEG_INFINITY),
(0.0, -0.0),
(f32::NEG_INFINITY, f32::NEG_INFINITY),
),
(
(f32::NEG_INFINITY, f32::NEG_INFINITY),
(1.0, 2.0),
(f32::NEG_INFINITY, f32::NEG_INFINITY),
),
(
(f32::NEG_INFINITY, f32::NEG_INFINITY),
(-3.0, 0.5),
(f32::NEG_INFINITY, f32::NEG_INFINITY),
),
(
(f32::NEG_INFINITY, f32::NEG_INFINITY),
(0.0, -0.0),
(f32::NEG_INFINITY, f32::NEG_INFINITY),
),
(
(f32::NEG_INFINITY, f32::NEG_INFINITY),
(2.0, 0.0),
(f32::NEG_INFINITY, f32::NEG_INFINITY),
),
(
(f32::NEG_INFINITY, f32::NEG_INFINITY),
(0.0, 1.0),
(f32::NEG_INFINITY, f32::NEG_INFINITY),
),
(
(f32::NEG_INFINITY, f32::NEG_INFINITY),
(f32::INFINITY, f32::NAN),
(f32::NAN, f32::NAN),
),
(
(f32::NEG_INFINITY, f32::NEG_INFINITY),
(f32::NAN, f32::NAN),
(f32::NAN, f32::NAN),
),
(
(f32::NEG_INFINITY, f32::NEG_INFINITY),
(5.0, -7.0),
(f32::NEG_INFINITY, f32::NEG_INFINITY),
),
(
(f32::NEG_INFINITY, f32::NEG_INFINITY),
(-1.0, -0.0),
(f32::NEG_INFINITY, f32::NEG_INFINITY),
),
((0.0, 0.0), (f32::NAN, 0.0), (f32::NAN, 0.0)),
((0.0, 0.0), (f32::INFINITY, 1.0), (f32::INFINITY, 1.0)),
(
(0.0, 0.0),
(f32::NEG_INFINITY, f32::NEG_INFINITY),
(f32::NEG_INFINITY, f32::NEG_INFINITY),
),
((0.0, 0.0), (0.0, 0.0), (0.0, 0.0)),
((0.0, 0.0), (-0.0, 0.0), (0.0, 0.0)),
((0.0, 0.0), (0.0, -0.0), (0.0, 0.0)),
((0.0, 0.0), (1.0, 2.0), (1.0, 2.0)),
((0.0, 0.0), (-3.0, 0.5), (-3.0, 0.5)),
((0.0, 0.0), (0.0, -0.0), (0.0, 0.0)),
((0.0, 0.0), (2.0, 0.0), (2.0, 0.0)),
((0.0, 0.0), (0.0, 1.0), (0.0, 1.0)),
(
(0.0, 0.0),
(f32::INFINITY, f32::NAN),
(f32::INFINITY, f32::NAN),
),
((0.0, 0.0), (f32::NAN, f32::NAN), (f32::NAN, f32::NAN)),
((0.0, 0.0), (5.0, -7.0), (5.0, -7.0)),
((0.0, 0.0), (-1.0, -0.0), (-1.0, 0.0)),
((-0.0, 0.0), (f32::NAN, 0.0), (f32::NAN, 0.0)),
((-0.0, 0.0), (f32::INFINITY, 1.0), (f32::INFINITY, 1.0)),
(
(-0.0, 0.0),
(f32::NEG_INFINITY, f32::NEG_INFINITY),
(f32::NEG_INFINITY, f32::NEG_INFINITY),
),
((-0.0, 0.0), (0.0, 0.0), (0.0, 0.0)),
((-0.0, 0.0), (-0.0, 0.0), (-0.0, 0.0)),
((-0.0, 0.0), (0.0, -0.0), (0.0, 0.0)),
((-0.0, 0.0), (1.0, 2.0), (1.0, 2.0)),
((-0.0, 0.0), (-3.0, 0.5), (-3.0, 0.5)),
((-0.0, 0.0), (0.0, -0.0), (0.0, 0.0)),
((-0.0, 0.0), (2.0, 0.0), (2.0, 0.0)),
((-0.0, 0.0), (0.0, 1.0), (0.0, 1.0)),
(
(-0.0, 0.0),
(f32::INFINITY, f32::NAN),
(f32::INFINITY, f32::NAN),
),
((-0.0, 0.0), (f32::NAN, f32::NAN), (f32::NAN, f32::NAN)),
((-0.0, 0.0), (5.0, -7.0), (5.0, -7.0)),
((-0.0, 0.0), (-1.0, -0.0), (-1.0, 0.0)),
((0.0, -0.0), (f32::NAN, 0.0), (f32::NAN, 0.0)),
((0.0, -0.0), (f32::INFINITY, 1.0), (f32::INFINITY, 1.0)),
(
(0.0, -0.0),
(f32::NEG_INFINITY, f32::NEG_INFINITY),
(f32::NEG_INFINITY, f32::NEG_INFINITY),
),
((0.0, -0.0), (0.0, 0.0), (0.0, 0.0)),
((0.0, -0.0), (-0.0, 0.0), (0.0, 0.0)),
((0.0, -0.0), (0.0, -0.0), (0.0, -0.0)),
((0.0, -0.0), (1.0, 2.0), (1.0, 2.0)),
((0.0, -0.0), (-3.0, 0.5), (-3.0, 0.5)),
((0.0, -0.0), (0.0, -0.0), (0.0, -0.0)),
((0.0, -0.0), (2.0, 0.0), (2.0, 0.0)),
((0.0, -0.0), (0.0, 1.0), (0.0, 1.0)),
(
(0.0, -0.0),
(f32::INFINITY, f32::NAN),
(f32::INFINITY, f32::NAN),
),
((0.0, -0.0), (f32::NAN, f32::NAN), (f32::NAN, f32::NAN)),
((0.0, -0.0), (5.0, -7.0), (5.0, -7.0)),
((0.0, -0.0), (-1.0, -0.0), (-1.0, -0.0)),
((1.0, 2.0), (f32::NAN, 0.0), (f32::NAN, 2.0)),
((1.0, 2.0), (f32::INFINITY, 1.0), (f32::INFINITY, 3.0)),
(
(1.0, 2.0),
(f32::NEG_INFINITY, f32::NEG_INFINITY),
(f32::NEG_INFINITY, f32::NEG_INFINITY),
),
((1.0, 2.0), (0.0, 0.0), (1.0, 2.0)),
((1.0, 2.0), (-0.0, 0.0), (1.0, 2.0)),
((1.0, 2.0), (0.0, -0.0), (1.0, 2.0)),
((1.0, 2.0), (1.0, 2.0), (2.0, 4.0)),
((1.0, 2.0), (-3.0, 0.5), (-2.0, 2.5)),
((1.0, 2.0), (0.0, -0.0), (1.0, 2.0)),
((1.0, 2.0), (2.0, 0.0), (3.0, 2.0)),
((1.0, 2.0), (0.0, 1.0), (1.0, 3.0)),
(
(1.0, 2.0),
(f32::INFINITY, f32::NAN),
(f32::INFINITY, f32::NAN),
),
((1.0, 2.0), (f32::NAN, f32::NAN), (f32::NAN, f32::NAN)),
((1.0, 2.0), (5.0, -7.0), (6.0, -5.0)),
((1.0, 2.0), (-1.0, -0.0), (0.0, 2.0)),
((-3.0, 0.5), (f32::NAN, 0.0), (f32::NAN, 0.5)),
((-3.0, 0.5), (f32::INFINITY, 1.0), (f32::INFINITY, 1.5)),
(
(-3.0, 0.5),
(f32::NEG_INFINITY, f32::NEG_INFINITY),
(f32::NEG_INFINITY, f32::NEG_INFINITY),
),
((-3.0, 0.5), (0.0, 0.0), (-3.0, 0.5)),
((-3.0, 0.5), (-0.0, 0.0), (-3.0, 0.5)),
((-3.0, 0.5), (0.0, -0.0), (-3.0, 0.5)),
((-3.0, 0.5), (1.0, 2.0), (-2.0, 2.5)),
((-3.0, 0.5), (-3.0, 0.5), (-6.0, 1.0)),
((-3.0, 0.5), (0.0, -0.0), (-3.0, 0.5)),
((-3.0, 0.5), (2.0, 0.0), (-1.0, 0.5)),
((-3.0, 0.5), (0.0, 1.0), (-3.0, 1.5)),
(
(-3.0, 0.5),
(f32::INFINITY, f32::NAN),
(f32::INFINITY, f32::NAN),
),
((-3.0, 0.5), (f32::NAN, f32::NAN), (f32::NAN, f32::NAN)),
((-3.0, 0.5), (5.0, -7.0), (2.0, -6.5)),
((-3.0, 0.5), (-1.0, -0.0), (-4.0, 0.5)),
((0.0, -0.0), (f32::NAN, 0.0), (f32::NAN, 0.0)),
((0.0, -0.0), (f32::INFINITY, 1.0), (f32::INFINITY, 1.0)),
(
(0.0, -0.0),
(f32::NEG_INFINITY, f32::NEG_INFINITY),
(f32::NEG_INFINITY, f32::NEG_INFINITY),
),
((0.0, -0.0), (0.0, 0.0), (0.0, 0.0)),
((0.0, -0.0), (-0.0, 0.0), (0.0, 0.0)),
((0.0, -0.0), (0.0, -0.0), (0.0, -0.0)),
((0.0, -0.0), (1.0, 2.0), (1.0, 2.0)),
((0.0, -0.0), (-3.0, 0.5), (-3.0, 0.5)),
((0.0, -0.0), (0.0, -0.0), (0.0, -0.0)),
((0.0, -0.0), (2.0, 0.0), (2.0, 0.0)),
((0.0, -0.0), (0.0, 1.0), (0.0, 1.0)),
(
(0.0, -0.0),
(f32::INFINITY, f32::NAN),
(f32::INFINITY, f32::NAN),
),
((0.0, -0.0), (f32::NAN, f32::NAN), (f32::NAN, f32::NAN)),
((0.0, -0.0), (5.0, -7.0), (5.0, -7.0)),
((0.0, -0.0), (-1.0, -0.0), (-1.0, -0.0)),
((2.0, 0.0), (f32::NAN, 0.0), (f32::NAN, 0.0)),
((2.0, 0.0), (f32::INFINITY, 1.0), (f32::INFINITY, 1.0)),
(
(2.0, 0.0),
(f32::NEG_INFINITY, f32::NEG_INFINITY),
(f32::NEG_INFINITY, f32::NEG_INFINITY),
),
((2.0, 0.0), (0.0, 0.0), (2.0, 0.0)),
((2.0, 0.0), (-0.0, 0.0), (2.0, 0.0)),
((2.0, 0.0), (0.0, -0.0), (2.0, 0.0)),
((2.0, 0.0), (1.0, 2.0), (3.0, 2.0)),
((2.0, 0.0), (-3.0, 0.5), (-1.0, 0.5)),
((2.0, 0.0), (0.0, -0.0), (2.0, 0.0)),
((2.0, 0.0), (2.0, 0.0), (4.0, 0.0)),
((2.0, 0.0), (0.0, 1.0), (2.0, 1.0)),
(
(2.0, 0.0),
(f32::INFINITY, f32::NAN),
(f32::INFINITY, f32::NAN),
),
((2.0, 0.0), (f32::NAN, f32::NAN), (f32::NAN, f32::NAN)),
((2.0, 0.0), (5.0, -7.0), (7.0, -7.0)),
((2.0, 0.0), (-1.0, -0.0), (1.0, 0.0)),
((0.0, 1.0), (f32::NAN, 0.0), (f32::NAN, 1.0)),
((0.0, 1.0), (f32::INFINITY, 1.0), (f32::INFINITY, 2.0)),
(
(0.0, 1.0),
(f32::NEG_INFINITY, f32::NEG_INFINITY),
(f32::NEG_INFINITY, f32::NEG_INFINITY),
),
((0.0, 1.0), (0.0, 0.0), (0.0, 1.0)),
((0.0, 1.0), (-0.0, 0.0), (0.0, 1.0)),
((0.0, 1.0), (0.0, -0.0), (0.0, 1.0)),
((0.0, 1.0), (1.0, 2.0), (1.0, 3.0)),
((0.0, 1.0), (-3.0, 0.5), (-3.0, 1.5)),
((0.0, 1.0), (0.0, -0.0), (0.0, 1.0)),
((0.0, 1.0), (2.0, 0.0), (2.0, 1.0)),
((0.0, 1.0), (0.0, 1.0), (0.0, 2.0)),
(
(0.0, 1.0),
(f32::INFINITY, f32::NAN),
(f32::INFINITY, f32::NAN),
),
((0.0, 1.0), (f32::NAN, f32::NAN), (f32::NAN, f32::NAN)),
((0.0, 1.0), (5.0, -7.0), (5.0, -6.0)),
((0.0, 1.0), (-1.0, -0.0), (-1.0, 1.0)),
(
(f32::INFINITY, f32::NAN),
(f32::NAN, 0.0),
(f32::NAN, f32::NAN),
),
(
(f32::INFINITY, f32::NAN),
(f32::INFINITY, 1.0),
(f32::INFINITY, f32::NAN),
),
(
(f32::INFINITY, f32::NAN),
(f32::NEG_INFINITY, f32::NEG_INFINITY),
(f32::NAN, f32::NAN),
),
(
(f32::INFINITY, f32::NAN),
(0.0, 0.0),
(f32::INFINITY, f32::NAN),
),
(
(f32::INFINITY, f32::NAN),
(-0.0, 0.0),
(f32::INFINITY, f32::NAN),
),
(
(f32::INFINITY, f32::NAN),
(0.0, -0.0),
(f32::INFINITY, f32::NAN),
),
(
(f32::INFINITY, f32::NAN),
(1.0, 2.0),
(f32::INFINITY, f32::NAN),
),
(
(f32::INFINITY, f32::NAN),
(-3.0, 0.5),
(f32::INFINITY, f32::NAN),
),
(
(f32::INFINITY, f32::NAN),
(0.0, -0.0),
(f32::INFINITY, f32::NAN),
),
(
(f32::INFINITY, f32::NAN),
(2.0, 0.0),
(f32::INFINITY, f32::NAN),
),
(
(f32::INFINITY, f32::NAN),
(0.0, 1.0),
(f32::INFINITY, f32::NAN),
),
(
(f32::INFINITY, f32::NAN),
(f32::INFINITY, f32::NAN),
(f32::INFINITY, f32::NAN),
),
(
(f32::INFINITY, f32::NAN),
(f32::NAN, f32::NAN),
(f32::NAN, f32::NAN),
),
(
(f32::INFINITY, f32::NAN),
(5.0, -7.0),
(f32::INFINITY, f32::NAN),
),
(
(f32::INFINITY, f32::NAN),
(-1.0, -0.0),
(f32::INFINITY, f32::NAN),
),
((f32::NAN, f32::NAN), (f32::NAN, 0.0), (f32::NAN, f32::NAN)),
(
(f32::NAN, f32::NAN),
(f32::INFINITY, 1.0),
(f32::NAN, f32::NAN),
),
(
(f32::NAN, f32::NAN),
(f32::NEG_INFINITY, f32::NEG_INFINITY),
(f32::NAN, f32::NAN),
),
((f32::NAN, f32::NAN), (0.0, 0.0), (f32::NAN, f32::NAN)),
((f32::NAN, f32::NAN), (-0.0, 0.0), (f32::NAN, f32::NAN)),
((f32::NAN, f32::NAN), (0.0, -0.0), (f32::NAN, f32::NAN)),
((f32::NAN, f32::NAN), (1.0, 2.0), (f32::NAN, f32::NAN)),
((f32::NAN, f32::NAN), (-3.0, 0.5), (f32::NAN, f32::NAN)),
((f32::NAN, f32::NAN), (0.0, -0.0), (f32::NAN, f32::NAN)),
((f32::NAN, f32::NAN), (2.0, 0.0), (f32::NAN, f32::NAN)),
((f32::NAN, f32::NAN), (0.0, 1.0), (f32::NAN, f32::NAN)),
(
(f32::NAN, f32::NAN),
(f32::INFINITY, f32::NAN),
(f32::NAN, f32::NAN),
),
(
(f32::NAN, f32::NAN),
(f32::NAN, f32::NAN),
(f32::NAN, f32::NAN),
),
((f32::NAN, f32::NAN), (5.0, -7.0), (f32::NAN, f32::NAN)),
((f32::NAN, f32::NAN), (-1.0, -0.0), (f32::NAN, f32::NAN)),
((5.0, -7.0), (f32::NAN, 0.0), (f32::NAN, -7.0)),
((5.0, -7.0), (f32::INFINITY, 1.0), (f32::INFINITY, -6.0)),
(
(5.0, -7.0),
(f32::NEG_INFINITY, f32::NEG_INFINITY),
(f32::NEG_INFINITY, f32::NEG_INFINITY),
),
((5.0, -7.0), (0.0, 0.0), (5.0, -7.0)),
((5.0, -7.0), (-0.0, 0.0), (5.0, -7.0)),
((5.0, -7.0), (0.0, -0.0), (5.0, -7.0)),
((5.0, -7.0), (1.0, 2.0), (6.0, -5.0)),
((5.0, -7.0), (-3.0, 0.5), (2.0, -6.5)),
((5.0, -7.0), (0.0, -0.0), (5.0, -7.0)),
((5.0, -7.0), (2.0, 0.0), (7.0, -7.0)),
((5.0, -7.0), (0.0, 1.0), (5.0, -6.0)),
(
(5.0, -7.0),
(f32::INFINITY, f32::NAN),
(f32::INFINITY, f32::NAN),
),
((5.0, -7.0), (f32::NAN, f32::NAN), (f32::NAN, f32::NAN)),
((5.0, -7.0), (5.0, -7.0), (10.0, -14.0)),
((5.0, -7.0), (-1.0, -0.0), (4.0, -7.0)),
((-1.0, -0.0), (f32::NAN, 0.0), (f32::NAN, 0.0)),
((-1.0, -0.0), (f32::INFINITY, 1.0), (f32::INFINITY, 1.0)),
(
(-1.0, -0.0),
(f32::NEG_INFINITY, f32::NEG_INFINITY),
(f32::NEG_INFINITY, f32::NEG_INFINITY),
),
((-1.0, -0.0), (0.0, 0.0), (-1.0, 0.0)),
((-1.0, -0.0), (-0.0, 0.0), (-1.0, 0.0)),
((-1.0, -0.0), (0.0, -0.0), (-1.0, -0.0)),
((-1.0, -0.0), (1.0, 2.0), (0.0, 2.0)),
((-1.0, -0.0), (-3.0, 0.5), (-4.0, 0.5)),
((-1.0, -0.0), (0.0, -0.0), (-1.0, -0.0)),
((-1.0, -0.0), (2.0, 0.0), (1.0, 0.0)),
((-1.0, -0.0), (0.0, 1.0), (-1.0, 1.0)),
(
(-1.0, -0.0),
(f32::INFINITY, f32::NAN),
(f32::INFINITY, f32::NAN),
),
((-1.0, -0.0), (f32::NAN, f32::NAN), (f32::NAN, f32::NAN)),
((-1.0, -0.0), (5.0, -7.0), (4.0, -7.0)),
((-1.0, -0.0), (-1.0, -0.0), (-2.0, -0.0)),
];
for &((ar, ai), (br, bi), want) in CASES {
let (a, b) = (Complex::new(ar, ai), Complex::new(br, bi));
check_c("add", &format!("{a:?}, {b:?}"), a + b, want, 1e-5, false);
let mut t = a;
t += b;
check_c("add_assign", &format!("{a:?}, {b:?}"), t, want, 1e-5, false);
}
}
#[test]
fn complex_sub_f32() {
let _report = Report;
const CASES: &[((f32, f32), (f32, f32), (f32, f32))] = &[
((f32::NAN, 0.0), (f32::NAN, 0.0), (f32::NAN, 0.0)),
((f32::NAN, 0.0), (f32::INFINITY, 1.0), (f32::NAN, -1.0)),
(
(f32::NAN, 0.0),
(f32::NEG_INFINITY, f32::NEG_INFINITY),
(f32::NAN, f32::INFINITY),
),
((f32::NAN, 0.0), (0.0, 0.0), (f32::NAN, 0.0)),
((f32::NAN, 0.0), (-0.0, 0.0), (f32::NAN, 0.0)),
((f32::NAN, 0.0), (0.0, -0.0), (f32::NAN, 0.0)),
((f32::NAN, 0.0), (1.0, 2.0), (f32::NAN, -2.0)),
((f32::NAN, 0.0), (-3.0, 0.5), (f32::NAN, -0.5)),
((f32::NAN, 0.0), (0.0, -0.0), (f32::NAN, 0.0)),
((f32::NAN, 0.0), (2.0, 0.0), (f32::NAN, 0.0)),
((f32::NAN, 0.0), (0.0, 1.0), (f32::NAN, -1.0)),
(
(f32::NAN, 0.0),
(f32::INFINITY, f32::NAN),
(f32::NAN, f32::NAN),
),
((f32::NAN, 0.0), (f32::NAN, f32::NAN), (f32::NAN, f32::NAN)),
((f32::NAN, 0.0), (5.0, -7.0), (f32::NAN, 7.0)),
((f32::NAN, 0.0), (-1.0, -0.0), (f32::NAN, 0.0)),
((f32::INFINITY, 1.0), (f32::NAN, 0.0), (f32::NAN, 1.0)),
((f32::INFINITY, 1.0), (f32::INFINITY, 1.0), (f32::NAN, 0.0)),
(
(f32::INFINITY, 1.0),
(f32::NEG_INFINITY, f32::NEG_INFINITY),
(f32::INFINITY, f32::INFINITY),
),
((f32::INFINITY, 1.0), (0.0, 0.0), (f32::INFINITY, 1.0)),
((f32::INFINITY, 1.0), (-0.0, 0.0), (f32::INFINITY, 1.0)),
((f32::INFINITY, 1.0), (0.0, -0.0), (f32::INFINITY, 1.0)),
((f32::INFINITY, 1.0), (1.0, 2.0), (f32::INFINITY, -1.0)),
((f32::INFINITY, 1.0), (-3.0, 0.5), (f32::INFINITY, 0.5)),
((f32::INFINITY, 1.0), (0.0, -0.0), (f32::INFINITY, 1.0)),
((f32::INFINITY, 1.0), (2.0, 0.0), (f32::INFINITY, 1.0)),
((f32::INFINITY, 1.0), (0.0, 1.0), (f32::INFINITY, 0.0)),
(
(f32::INFINITY, 1.0),
(f32::INFINITY, f32::NAN),
(f32::NAN, f32::NAN),
),
(
(f32::INFINITY, 1.0),
(f32::NAN, f32::NAN),
(f32::NAN, f32::NAN),
),
((f32::INFINITY, 1.0), (5.0, -7.0), (f32::INFINITY, 8.0)),
((f32::INFINITY, 1.0), (-1.0, -0.0), (f32::INFINITY, 1.0)),
(
(f32::NEG_INFINITY, f32::NEG_INFINITY),
(f32::NAN, 0.0),
(f32::NAN, f32::NEG_INFINITY),
),
(
(f32::NEG_INFINITY, f32::NEG_INFINITY),
(f32::INFINITY, 1.0),
(f32::NEG_INFINITY, f32::NEG_INFINITY),
),
(
(f32::NEG_INFINITY, f32::NEG_INFINITY),
(f32::NEG_INFINITY, f32::NEG_INFINITY),
(f32::NAN, f32::NAN),
),
(
(f32::NEG_INFINITY, f32::NEG_INFINITY),
(0.0, 0.0),
(f32::NEG_INFINITY, f32::NEG_INFINITY),
),
(
(f32::NEG_INFINITY, f32::NEG_INFINITY),
(-0.0, 0.0),
(f32::NEG_INFINITY, f32::NEG_INFINITY),
),
(
(f32::NEG_INFINITY, f32::NEG_INFINITY),
(0.0, -0.0),
(f32::NEG_INFINITY, f32::NEG_INFINITY),
),
(
(f32::NEG_INFINITY, f32::NEG_INFINITY),
(1.0, 2.0),
(f32::NEG_INFINITY, f32::NEG_INFINITY),
),
(
(f32::NEG_INFINITY, f32::NEG_INFINITY),
(-3.0, 0.5),
(f32::NEG_INFINITY, f32::NEG_INFINITY),
),
(
(f32::NEG_INFINITY, f32::NEG_INFINITY),
(0.0, -0.0),
(f32::NEG_INFINITY, f32::NEG_INFINITY),
),
(
(f32::NEG_INFINITY, f32::NEG_INFINITY),
(2.0, 0.0),
(f32::NEG_INFINITY, f32::NEG_INFINITY),
),
(
(f32::NEG_INFINITY, f32::NEG_INFINITY),
(0.0, 1.0),
(f32::NEG_INFINITY, f32::NEG_INFINITY),
),
(
(f32::NEG_INFINITY, f32::NEG_INFINITY),
(f32::INFINITY, f32::NAN),
(f32::NEG_INFINITY, f32::NAN),
),
(
(f32::NEG_INFINITY, f32::NEG_INFINITY),
(f32::NAN, f32::NAN),
(f32::NAN, f32::NAN),
),
(
(f32::NEG_INFINITY, f32::NEG_INFINITY),
(5.0, -7.0),
(f32::NEG_INFINITY, f32::NEG_INFINITY),
),
(
(f32::NEG_INFINITY, f32::NEG_INFINITY),
(-1.0, -0.0),
(f32::NEG_INFINITY, f32::NEG_INFINITY),
),
((0.0, 0.0), (f32::NAN, 0.0), (f32::NAN, 0.0)),
((0.0, 0.0), (f32::INFINITY, 1.0), (f32::NEG_INFINITY, -1.0)),
(
(0.0, 0.0),
(f32::NEG_INFINITY, f32::NEG_INFINITY),
(f32::INFINITY, f32::INFINITY),
),
((0.0, 0.0), (0.0, 0.0), (0.0, 0.0)),
((0.0, 0.0), (-0.0, 0.0), (0.0, 0.0)),
((0.0, 0.0), (0.0, -0.0), (0.0, 0.0)),
((0.0, 0.0), (1.0, 2.0), (-1.0, -2.0)),
((0.0, 0.0), (-3.0, 0.5), (3.0, -0.5)),
((0.0, 0.0), (0.0, -0.0), (0.0, 0.0)),
((0.0, 0.0), (2.0, 0.0), (-2.0, 0.0)),
((0.0, 0.0), (0.0, 1.0), (0.0, -1.0)),
(
(0.0, 0.0),
(f32::INFINITY, f32::NAN),
(f32::NEG_INFINITY, f32::NAN),
),
((0.0, 0.0), (f32::NAN, f32::NAN), (f32::NAN, f32::NAN)),
((0.0, 0.0), (5.0, -7.0), (-5.0, 7.0)),
((0.0, 0.0), (-1.0, -0.0), (1.0, 0.0)),
((-0.0, 0.0), (f32::NAN, 0.0), (f32::NAN, 0.0)),
((-0.0, 0.0), (f32::INFINITY, 1.0), (f32::NEG_INFINITY, -1.0)),
(
(-0.0, 0.0),
(f32::NEG_INFINITY, f32::NEG_INFINITY),
(f32::INFINITY, f32::INFINITY),
),
((-0.0, 0.0), (0.0, 0.0), (-0.0, 0.0)),
((-0.0, 0.0), (-0.0, 0.0), (0.0, 0.0)),
((-0.0, 0.0), (0.0, -0.0), (-0.0, 0.0)),
((-0.0, 0.0), (1.0, 2.0), (-1.0, -2.0)),
((-0.0, 0.0), (-3.0, 0.5), (3.0, -0.5)),
((-0.0, 0.0), (0.0, -0.0), (-0.0, 0.0)),
((-0.0, 0.0), (2.0, 0.0), (-2.0, 0.0)),
((-0.0, 0.0), (0.0, 1.0), (-0.0, -1.0)),
(
(-0.0, 0.0),
(f32::INFINITY, f32::NAN),
(f32::NEG_INFINITY, f32::NAN),
),
((-0.0, 0.0), (f32::NAN, f32::NAN), (f32::NAN, f32::NAN)),
((-0.0, 0.0), (5.0, -7.0), (-5.0, 7.0)),
((-0.0, 0.0), (-1.0, -0.0), (1.0, 0.0)),
((0.0, -0.0), (f32::NAN, 0.0), (f32::NAN, -0.0)),
((0.0, -0.0), (f32::INFINITY, 1.0), (f32::NEG_INFINITY, -1.0)),
(
(0.0, -0.0),
(f32::NEG_INFINITY, f32::NEG_INFINITY),
(f32::INFINITY, f32::INFINITY),
),
((0.0, -0.0), (0.0, 0.0), (0.0, -0.0)),
((0.0, -0.0), (-0.0, 0.0), (0.0, -0.0)),
((0.0, -0.0), (0.0, -0.0), (0.0, 0.0)),
((0.0, -0.0), (1.0, 2.0), (-1.0, -2.0)),
((0.0, -0.0), (-3.0, 0.5), (3.0, -0.5)),
((0.0, -0.0), (0.0, -0.0), (0.0, 0.0)),
((0.0, -0.0), (2.0, 0.0), (-2.0, -0.0)),
((0.0, -0.0), (0.0, 1.0), (0.0, -1.0)),
(
(0.0, -0.0),
(f32::INFINITY, f32::NAN),
(f32::NEG_INFINITY, f32::NAN),
),
((0.0, -0.0), (f32::NAN, f32::NAN), (f32::NAN, f32::NAN)),
((0.0, -0.0), (5.0, -7.0), (-5.0, 7.0)),
((0.0, -0.0), (-1.0, -0.0), (1.0, 0.0)),
((1.0, 2.0), (f32::NAN, 0.0), (f32::NAN, 2.0)),
((1.0, 2.0), (f32::INFINITY, 1.0), (f32::NEG_INFINITY, 1.0)),
(
(1.0, 2.0),
(f32::NEG_INFINITY, f32::NEG_INFINITY),
(f32::INFINITY, f32::INFINITY),
),
((1.0, 2.0), (0.0, 0.0), (1.0, 2.0)),
((1.0, 2.0), (-0.0, 0.0), (1.0, 2.0)),
((1.0, 2.0), (0.0, -0.0), (1.0, 2.0)),
((1.0, 2.0), (1.0, 2.0), (0.0, 0.0)),
((1.0, 2.0), (-3.0, 0.5), (4.0, 1.5)),
((1.0, 2.0), (0.0, -0.0), (1.0, 2.0)),
((1.0, 2.0), (2.0, 0.0), (-1.0, 2.0)),
((1.0, 2.0), (0.0, 1.0), (1.0, 1.0)),
(
(1.0, 2.0),
(f32::INFINITY, f32::NAN),
(f32::NEG_INFINITY, f32::NAN),
),
((1.0, 2.0), (f32::NAN, f32::NAN), (f32::NAN, f32::NAN)),
((1.0, 2.0), (5.0, -7.0), (-4.0, 9.0)),
((1.0, 2.0), (-1.0, -0.0), (2.0, 2.0)),
((-3.0, 0.5), (f32::NAN, 0.0), (f32::NAN, 0.5)),
((-3.0, 0.5), (f32::INFINITY, 1.0), (f32::NEG_INFINITY, -0.5)),
(
(-3.0, 0.5),
(f32::NEG_INFINITY, f32::NEG_INFINITY),
(f32::INFINITY, f32::INFINITY),
),
((-3.0, 0.5), (0.0, 0.0), (-3.0, 0.5)),
((-3.0, 0.5), (-0.0, 0.0), (-3.0, 0.5)),
((-3.0, 0.5), (0.0, -0.0), (-3.0, 0.5)),
((-3.0, 0.5), (1.0, 2.0), (-4.0, -1.5)),
((-3.0, 0.5), (-3.0, 0.5), (0.0, 0.0)),
((-3.0, 0.5), (0.0, -0.0), (-3.0, 0.5)),
((-3.0, 0.5), (2.0, 0.0), (-5.0, 0.5)),
((-3.0, 0.5), (0.0, 1.0), (-3.0, -0.5)),
(
(-3.0, 0.5),
(f32::INFINITY, f32::NAN),
(f32::NEG_INFINITY, f32::NAN),
),
((-3.0, 0.5), (f32::NAN, f32::NAN), (f32::NAN, f32::NAN)),
((-3.0, 0.5), (5.0, -7.0), (-8.0, 7.5)),
((-3.0, 0.5), (-1.0, -0.0), (-2.0, 0.5)),
((0.0, -0.0), (f32::NAN, 0.0), (f32::NAN, -0.0)),
((0.0, -0.0), (f32::INFINITY, 1.0), (f32::NEG_INFINITY, -1.0)),
(
(0.0, -0.0),
(f32::NEG_INFINITY, f32::NEG_INFINITY),
(f32::INFINITY, f32::INFINITY),
),
((0.0, -0.0), (0.0, 0.0), (0.0, -0.0)),
((0.0, -0.0), (-0.0, 0.0), (0.0, -0.0)),
((0.0, -0.0), (0.0, -0.0), (0.0, 0.0)),
((0.0, -0.0), (1.0, 2.0), (-1.0, -2.0)),
((0.0, -0.0), (-3.0, 0.5), (3.0, -0.5)),
((0.0, -0.0), (0.0, -0.0), (0.0, 0.0)),
((0.0, -0.0), (2.0, 0.0), (-2.0, -0.0)),
((0.0, -0.0), (0.0, 1.0), (0.0, -1.0)),
(
(0.0, -0.0),
(f32::INFINITY, f32::NAN),
(f32::NEG_INFINITY, f32::NAN),
),
((0.0, -0.0), (f32::NAN, f32::NAN), (f32::NAN, f32::NAN)),
((0.0, -0.0), (5.0, -7.0), (-5.0, 7.0)),
((0.0, -0.0), (-1.0, -0.0), (1.0, 0.0)),
((2.0, 0.0), (f32::NAN, 0.0), (f32::NAN, 0.0)),
((2.0, 0.0), (f32::INFINITY, 1.0), (f32::NEG_INFINITY, -1.0)),
(
(2.0, 0.0),
(f32::NEG_INFINITY, f32::NEG_INFINITY),
(f32::INFINITY, f32::INFINITY),
),
((2.0, 0.0), (0.0, 0.0), (2.0, 0.0)),
((2.0, 0.0), (-0.0, 0.0), (2.0, 0.0)),
((2.0, 0.0), (0.0, -0.0), (2.0, 0.0)),
((2.0, 0.0), (1.0, 2.0), (1.0, -2.0)),
((2.0, 0.0), (-3.0, 0.5), (5.0, -0.5)),
((2.0, 0.0), (0.0, -0.0), (2.0, 0.0)),
((2.0, 0.0), (2.0, 0.0), (0.0, 0.0)),
((2.0, 0.0), (0.0, 1.0), (2.0, -1.0)),
(
(2.0, 0.0),
(f32::INFINITY, f32::NAN),
(f32::NEG_INFINITY, f32::NAN),
),
((2.0, 0.0), (f32::NAN, f32::NAN), (f32::NAN, f32::NAN)),
((2.0, 0.0), (5.0, -7.0), (-3.0, 7.0)),
((2.0, 0.0), (-1.0, -0.0), (3.0, 0.0)),
((0.0, 1.0), (f32::NAN, 0.0), (f32::NAN, 1.0)),
((0.0, 1.0), (f32::INFINITY, 1.0), (f32::NEG_INFINITY, 0.0)),
(
(0.0, 1.0),
(f32::NEG_INFINITY, f32::NEG_INFINITY),
(f32::INFINITY, f32::INFINITY),
),
((0.0, 1.0), (0.0, 0.0), (0.0, 1.0)),
((0.0, 1.0), (-0.0, 0.0), (0.0, 1.0)),
((0.0, 1.0), (0.0, -0.0), (0.0, 1.0)),
((0.0, 1.0), (1.0, 2.0), (-1.0, -1.0)),
((0.0, 1.0), (-3.0, 0.5), (3.0, 0.5)),
((0.0, 1.0), (0.0, -0.0), (0.0, 1.0)),
((0.0, 1.0), (2.0, 0.0), (-2.0, 1.0)),
((0.0, 1.0), (0.0, 1.0), (0.0, 0.0)),
(
(0.0, 1.0),
(f32::INFINITY, f32::NAN),
(f32::NEG_INFINITY, f32::NAN),
),
((0.0, 1.0), (f32::NAN, f32::NAN), (f32::NAN, f32::NAN)),
((0.0, 1.0), (5.0, -7.0), (-5.0, 8.0)),
((0.0, 1.0), (-1.0, -0.0), (1.0, 1.0)),
(
(f32::INFINITY, f32::NAN),
(f32::NAN, 0.0),
(f32::NAN, f32::NAN),
),
(
(f32::INFINITY, f32::NAN),
(f32::INFINITY, 1.0),
(f32::NAN, f32::NAN),
),
(
(f32::INFINITY, f32::NAN),
(f32::NEG_INFINITY, f32::NEG_INFINITY),
(f32::INFINITY, f32::NAN),
),
(
(f32::INFINITY, f32::NAN),
(0.0, 0.0),
(f32::INFINITY, f32::NAN),
),
(
(f32::INFINITY, f32::NAN),
(-0.0, 0.0),
(f32::INFINITY, f32::NAN),
),
(
(f32::INFINITY, f32::NAN),
(0.0, -0.0),
(f32::INFINITY, f32::NAN),
),
(
(f32::INFINITY, f32::NAN),
(1.0, 2.0),
(f32::INFINITY, f32::NAN),
),
(
(f32::INFINITY, f32::NAN),
(-3.0, 0.5),
(f32::INFINITY, f32::NAN),
),
(
(f32::INFINITY, f32::NAN),
(0.0, -0.0),
(f32::INFINITY, f32::NAN),
),
(
(f32::INFINITY, f32::NAN),
(2.0, 0.0),
(f32::INFINITY, f32::NAN),
),
(
(f32::INFINITY, f32::NAN),
(0.0, 1.0),
(f32::INFINITY, f32::NAN),
),
(
(f32::INFINITY, f32::NAN),
(f32::INFINITY, f32::NAN),
(f32::NAN, f32::NAN),
),
(
(f32::INFINITY, f32::NAN),
(f32::NAN, f32::NAN),
(f32::NAN, f32::NAN),
),
(
(f32::INFINITY, f32::NAN),
(5.0, -7.0),
(f32::INFINITY, f32::NAN),
),
(
(f32::INFINITY, f32::NAN),
(-1.0, -0.0),
(f32::INFINITY, f32::NAN),
),
((f32::NAN, f32::NAN), (f32::NAN, 0.0), (f32::NAN, f32::NAN)),
(
(f32::NAN, f32::NAN),
(f32::INFINITY, 1.0),
(f32::NAN, f32::NAN),
),
(
(f32::NAN, f32::NAN),
(f32::NEG_INFINITY, f32::NEG_INFINITY),
(f32::NAN, f32::NAN),
),
((f32::NAN, f32::NAN), (0.0, 0.0), (f32::NAN, f32::NAN)),
((f32::NAN, f32::NAN), (-0.0, 0.0), (f32::NAN, f32::NAN)),
((f32::NAN, f32::NAN), (0.0, -0.0), (f32::NAN, f32::NAN)),
((f32::NAN, f32::NAN), (1.0, 2.0), (f32::NAN, f32::NAN)),
((f32::NAN, f32::NAN), (-3.0, 0.5), (f32::NAN, f32::NAN)),
((f32::NAN, f32::NAN), (0.0, -0.0), (f32::NAN, f32::NAN)),
((f32::NAN, f32::NAN), (2.0, 0.0), (f32::NAN, f32::NAN)),
((f32::NAN, f32::NAN), (0.0, 1.0), (f32::NAN, f32::NAN)),
(
(f32::NAN, f32::NAN),
(f32::INFINITY, f32::NAN),
(f32::NAN, f32::NAN),
),
(
(f32::NAN, f32::NAN),
(f32::NAN, f32::NAN),
(f32::NAN, f32::NAN),
),
((f32::NAN, f32::NAN), (5.0, -7.0), (f32::NAN, f32::NAN)),
((f32::NAN, f32::NAN), (-1.0, -0.0), (f32::NAN, f32::NAN)),
((5.0, -7.0), (f32::NAN, 0.0), (f32::NAN, -7.0)),
((5.0, -7.0), (f32::INFINITY, 1.0), (f32::NEG_INFINITY, -8.0)),
(
(5.0, -7.0),
(f32::NEG_INFINITY, f32::NEG_INFINITY),
(f32::INFINITY, f32::INFINITY),
),
((5.0, -7.0), (0.0, 0.0), (5.0, -7.0)),
((5.0, -7.0), (-0.0, 0.0), (5.0, -7.0)),
((5.0, -7.0), (0.0, -0.0), (5.0, -7.0)),
((5.0, -7.0), (1.0, 2.0), (4.0, -9.0)),
((5.0, -7.0), (-3.0, 0.5), (8.0, -7.5)),
((5.0, -7.0), (0.0, -0.0), (5.0, -7.0)),
((5.0, -7.0), (2.0, 0.0), (3.0, -7.0)),
((5.0, -7.0), (0.0, 1.0), (5.0, -8.0)),
(
(5.0, -7.0),
(f32::INFINITY, f32::NAN),
(f32::NEG_INFINITY, f32::NAN),
),
((5.0, -7.0), (f32::NAN, f32::NAN), (f32::NAN, f32::NAN)),
((5.0, -7.0), (5.0, -7.0), (0.0, 0.0)),
((5.0, -7.0), (-1.0, -0.0), (6.0, -7.0)),
((-1.0, -0.0), (f32::NAN, 0.0), (f32::NAN, -0.0)),
(
(-1.0, -0.0),
(f32::INFINITY, 1.0),
(f32::NEG_INFINITY, -1.0),
),
(
(-1.0, -0.0),
(f32::NEG_INFINITY, f32::NEG_INFINITY),
(f32::INFINITY, f32::INFINITY),
),
((-1.0, -0.0), (0.0, 0.0), (-1.0, -0.0)),
((-1.0, -0.0), (-0.0, 0.0), (-1.0, -0.0)),
((-1.0, -0.0), (0.0, -0.0), (-1.0, 0.0)),
((-1.0, -0.0), (1.0, 2.0), (-2.0, -2.0)),
((-1.0, -0.0), (-3.0, 0.5), (2.0, -0.5)),
((-1.0, -0.0), (0.0, -0.0), (-1.0, 0.0)),
((-1.0, -0.0), (2.0, 0.0), (-3.0, -0.0)),
((-1.0, -0.0), (0.0, 1.0), (-1.0, -1.0)),
(
(-1.0, -0.0),
(f32::INFINITY, f32::NAN),
(f32::NEG_INFINITY, f32::NAN),
),
((-1.0, -0.0), (f32::NAN, f32::NAN), (f32::NAN, f32::NAN)),
((-1.0, -0.0), (5.0, -7.0), (-6.0, 7.0)),
((-1.0, -0.0), (-1.0, -0.0), (0.0, 0.0)),
];
for &((ar, ai), (br, bi), want) in CASES {
let (a, b) = (Complex::new(ar, ai), Complex::new(br, bi));
check_c("sub", &format!("{a:?}, {b:?}"), a - b, want, 1e-5, false);
let mut t = a;
t -= b;
check_c("sub_assign", &format!("{a:?}, {b:?}"), t, want, 1e-5, false);
}
}
#[test]
fn complex_mul_f32() {
let _report = Report;
const CASES: &[((f32, f32), (f32, f32), (f32, f32))] = &[
((f32::NAN, 0.0), (f32::NAN, 0.0), (f32::NAN, f32::NAN)),
((f32::NAN, 0.0), (f32::INFINITY, 1.0), (f32::NAN, f32::NAN)),
(
(f32::NAN, 0.0),
(f32::NEG_INFINITY, f32::NEG_INFINITY),
(f32::NAN, f32::NAN),
),
((f32::NAN, 0.0), (0.0, 0.0), (f32::NAN, f32::NAN)),
((f32::NAN, 0.0), (-0.0, 0.0), (f32::NAN, f32::NAN)),
((f32::NAN, 0.0), (0.0, -0.0), (f32::NAN, f32::NAN)),
((f32::NAN, 0.0), (1.0, 2.0), (f32::NAN, f32::NAN)),
((f32::NAN, 0.0), (-3.0, 0.5), (f32::NAN, f32::NAN)),
((f32::NAN, 0.0), (0.0, -0.0), (f32::NAN, f32::NAN)),
((f32::NAN, 0.0), (2.0, 0.0), (f32::NAN, f32::NAN)),
((f32::NAN, 0.0), (0.0, 1.0), (f32::NAN, f32::NAN)),
(
(f32::NAN, 0.0),
(f32::INFINITY, f32::NAN),
(f32::NAN, f32::NAN),
),
((f32::NAN, 0.0), (f32::NAN, f32::NAN), (f32::NAN, f32::NAN)),
((f32::NAN, 0.0), (5.0, -7.0), (f32::NAN, f32::NAN)),
((f32::NAN, 0.0), (-1.0, -0.0), (f32::NAN, f32::NAN)),
((f32::INFINITY, 1.0), (f32::NAN, 0.0), (f32::NAN, f32::NAN)),
(
(f32::INFINITY, 1.0),
(f32::INFINITY, 1.0),
(f32::INFINITY, f32::INFINITY),
),
(
(f32::INFINITY, 1.0),
(f32::NEG_INFINITY, f32::NEG_INFINITY),
(f32::NAN, f32::NEG_INFINITY),
),
((f32::INFINITY, 1.0), (0.0, 0.0), (f32::NAN, f32::NAN)),
((f32::INFINITY, 1.0), (-0.0, 0.0), (f32::NAN, f32::NAN)),
((f32::INFINITY, 1.0), (0.0, -0.0), (f32::NAN, f32::NAN)),
(
(f32::INFINITY, 1.0),
(1.0, 2.0),
(f32::INFINITY, f32::INFINITY),
),
(
(f32::INFINITY, 1.0),
(-3.0, 0.5),
(f32::NEG_INFINITY, f32::INFINITY),
),
((f32::INFINITY, 1.0), (0.0, -0.0), (f32::NAN, f32::NAN)),
((f32::INFINITY, 1.0), (2.0, 0.0), (f32::INFINITY, f32::NAN)),
((f32::INFINITY, 1.0), (0.0, 1.0), (f32::NAN, f32::INFINITY)),
(
(f32::INFINITY, 1.0),
(f32::INFINITY, f32::NAN),
(f32::NAN, f32::NAN),
),
(
(f32::INFINITY, 1.0),
(f32::NAN, f32::NAN),
(f32::NAN, f32::NAN),
),
(
(f32::INFINITY, 1.0),
(5.0, -7.0),
(f32::INFINITY, f32::NEG_INFINITY),
),
(
(f32::INFINITY, 1.0),
(-1.0, -0.0),
(f32::NEG_INFINITY, f32::NAN),
),
(
(f32::NEG_INFINITY, f32::NEG_INFINITY),
(f32::NAN, 0.0),
(f32::NAN, f32::NAN),
),
(
(f32::NEG_INFINITY, f32::NEG_INFINITY),
(f32::INFINITY, 1.0),
(f32::NAN, f32::NEG_INFINITY),
),
(
(f32::NEG_INFINITY, f32::NEG_INFINITY),
(f32::NEG_INFINITY, f32::NEG_INFINITY),
(f32::NAN, f32::INFINITY),
),
(
(f32::NEG_INFINITY, f32::NEG_INFINITY),
(0.0, 0.0),
(f32::NAN, f32::NAN),
),
(
(f32::NEG_INFINITY, f32::NEG_INFINITY),
(-0.0, 0.0),
(f32::NAN, f32::NAN),
),
(
(f32::NEG_INFINITY, f32::NEG_INFINITY),
(0.0, -0.0),
(f32::NAN, f32::NAN),
),
(
(f32::NEG_INFINITY, f32::NEG_INFINITY),
(1.0, 2.0),
(f32::NAN, f32::NEG_INFINITY),
),
(
(f32::NEG_INFINITY, f32::NEG_INFINITY),
(-3.0, 0.5),
(f32::INFINITY, f32::NAN),
),
(
(f32::NEG_INFINITY, f32::NEG_INFINITY),
(0.0, -0.0),
(f32::NAN, f32::NAN),
),
(
(f32::NEG_INFINITY, f32::NEG_INFINITY),
(2.0, 0.0),
(f32::NAN, f32::NAN),
),
(
(f32::NEG_INFINITY, f32::NEG_INFINITY),
(0.0, 1.0),
(f32::NAN, f32::NAN),
),
(
(f32::NEG_INFINITY, f32::NEG_INFINITY),
(f32::INFINITY, f32::NAN),
(f32::NAN, f32::NAN),
),
(
(f32::NEG_INFINITY, f32::NEG_INFINITY),
(f32::NAN, f32::NAN),
(f32::NAN, f32::NAN),
),
(
(f32::NEG_INFINITY, f32::NEG_INFINITY),
(5.0, -7.0),
(f32::NEG_INFINITY, f32::NAN),
),
(
(f32::NEG_INFINITY, f32::NEG_INFINITY),
(-1.0, -0.0),
(f32::NAN, f32::NAN),
),
((0.0, 0.0), (f32::NAN, 0.0), (f32::NAN, f32::NAN)),
((0.0, 0.0), (f32::INFINITY, 1.0), (f32::NAN, f32::NAN)),
(
(0.0, 0.0),
(f32::NEG_INFINITY, f32::NEG_INFINITY),
(f32::NAN, f32::NAN),
),
((0.0, 0.0), (0.0, 0.0), (0.0, 0.0)),
((0.0, 0.0), (-0.0, 0.0), (-0.0, 0.0)),
((0.0, 0.0), (0.0, -0.0), (0.0, 0.0)),
((0.0, 0.0), (1.0, 2.0), (0.0, 0.0)),
((0.0, 0.0), (-3.0, 0.5), (-0.0, 0.0)),
((0.0, 0.0), (0.0, -0.0), (0.0, 0.0)),
((0.0, 0.0), (2.0, 0.0), (0.0, 0.0)),
((0.0, 0.0), (0.0, 1.0), (0.0, 0.0)),
((0.0, 0.0), (f32::INFINITY, f32::NAN), (f32::NAN, f32::NAN)),
((0.0, 0.0), (f32::NAN, f32::NAN), (f32::NAN, f32::NAN)),
((0.0, 0.0), (5.0, -7.0), (0.0, 0.0)),
((0.0, 0.0), (-1.0, -0.0), (0.0, -0.0)),
((-0.0, 0.0), (f32::NAN, 0.0), (f32::NAN, f32::NAN)),
((-0.0, 0.0), (f32::INFINITY, 1.0), (f32::NAN, f32::NAN)),
(
(-0.0, 0.0),
(f32::NEG_INFINITY, f32::NEG_INFINITY),
(f32::NAN, f32::NAN),
),
((-0.0, 0.0), (0.0, 0.0), (-0.0, 0.0)),
((-0.0, 0.0), (-0.0, 0.0), (0.0, -0.0)),
((-0.0, 0.0), (0.0, -0.0), (0.0, 0.0)),
((-0.0, 0.0), (1.0, 2.0), (-0.0, 0.0)),
((-0.0, 0.0), (-3.0, 0.5), (0.0, -0.0)),
((-0.0, 0.0), (0.0, -0.0), (0.0, 0.0)),
((-0.0, 0.0), (2.0, 0.0), (-0.0, 0.0)),
((-0.0, 0.0), (0.0, 1.0), (-0.0, 0.0)),
((-0.0, 0.0), (f32::INFINITY, f32::NAN), (f32::NAN, f32::NAN)),
((-0.0, 0.0), (f32::NAN, f32::NAN), (f32::NAN, f32::NAN)),
((-0.0, 0.0), (5.0, -7.0), (0.0, 0.0)),
((-0.0, 0.0), (-1.0, -0.0), (0.0, 0.0)),
((0.0, -0.0), (f32::NAN, 0.0), (f32::NAN, f32::NAN)),
((0.0, -0.0), (f32::INFINITY, 1.0), (f32::NAN, f32::NAN)),
(
(0.0, -0.0),
(f32::NEG_INFINITY, f32::NEG_INFINITY),
(f32::NAN, f32::NAN),
),
((0.0, -0.0), (0.0, 0.0), (0.0, 0.0)),
((0.0, -0.0), (-0.0, 0.0), (0.0, 0.0)),
((0.0, -0.0), (0.0, -0.0), (0.0, -0.0)),
((0.0, -0.0), (1.0, 2.0), (0.0, 0.0)),
((0.0, -0.0), (-3.0, 0.5), (0.0, 0.0)),
((0.0, -0.0), (0.0, -0.0), (0.0, -0.0)),
((0.0, -0.0), (2.0, 0.0), (0.0, 0.0)),
((0.0, -0.0), (0.0, 1.0), (0.0, 0.0)),
((0.0, -0.0), (f32::INFINITY, f32::NAN), (f32::NAN, f32::NAN)),
((0.0, -0.0), (f32::NAN, f32::NAN), (f32::NAN, f32::NAN)),
((0.0, -0.0), (5.0, -7.0), (0.0, -0.0)),
((0.0, -0.0), (-1.0, -0.0), (-0.0, 0.0)),
((1.0, 2.0), (f32::NAN, 0.0), (f32::NAN, f32::NAN)),
(
(1.0, 2.0),
(f32::INFINITY, 1.0),
(f32::INFINITY, f32::INFINITY),
),
(
(1.0, 2.0),
(f32::NEG_INFINITY, f32::NEG_INFINITY),
(f32::NAN, f32::NEG_INFINITY),
),
((1.0, 2.0), (0.0, 0.0), (0.0, 0.0)),
((1.0, 2.0), (-0.0, 0.0), (-0.0, 0.0)),
((1.0, 2.0), (0.0, -0.0), (0.0, 0.0)),
((1.0, 2.0), (1.0, 2.0), (-3.0, 4.0)),
((1.0, 2.0), (-3.0, 0.5), (-4.0, -5.5)),
((1.0, 2.0), (0.0, -0.0), (0.0, 0.0)),
((1.0, 2.0), (2.0, 0.0), (2.0, 4.0)),
((1.0, 2.0), (0.0, 1.0), (-2.0, 1.0)),
((1.0, 2.0), (f32::INFINITY, f32::NAN), (f32::NAN, f32::NAN)),
((1.0, 2.0), (f32::NAN, f32::NAN), (f32::NAN, f32::NAN)),
((1.0, 2.0), (5.0, -7.0), (19.0, 3.0)),
((1.0, 2.0), (-1.0, -0.0), (-1.0, -2.0)),
((-3.0, 0.5), (f32::NAN, 0.0), (f32::NAN, f32::NAN)),
(
(-3.0, 0.5),
(f32::INFINITY, 1.0),
(f32::NEG_INFINITY, f32::INFINITY),
),
(
(-3.0, 0.5),
(f32::NEG_INFINITY, f32::NEG_INFINITY),
(f32::INFINITY, f32::NAN),
),
((-3.0, 0.5), (0.0, 0.0), (-0.0, 0.0)),
((-3.0, 0.5), (-0.0, 0.0), (0.0, -0.0)),
((-3.0, 0.5), (0.0, -0.0), (0.0, 0.0)),
((-3.0, 0.5), (1.0, 2.0), (-4.0, -5.5)),
((-3.0, 0.5), (-3.0, 0.5), (8.75, -3.0)),
((-3.0, 0.5), (0.0, -0.0), (0.0, 0.0)),
((-3.0, 0.5), (2.0, 0.0), (-6.0, 1.0)),
((-3.0, 0.5), (0.0, 1.0), (-0.5, -3.0)),
((-3.0, 0.5), (f32::INFINITY, f32::NAN), (f32::NAN, f32::NAN)),
((-3.0, 0.5), (f32::NAN, f32::NAN), (f32::NAN, f32::NAN)),
((-3.0, 0.5), (5.0, -7.0), (-11.5, 23.5)),
((-3.0, 0.5), (-1.0, -0.0), (3.0, -0.5)),
((0.0, -0.0), (f32::NAN, 0.0), (f32::NAN, f32::NAN)),
((0.0, -0.0), (f32::INFINITY, 1.0), (f32::NAN, f32::NAN)),
(
(0.0, -0.0),
(f32::NEG_INFINITY, f32::NEG_INFINITY),
(f32::NAN, f32::NAN),
),
((0.0, -0.0), (0.0, 0.0), (0.0, 0.0)),
((0.0, -0.0), (-0.0, 0.0), (0.0, 0.0)),
((0.0, -0.0), (0.0, -0.0), (0.0, -0.0)),
((0.0, -0.0), (1.0, 2.0), (0.0, 0.0)),
((0.0, -0.0), (-3.0, 0.5), (0.0, 0.0)),
((0.0, -0.0), (0.0, -0.0), (0.0, -0.0)),
((0.0, -0.0), (2.0, 0.0), (0.0, 0.0)),
((0.0, -0.0), (0.0, 1.0), (0.0, 0.0)),
((0.0, -0.0), (f32::INFINITY, f32::NAN), (f32::NAN, f32::NAN)),
((0.0, -0.0), (f32::NAN, f32::NAN), (f32::NAN, f32::NAN)),
((0.0, -0.0), (5.0, -7.0), (0.0, -0.0)),
((0.0, -0.0), (-1.0, -0.0), (-0.0, 0.0)),
((2.0, 0.0), (f32::NAN, 0.0), (f32::NAN, f32::NAN)),
((2.0, 0.0), (f32::INFINITY, 1.0), (f32::INFINITY, f32::NAN)),
(
(2.0, 0.0),
(f32::NEG_INFINITY, f32::NEG_INFINITY),
(f32::NAN, f32::NAN),
),
((2.0, 0.0), (0.0, 0.0), (0.0, 0.0)),
((2.0, 0.0), (-0.0, 0.0), (-0.0, 0.0)),
((2.0, 0.0), (0.0, -0.0), (0.0, 0.0)),
((2.0, 0.0), (1.0, 2.0), (2.0, 4.0)),
((2.0, 0.0), (-3.0, 0.5), (-6.0, 1.0)),
((2.0, 0.0), (0.0, -0.0), (0.0, 0.0)),
((2.0, 0.0), (2.0, 0.0), (4.0, 0.0)),
((2.0, 0.0), (0.0, 1.0), (0.0, 2.0)),
((2.0, 0.0), (f32::INFINITY, f32::NAN), (f32::NAN, f32::NAN)),
((2.0, 0.0), (f32::NAN, f32::NAN), (f32::NAN, f32::NAN)),
((2.0, 0.0), (5.0, -7.0), (10.0, -14.0)),
((2.0, 0.0), (-1.0, -0.0), (-2.0, -0.0)),
((0.0, 1.0), (f32::NAN, 0.0), (f32::NAN, f32::NAN)),
((0.0, 1.0), (f32::INFINITY, 1.0), (f32::NAN, f32::INFINITY)),
(
(0.0, 1.0),
(f32::NEG_INFINITY, f32::NEG_INFINITY),
(f32::NAN, f32::NAN),
),
((0.0, 1.0), (0.0, 0.0), (0.0, 0.0)),
((0.0, 1.0), (-0.0, 0.0), (-0.0, 0.0)),
((0.0, 1.0), (0.0, -0.0), (0.0, 0.0)),
((0.0, 1.0), (1.0, 2.0), (-2.0, 1.0)),
((0.0, 1.0), (-3.0, 0.5), (-0.5, -3.0)),
((0.0, 1.0), (0.0, -0.0), (0.0, 0.0)),
((0.0, 1.0), (2.0, 0.0), (0.0, 2.0)),
((0.0, 1.0), (0.0, 1.0), (-1.0, 0.0)),
((0.0, 1.0), (f32::INFINITY, f32::NAN), (f32::NAN, f32::NAN)),
((0.0, 1.0), (f32::NAN, f32::NAN), (f32::NAN, f32::NAN)),
((0.0, 1.0), (5.0, -7.0), (7.0, 5.0)),
((0.0, 1.0), (-1.0, -0.0), (0.0, -1.0)),
(
(f32::INFINITY, f32::NAN),
(f32::NAN, 0.0),
(f32::NAN, f32::NAN),
),
(
(f32::INFINITY, f32::NAN),
(f32::INFINITY, 1.0),
(f32::NAN, f32::NAN),
),
(
(f32::INFINITY, f32::NAN),
(f32::NEG_INFINITY, f32::NEG_INFINITY),
(f32::NAN, f32::NAN),
),
((f32::INFINITY, f32::NAN), (0.0, 0.0), (f32::NAN, f32::NAN)),
((f32::INFINITY, f32::NAN), (-0.0, 0.0), (f32::NAN, f32::NAN)),
((f32::INFINITY, f32::NAN), (0.0, -0.0), (f32::NAN, f32::NAN)),
((f32::INFINITY, f32::NAN), (1.0, 2.0), (f32::NAN, f32::NAN)),
((f32::INFINITY, f32::NAN), (-3.0, 0.5), (f32::NAN, f32::NAN)),
((f32::INFINITY, f32::NAN), (0.0, -0.0), (f32::NAN, f32::NAN)),
((f32::INFINITY, f32::NAN), (2.0, 0.0), (f32::NAN, f32::NAN)),
((f32::INFINITY, f32::NAN), (0.0, 1.0), (f32::NAN, f32::NAN)),
(
(f32::INFINITY, f32::NAN),
(f32::INFINITY, f32::NAN),
(f32::NAN, f32::NAN),
),
(
(f32::INFINITY, f32::NAN),
(f32::NAN, f32::NAN),
(f32::NAN, f32::NAN),
),
((f32::INFINITY, f32::NAN), (5.0, -7.0), (f32::NAN, f32::NAN)),
(
(f32::INFINITY, f32::NAN),
(-1.0, -0.0),
(f32::NAN, f32::NAN),
),
((f32::NAN, f32::NAN), (f32::NAN, 0.0), (f32::NAN, f32::NAN)),
(
(f32::NAN, f32::NAN),
(f32::INFINITY, 1.0),
(f32::NAN, f32::NAN),
),
(
(f32::NAN, f32::NAN),
(f32::NEG_INFINITY, f32::NEG_INFINITY),
(f32::NAN, f32::NAN),
),
((f32::NAN, f32::NAN), (0.0, 0.0), (f32::NAN, f32::NAN)),
((f32::NAN, f32::NAN), (-0.0, 0.0), (f32::NAN, f32::NAN)),
((f32::NAN, f32::NAN), (0.0, -0.0), (f32::NAN, f32::NAN)),
((f32::NAN, f32::NAN), (1.0, 2.0), (f32::NAN, f32::NAN)),
((f32::NAN, f32::NAN), (-3.0, 0.5), (f32::NAN, f32::NAN)),
((f32::NAN, f32::NAN), (0.0, -0.0), (f32::NAN, f32::NAN)),
((f32::NAN, f32::NAN), (2.0, 0.0), (f32::NAN, f32::NAN)),
((f32::NAN, f32::NAN), (0.0, 1.0), (f32::NAN, f32::NAN)),
(
(f32::NAN, f32::NAN),
(f32::INFINITY, f32::NAN),
(f32::NAN, f32::NAN),
),
(
(f32::NAN, f32::NAN),
(f32::NAN, f32::NAN),
(f32::NAN, f32::NAN),
),
((f32::NAN, f32::NAN), (5.0, -7.0), (f32::NAN, f32::NAN)),
((f32::NAN, f32::NAN), (-1.0, -0.0), (f32::NAN, f32::NAN)),
((5.0, -7.0), (f32::NAN, 0.0), (f32::NAN, f32::NAN)),
(
(5.0, -7.0),
(f32::INFINITY, 1.0),
(f32::INFINITY, f32::NEG_INFINITY),
),
(
(5.0, -7.0),
(f32::NEG_INFINITY, f32::NEG_INFINITY),
(f32::NEG_INFINITY, f32::NAN),
),
((5.0, -7.0), (0.0, 0.0), (0.0, 0.0)),
((5.0, -7.0), (-0.0, 0.0), (0.0, 0.0)),
((5.0, -7.0), (0.0, -0.0), (0.0, -0.0)),
((5.0, -7.0), (1.0, 2.0), (19.0, 3.0)),
((5.0, -7.0), (-3.0, 0.5), (-11.5, 23.5)),
((5.0, -7.0), (0.0, -0.0), (0.0, -0.0)),
((5.0, -7.0), (2.0, 0.0), (10.0, -14.0)),
((5.0, -7.0), (0.0, 1.0), (7.0, 5.0)),
((5.0, -7.0), (f32::INFINITY, f32::NAN), (f32::NAN, f32::NAN)),
((5.0, -7.0), (f32::NAN, f32::NAN), (f32::NAN, f32::NAN)),
((5.0, -7.0), (5.0, -7.0), (-24.0, -70.0)),
((5.0, -7.0), (-1.0, -0.0), (-5.0, 7.0)),
((-1.0, -0.0), (f32::NAN, 0.0), (f32::NAN, f32::NAN)),
(
(-1.0, -0.0),
(f32::INFINITY, 1.0),
(f32::NEG_INFINITY, f32::NAN),
),
(
(-1.0, -0.0),
(f32::NEG_INFINITY, f32::NEG_INFINITY),
(f32::NAN, f32::NAN),
),
((-1.0, -0.0), (0.0, 0.0), (0.0, -0.0)),
((-1.0, -0.0), (-0.0, 0.0), (0.0, 0.0)),
((-1.0, -0.0), (0.0, -0.0), (-0.0, 0.0)),
((-1.0, -0.0), (1.0, 2.0), (-1.0, -2.0)),
((-1.0, -0.0), (-3.0, 0.5), (3.0, -0.5)),
((-1.0, -0.0), (0.0, -0.0), (-0.0, 0.0)),
((-1.0, -0.0), (2.0, 0.0), (-2.0, -0.0)),
((-1.0, -0.0), (0.0, 1.0), (0.0, -1.0)),
(
(-1.0, -0.0),
(f32::INFINITY, f32::NAN),
(f32::NAN, f32::NAN),
),
((-1.0, -0.0), (f32::NAN, f32::NAN), (f32::NAN, f32::NAN)),
((-1.0, -0.0), (5.0, -7.0), (-5.0, 7.0)),
((-1.0, -0.0), (-1.0, -0.0), (1.0, 0.0)),
];
for &((ar, ai), (br, bi), want) in CASES {
let (a, b) = (Complex::new(ar, ai), Complex::new(br, bi));
check_c("mul", &format!("{a:?}, {b:?}"), a * b, want, 1e-5, false);
let mut t = a;
t *= b;
check_c("mul_assign", &format!("{a:?}, {b:?}"), t, want, 1e-5, false);
}
}
#[test]
fn complex_div_f32() {
let _report = Report;
const CASES: &[((f32, f32), (f32, f32), (f32, f32))] = &[
((f32::NAN, 0.0), (f32::NAN, 0.0), (f32::NAN, f32::NAN)),
((f32::NAN, 0.0), (f32::INFINITY, 1.0), (f32::NAN, f32::NAN)),
(
(f32::NAN, 0.0),
(f32::NEG_INFINITY, f32::NEG_INFINITY),
(f32::NAN, f32::NAN),
),
((f32::NAN, 0.0), (0.0, 0.0), (f32::NAN, f32::NAN)),
((f32::NAN, 0.0), (-0.0, 0.0), (f32::NAN, f32::NAN)),
((f32::NAN, 0.0), (0.0, -0.0), (f32::NAN, f32::NAN)),
((f32::NAN, 0.0), (1.0, 2.0), (f32::NAN, f32::NAN)),
((f32::NAN, 0.0), (-3.0, 0.5), (f32::NAN, f32::NAN)),
((f32::NAN, 0.0), (0.0, -0.0), (f32::NAN, f32::NAN)),
((f32::NAN, 0.0), (2.0, 0.0), (f32::NAN, f32::NAN)),
((f32::NAN, 0.0), (0.0, 1.0), (f32::NAN, f32::NAN)),
(
(f32::NAN, 0.0),
(f32::INFINITY, f32::NAN),
(f32::NAN, f32::NAN),
),
((f32::NAN, 0.0), (f32::NAN, f32::NAN), (f32::NAN, f32::NAN)),
((f32::NAN, 0.0), (5.0, -7.0), (f32::NAN, f32::NAN)),
((f32::NAN, 0.0), (-1.0, -0.0), (f32::NAN, f32::NAN)),
((f32::INFINITY, 1.0), (f32::NAN, 0.0), (f32::NAN, f32::NAN)),
(
(f32::INFINITY, 1.0),
(f32::INFINITY, 1.0),
(f32::NAN, f32::NAN),
),
(
(f32::INFINITY, 1.0),
(f32::NEG_INFINITY, f32::NEG_INFINITY),
(f32::NAN, f32::NAN),
),
(
(f32::INFINITY, 1.0),
(0.0, 0.0),
(f32::INFINITY, f32::INFINITY),
),
(
(f32::INFINITY, 1.0),
(-0.0, 0.0),
(f32::INFINITY, f32::INFINITY),
),
(
(f32::INFINITY, 1.0),
(0.0, -0.0),
(f32::INFINITY, f32::INFINITY),
),
(
(f32::INFINITY, 1.0),
(1.0, 2.0),
(f32::INFINITY, f32::NEG_INFINITY),
),
(
(f32::INFINITY, 1.0),
(-3.0, 0.5),
(f32::NEG_INFINITY, f32::NEG_INFINITY),
),
(
(f32::INFINITY, 1.0),
(0.0, -0.0),
(f32::INFINITY, f32::INFINITY),
),
((f32::INFINITY, 1.0), (2.0, 0.0), (f32::INFINITY, f32::NAN)),
(
(f32::INFINITY, 1.0),
(0.0, 1.0),
(f32::NAN, f32::NEG_INFINITY),
),
(
(f32::INFINITY, 1.0),
(f32::INFINITY, f32::NAN),
(f32::NAN, f32::NAN),
),
(
(f32::INFINITY, 1.0),
(f32::NAN, f32::NAN),
(f32::NAN, f32::NAN),
),
(
(f32::INFINITY, 1.0),
(5.0, -7.0),
(f32::INFINITY, f32::INFINITY),
),
(
(f32::INFINITY, 1.0),
(-1.0, -0.0),
(f32::NEG_INFINITY, f32::NAN),
),
(
(f32::NEG_INFINITY, f32::NEG_INFINITY),
(f32::NAN, 0.0),
(f32::NAN, f32::NAN),
),
(
(f32::NEG_INFINITY, f32::NEG_INFINITY),
(f32::INFINITY, 1.0),
(f32::NAN, f32::NAN),
),
(
(f32::NEG_INFINITY, f32::NEG_INFINITY),
(f32::NEG_INFINITY, f32::NEG_INFINITY),
(f32::NAN, f32::NAN),
),
(
(f32::NEG_INFINITY, f32::NEG_INFINITY),
(0.0, 0.0),
(f32::NEG_INFINITY, f32::NEG_INFINITY),
),
(
(f32::NEG_INFINITY, f32::NEG_INFINITY),
(-0.0, 0.0),
(f32::NEG_INFINITY, f32::NEG_INFINITY),
),
(
(f32::NEG_INFINITY, f32::NEG_INFINITY),
(0.0, -0.0),
(f32::NEG_INFINITY, f32::NEG_INFINITY),
),
(
(f32::NEG_INFINITY, f32::NEG_INFINITY),
(1.0, 2.0),
(f32::NEG_INFINITY, f32::NAN),
),
(
(f32::NEG_INFINITY, f32::NEG_INFINITY),
(-3.0, 0.5),
(f32::NAN, f32::INFINITY),
),
(
(f32::NEG_INFINITY, f32::NEG_INFINITY),
(0.0, -0.0),
(f32::NEG_INFINITY, f32::NEG_INFINITY),
),
(
(f32::NEG_INFINITY, f32::NEG_INFINITY),
(2.0, 0.0),
(f32::NAN, f32::NAN),
),
(
(f32::NEG_INFINITY, f32::NEG_INFINITY),
(0.0, 1.0),
(f32::NAN, f32::NAN),
),
(
(f32::NEG_INFINITY, f32::NEG_INFINITY),
(f32::INFINITY, f32::NAN),
(f32::NAN, f32::NAN),
),
(
(f32::NEG_INFINITY, f32::NEG_INFINITY),
(f32::NAN, f32::NAN),
(f32::NAN, f32::NAN),
),
(
(f32::NEG_INFINITY, f32::NEG_INFINITY),
(5.0, -7.0),
(f32::NAN, f32::NEG_INFINITY),
),
(
(f32::NEG_INFINITY, f32::NEG_INFINITY),
(-1.0, -0.0),
(f32::NAN, f32::NAN),
),
((0.0, 0.0), (f32::NAN, 0.0), (f32::NAN, f32::NAN)),
((0.0, 0.0), (f32::INFINITY, 1.0), (0.0, 0.0)),
(
(0.0, 0.0),
(f32::NEG_INFINITY, f32::NEG_INFINITY),
(f32::NAN, f32::NAN),
),
((0.0, 0.0), (0.0, 0.0), (f32::NAN, f32::NAN)),
((0.0, 0.0), (-0.0, 0.0), (f32::NAN, f32::NAN)),
((0.0, 0.0), (0.0, -0.0), (f32::NAN, f32::NAN)),
((0.0, 0.0), (1.0, 2.0), (0.0, 0.0)),
((0.0, 0.0), (-3.0, 0.5), (-0.0, -0.0)),
((0.0, 0.0), (0.0, -0.0), (f32::NAN, f32::NAN)),
((0.0, 0.0), (2.0, 0.0), (0.0, 0.0)),
((0.0, 0.0), (0.0, 1.0), (0.0, 0.0)),
((0.0, 0.0), (f32::INFINITY, f32::NAN), (f32::NAN, f32::NAN)),
((0.0, 0.0), (f32::NAN, f32::NAN), (f32::NAN, f32::NAN)),
((0.0, 0.0), (5.0, -7.0), (-0.0, 0.0)),
((0.0, 0.0), (-1.0, -0.0), (-0.0, -0.0)),
((-0.0, 0.0), (f32::NAN, 0.0), (f32::NAN, f32::NAN)),
((-0.0, 0.0), (f32::INFINITY, 1.0), (0.0, 0.0)),
(
(-0.0, 0.0),
(f32::NEG_INFINITY, f32::NEG_INFINITY),
(f32::NAN, f32::NAN),
),
((-0.0, 0.0), (0.0, 0.0), (f32::NAN, f32::NAN)),
((-0.0, 0.0), (-0.0, 0.0), (f32::NAN, f32::NAN)),
((-0.0, 0.0), (0.0, -0.0), (f32::NAN, f32::NAN)),
((-0.0, 0.0), (1.0, 2.0), (0.0, 0.0)),
((-0.0, 0.0), (-3.0, 0.5), (0.0, -0.0)),
((-0.0, 0.0), (0.0, -0.0), (f32::NAN, f32::NAN)),
((-0.0, 0.0), (2.0, 0.0), (0.0, 0.0)),
((-0.0, 0.0), (0.0, 1.0), (0.0, 0.0)),
((-0.0, 0.0), (f32::INFINITY, f32::NAN), (f32::NAN, f32::NAN)),
((-0.0, 0.0), (f32::NAN, f32::NAN), (f32::NAN, f32::NAN)),
((-0.0, 0.0), (5.0, -7.0), (-0.0, -0.0)),
((-0.0, 0.0), (-1.0, -0.0), (-0.0, -0.0)),
((0.0, -0.0), (f32::NAN, 0.0), (f32::NAN, f32::NAN)),
((0.0, -0.0), (f32::INFINITY, 1.0), (0.0, -0.0)),
(
(0.0, -0.0),
(f32::NEG_INFINITY, f32::NEG_INFINITY),
(f32::NAN, f32::NAN),
),
((0.0, -0.0), (0.0, 0.0), (f32::NAN, f32::NAN)),
((0.0, -0.0), (-0.0, 0.0), (f32::NAN, f32::NAN)),
((0.0, -0.0), (0.0, -0.0), (f32::NAN, f32::NAN)),
((0.0, -0.0), (1.0, 2.0), (0.0, -0.0)),
((0.0, -0.0), (-3.0, 0.5), (-0.0, -0.0)),
((0.0, -0.0), (0.0, -0.0), (f32::NAN, f32::NAN)),
((0.0, -0.0), (2.0, 0.0), (0.0, -0.0)),
((0.0, -0.0), (0.0, 1.0), (0.0, -0.0)),
((0.0, -0.0), (f32::INFINITY, f32::NAN), (f32::NAN, f32::NAN)),
((0.0, -0.0), (f32::NAN, f32::NAN), (f32::NAN, f32::NAN)),
((0.0, -0.0), (5.0, -7.0), (0.0, -0.0)),
((0.0, -0.0), (-1.0, -0.0), (-0.0, 0.0)),
((1.0, 2.0), (f32::NAN, 0.0), (f32::NAN, f32::NAN)),
((1.0, 2.0), (f32::INFINITY, 1.0), (0.0, 0.0)),
(
(1.0, 2.0),
(f32::NEG_INFINITY, f32::NEG_INFINITY),
(f32::NAN, f32::NAN),
),
((1.0, 2.0), (0.0, 0.0), (f32::INFINITY, f32::INFINITY)),
((1.0, 2.0), (-0.0, 0.0), (f32::INFINITY, f32::INFINITY)),
((1.0, 2.0), (0.0, -0.0), (f32::INFINITY, f32::INFINITY)),
((1.0, 2.0), (1.0, 2.0), (1.0, 0.0)),
((1.0, 2.0), (-3.0, 0.5), (-0.2162162, -0.70270276)),
((1.0, 2.0), (0.0, -0.0), (f32::INFINITY, f32::INFINITY)),
((1.0, 2.0), (2.0, 0.0), (0.5, 1.0)),
((1.0, 2.0), (0.0, 1.0), (2.0, -1.0)),
((1.0, 2.0), (f32::INFINITY, f32::NAN), (f32::NAN, f32::NAN)),
((1.0, 2.0), (f32::NAN, f32::NAN), (f32::NAN, f32::NAN)),
((1.0, 2.0), (5.0, -7.0), (-0.12162162, 0.22972974)),
((1.0, 2.0), (-1.0, -0.0), (-1.0, -2.0)),
((-3.0, 0.5), (f32::NAN, 0.0), (f32::NAN, f32::NAN)),
((-3.0, 0.5), (f32::INFINITY, 1.0), (-0.0, 0.0)),
(
(-3.0, 0.5),
(f32::NEG_INFINITY, f32::NEG_INFINITY),
(f32::NAN, f32::NAN),
),
((-3.0, 0.5), (0.0, 0.0), (f32::NEG_INFINITY, f32::INFINITY)),
((-3.0, 0.5), (-0.0, 0.0), (f32::NEG_INFINITY, f32::INFINITY)),
((-3.0, 0.5), (0.0, -0.0), (f32::NEG_INFINITY, f32::INFINITY)),
((-3.0, 0.5), (1.0, 2.0), (-0.4, 1.3000001)),
((-3.0, 0.5), (-3.0, 0.5), (1.0, -0.0)),
((-3.0, 0.5), (0.0, -0.0), (f32::NEG_INFINITY, f32::INFINITY)),
((-3.0, 0.5), (2.0, 0.0), (-1.5, 0.25)),
((-3.0, 0.5), (0.0, 1.0), (0.5, 3.0)),
((-3.0, 0.5), (f32::INFINITY, f32::NAN), (f32::NAN, f32::NAN)),
((-3.0, 0.5), (f32::NAN, f32::NAN), (f32::NAN, f32::NAN)),
((-3.0, 0.5), (5.0, -7.0), (-0.25, -0.25)),
((-3.0, 0.5), (-1.0, -0.0), (3.0, -0.5)),
((0.0, -0.0), (f32::NAN, 0.0), (f32::NAN, f32::NAN)),
((0.0, -0.0), (f32::INFINITY, 1.0), (0.0, -0.0)),
(
(0.0, -0.0),
(f32::NEG_INFINITY, f32::NEG_INFINITY),
(f32::NAN, f32::NAN),
),
((0.0, -0.0), (0.0, 0.0), (f32::NAN, f32::NAN)),
((0.0, -0.0), (-0.0, 0.0), (f32::NAN, f32::NAN)),
((0.0, -0.0), (0.0, -0.0), (f32::NAN, f32::NAN)),
((0.0, -0.0), (1.0, 2.0), (0.0, -0.0)),
((0.0, -0.0), (-3.0, 0.5), (-0.0, -0.0)),
((0.0, -0.0), (0.0, -0.0), (f32::NAN, f32::NAN)),
((0.0, -0.0), (2.0, 0.0), (0.0, -0.0)),
((0.0, -0.0), (0.0, 1.0), (0.0, -0.0)),
((0.0, -0.0), (f32::INFINITY, f32::NAN), (f32::NAN, f32::NAN)),
((0.0, -0.0), (f32::NAN, f32::NAN), (f32::NAN, f32::NAN)),
((0.0, -0.0), (5.0, -7.0), (0.0, -0.0)),
((0.0, -0.0), (-1.0, -0.0), (-0.0, 0.0)),
((2.0, 0.0), (f32::NAN, 0.0), (f32::NAN, f32::NAN)),
((2.0, 0.0), (f32::INFINITY, 1.0), (0.0, 0.0)),
(
(2.0, 0.0),
(f32::NEG_INFINITY, f32::NEG_INFINITY),
(f32::NAN, f32::NAN),
),
((2.0, 0.0), (0.0, 0.0), (f32::INFINITY, f32::NAN)),
((2.0, 0.0), (-0.0, 0.0), (f32::INFINITY, f32::NAN)),
((2.0, 0.0), (0.0, -0.0), (f32::INFINITY, f32::NAN)),
((2.0, 0.0), (1.0, 2.0), (0.4, -0.8)),
((2.0, 0.0), (-3.0, 0.5), (-0.6486487, -0.10810812)),
((2.0, 0.0), (0.0, -0.0), (f32::INFINITY, f32::NAN)),
((2.0, 0.0), (2.0, 0.0), (1.0, 0.0)),
((2.0, 0.0), (0.0, 1.0), (0.0, -2.0)),
((2.0, 0.0), (f32::INFINITY, f32::NAN), (f32::NAN, f32::NAN)),
((2.0, 0.0), (f32::NAN, f32::NAN), (f32::NAN, f32::NAN)),
((2.0, 0.0), (5.0, -7.0), (0.13513514, 0.1891892)),
((2.0, 0.0), (-1.0, -0.0), (-2.0, -0.0)),
((0.0, 1.0), (f32::NAN, 0.0), (f32::NAN, f32::NAN)),
((0.0, 1.0), (f32::INFINITY, 1.0), (0.0, 0.0)),
(
(0.0, 1.0),
(f32::NEG_INFINITY, f32::NEG_INFINITY),
(f32::NAN, f32::NAN),
),
((0.0, 1.0), (0.0, 0.0), (f32::NAN, f32::INFINITY)),
((0.0, 1.0), (-0.0, 0.0), (f32::NAN, f32::INFINITY)),
((0.0, 1.0), (0.0, -0.0), (f32::NAN, f32::INFINITY)),
((0.0, 1.0), (1.0, 2.0), (0.4, 0.2)),
((0.0, 1.0), (-3.0, 0.5), (0.05405406, -0.32432434)),
((0.0, 1.0), (0.0, -0.0), (f32::NAN, f32::INFINITY)),
((0.0, 1.0), (2.0, 0.0), (0.0, 0.5)),
((0.0, 1.0), (0.0, 1.0), (1.0, 0.0)),
((0.0, 1.0), (f32::INFINITY, f32::NAN), (f32::NAN, f32::NAN)),
((0.0, 1.0), (f32::NAN, f32::NAN), (f32::NAN, f32::NAN)),
((0.0, 1.0), (5.0, -7.0), (-0.0945946, 0.06756757)),
((0.0, 1.0), (-1.0, -0.0), (-0.0, -1.0)),
(
(f32::INFINITY, f32::NAN),
(f32::NAN, 0.0),
(f32::NAN, f32::NAN),
),
(
(f32::INFINITY, f32::NAN),
(f32::INFINITY, 1.0),
(f32::NAN, f32::NAN),
),
(
(f32::INFINITY, f32::NAN),
(f32::NEG_INFINITY, f32::NEG_INFINITY),
(f32::NAN, f32::NAN),
),
(
(f32::INFINITY, f32::NAN),
(0.0, 0.0),
(f32::INFINITY, f32::NAN),
),
(
(f32::INFINITY, f32::NAN),
(-0.0, 0.0),
(f32::INFINITY, f32::NAN),
),
(
(f32::INFINITY, f32::NAN),
(0.0, -0.0),
(f32::INFINITY, f32::NAN),
),
((f32::INFINITY, f32::NAN), (1.0, 2.0), (f32::NAN, f32::NAN)),
((f32::INFINITY, f32::NAN), (-3.0, 0.5), (f32::NAN, f32::NAN)),
(
(f32::INFINITY, f32::NAN),
(0.0, -0.0),
(f32::INFINITY, f32::NAN),
),
((f32::INFINITY, f32::NAN), (2.0, 0.0), (f32::NAN, f32::NAN)),
((f32::INFINITY, f32::NAN), (0.0, 1.0), (f32::NAN, f32::NAN)),
(
(f32::INFINITY, f32::NAN),
(f32::INFINITY, f32::NAN),
(f32::NAN, f32::NAN),
),
(
(f32::INFINITY, f32::NAN),
(f32::NAN, f32::NAN),
(f32::NAN, f32::NAN),
),
((f32::INFINITY, f32::NAN), (5.0, -7.0), (f32::NAN, f32::NAN)),
(
(f32::INFINITY, f32::NAN),
(-1.0, -0.0),
(f32::NAN, f32::NAN),
),
((f32::NAN, f32::NAN), (f32::NAN, 0.0), (f32::NAN, f32::NAN)),
(
(f32::NAN, f32::NAN),
(f32::INFINITY, 1.0),
(f32::NAN, f32::NAN),
),
(
(f32::NAN, f32::NAN),
(f32::NEG_INFINITY, f32::NEG_INFINITY),
(f32::NAN, f32::NAN),
),
((f32::NAN, f32::NAN), (0.0, 0.0), (f32::NAN, f32::NAN)),
((f32::NAN, f32::NAN), (-0.0, 0.0), (f32::NAN, f32::NAN)),
((f32::NAN, f32::NAN), (0.0, -0.0), (f32::NAN, f32::NAN)),
((f32::NAN, f32::NAN), (1.0, 2.0), (f32::NAN, f32::NAN)),
((f32::NAN, f32::NAN), (-3.0, 0.5), (f32::NAN, f32::NAN)),
((f32::NAN, f32::NAN), (0.0, -0.0), (f32::NAN, f32::NAN)),
((f32::NAN, f32::NAN), (2.0, 0.0), (f32::NAN, f32::NAN)),
((f32::NAN, f32::NAN), (0.0, 1.0), (f32::NAN, f32::NAN)),
(
(f32::NAN, f32::NAN),
(f32::INFINITY, f32::NAN),
(f32::NAN, f32::NAN),
),
(
(f32::NAN, f32::NAN),
(f32::NAN, f32::NAN),
(f32::NAN, f32::NAN),
),
((f32::NAN, f32::NAN), (5.0, -7.0), (f32::NAN, f32::NAN)),
((f32::NAN, f32::NAN), (-1.0, -0.0), (f32::NAN, f32::NAN)),
((5.0, -7.0), (f32::NAN, 0.0), (f32::NAN, f32::NAN)),
((5.0, -7.0), (f32::INFINITY, 1.0), (0.0, -0.0)),
(
(5.0, -7.0),
(f32::NEG_INFINITY, f32::NEG_INFINITY),
(f32::NAN, f32::NAN),
),
((5.0, -7.0), (0.0, 0.0), (f32::INFINITY, f32::NEG_INFINITY)),
((5.0, -7.0), (-0.0, 0.0), (f32::INFINITY, f32::NEG_INFINITY)),
((5.0, -7.0), (0.0, -0.0), (f32::INFINITY, f32::NEG_INFINITY)),
((5.0, -7.0), (1.0, 2.0), (-1.8000001, -3.4)),
((5.0, -7.0), (-3.0, 0.5), (-2.0000002, 2.0)),
((5.0, -7.0), (0.0, -0.0), (f32::INFINITY, f32::NEG_INFINITY)),
((5.0, -7.0), (2.0, 0.0), (2.5, -3.5)),
((5.0, -7.0), (0.0, 1.0), (-7.0, -5.0)),
((5.0, -7.0), (f32::INFINITY, f32::NAN), (f32::NAN, f32::NAN)),
((5.0, -7.0), (f32::NAN, f32::NAN), (f32::NAN, f32::NAN)),
((5.0, -7.0), (5.0, -7.0), (1.0, -0.0)),
((5.0, -7.0), (-1.0, -0.0), (-5.0, 7.0)),
((-1.0, -0.0), (f32::NAN, 0.0), (f32::NAN, f32::NAN)),
((-1.0, -0.0), (f32::INFINITY, 1.0), (-0.0, 0.0)),
(
(-1.0, -0.0),
(f32::NEG_INFINITY, f32::NEG_INFINITY),
(f32::NAN, f32::NAN),
),
((-1.0, -0.0), (0.0, 0.0), (f32::NEG_INFINITY, f32::NAN)),
((-1.0, -0.0), (-0.0, 0.0), (f32::NEG_INFINITY, f32::NAN)),
((-1.0, -0.0), (0.0, -0.0), (f32::NEG_INFINITY, f32::NAN)),
((-1.0, -0.0), (1.0, 2.0), (-0.2, 0.4)),
((-1.0, -0.0), (-3.0, 0.5), (0.32432434, 0.05405406)),
((-1.0, -0.0), (0.0, -0.0), (f32::NEG_INFINITY, f32::NAN)),
((-1.0, -0.0), (2.0, 0.0), (-0.5, 0.0)),
((-1.0, -0.0), (0.0, 1.0), (-0.0, 1.0)),
(
(-1.0, -0.0),
(f32::INFINITY, f32::NAN),
(f32::NAN, f32::NAN),
),
((-1.0, -0.0), (f32::NAN, f32::NAN), (f32::NAN, f32::NAN)),
((-1.0, -0.0), (5.0, -7.0), (-0.06756757, -0.0945946)),
((-1.0, -0.0), (-1.0, -0.0), (1.0, -0.0)),
];
for &((ar, ai), (br, bi), want) in CASES {
let (a, b) = (Complex::new(ar, ai), Complex::new(br, bi));
check_c("div", &format!("{a:?}, {b:?}"), a / b, want, 1e-5, false);
let mut t = a;
t /= b;
check_c("div_assign", &format!("{a:?}, {b:?}"), t, want, 1e-5, false);
}
}
#[test]
fn complex_z_add_s() {
let _report = Report;
const CASES: &[((f64, f64), f64, (f64, f64))] = &[
((1.0, 2.0), 2.0, (3.0, 2.0)),
((1.0, 2.0), 0.0, (1.0, 2.0)),
((1.0, 2.0), -0.0, (1.0, 2.0)),
((1.0, 2.0), f64::INFINITY, (f64::INFINITY, 2.0)),
((1.0, 2.0), f64::NAN, (f64::NAN, 2.0)),
((1.0, 2.0), -1.5, (-0.5, 2.0)),
((f64::INFINITY, 1.0), 2.0, (f64::INFINITY, 1.0)),
((f64::INFINITY, 1.0), 0.0, (f64::INFINITY, 1.0)),
((f64::INFINITY, 1.0), -0.0, (f64::INFINITY, 1.0)),
((f64::INFINITY, 1.0), f64::INFINITY, (f64::INFINITY, 1.0)),
((f64::INFINITY, 1.0), f64::NAN, (f64::NAN, 1.0)),
((f64::INFINITY, 1.0), -1.5, (f64::INFINITY, 1.0)),
((0.0, -0.0), 2.0, (2.0, 0.0)),
((0.0, -0.0), 0.0, (0.0, 0.0)),
((0.0, -0.0), -0.0, (0.0, 0.0)),
((0.0, -0.0), f64::INFINITY, (f64::INFINITY, 0.0)),
((0.0, -0.0), f64::NAN, (f64::NAN, 0.0)),
((0.0, -0.0), -1.5, (-1.5, 0.0)),
((-0.0, 3.0), 2.0, (2.0, 3.0)),
((-0.0, 3.0), 0.0, (0.0, 3.0)),
((-0.0, 3.0), -0.0, (-0.0, 3.0)),
((-0.0, 3.0), f64::INFINITY, (f64::INFINITY, 3.0)),
((-0.0, 3.0), f64::NAN, (f64::NAN, 3.0)),
((-0.0, 3.0), -1.5, (-1.5, 3.0)),
((f64::NAN, 1.0), 2.0, (f64::NAN, 1.0)),
((f64::NAN, 1.0), 0.0, (f64::NAN, 1.0)),
((f64::NAN, 1.0), -0.0, (f64::NAN, 1.0)),
((f64::NAN, 1.0), f64::INFINITY, (f64::NAN, 1.0)),
((f64::NAN, 1.0), f64::NAN, (f64::NAN, 1.0)),
((f64::NAN, 1.0), -1.5, (f64::NAN, 1.0)),
((1e+300, -1e+300), 2.0, (1e+300, -1e+300)),
((1e+300, -1e+300), 0.0, (1e+300, -1e+300)),
((1e+300, -1e+300), -0.0, (1e+300, -1e+300)),
((1e+300, -1e+300), f64::INFINITY, (f64::INFINITY, -1e+300)),
((1e+300, -1e+300), f64::NAN, (f64::NAN, -1e+300)),
((1e+300, -1e+300), -1.5, (1e+300, -1e+300)),
((-2.0, -0.5), 2.0, (0.0, -0.5)),
((-2.0, -0.5), 0.0, (-2.0, -0.5)),
((-2.0, -0.5), -0.0, (-2.0, -0.5)),
((-2.0, -0.5), f64::INFINITY, (f64::INFINITY, -0.5)),
((-2.0, -0.5), f64::NAN, (f64::NAN, -0.5)),
((-2.0, -0.5), -1.5, (-3.5, -0.5)),
(
(f64::INFINITY, f64::INFINITY),
2.0,
(f64::INFINITY, f64::INFINITY),
),
(
(f64::INFINITY, f64::INFINITY),
0.0,
(f64::INFINITY, f64::INFINITY),
),
(
(f64::INFINITY, f64::INFINITY),
-0.0,
(f64::INFINITY, f64::INFINITY),
),
(
(f64::INFINITY, f64::INFINITY),
f64::INFINITY,
(f64::INFINITY, f64::INFINITY),
),
(
(f64::INFINITY, f64::INFINITY),
f64::NAN,
(f64::NAN, f64::INFINITY),
),
(
(f64::INFINITY, f64::INFINITY),
-1.5,
(f64::INFINITY, f64::INFINITY),
),
];
for &((re, im), s, want) in CASES {
let z = Complex::new(re, im);
check_c(
"z_add_s",
&format!("{z:?}, {s:?}"),
z + s,
want,
1e-13,
false,
);
}
}
#[test]
fn complex_z_sub_s() {
let _report = Report;
const CASES: &[((f64, f64), f64, (f64, f64))] = &[
((1.0, 2.0), 2.0, (-1.0, 2.0)),
((1.0, 2.0), 0.0, (1.0, 2.0)),
((1.0, 2.0), -0.0, (1.0, 2.0)),
((1.0, 2.0), f64::INFINITY, (f64::NEG_INFINITY, 2.0)),
((1.0, 2.0), f64::NAN, (f64::NAN, 2.0)),
((1.0, 2.0), -1.5, (2.5, 2.0)),
((f64::INFINITY, 1.0), 2.0, (f64::INFINITY, 1.0)),
((f64::INFINITY, 1.0), 0.0, (f64::INFINITY, 1.0)),
((f64::INFINITY, 1.0), -0.0, (f64::INFINITY, 1.0)),
((f64::INFINITY, 1.0), f64::INFINITY, (f64::NAN, 1.0)),
((f64::INFINITY, 1.0), f64::NAN, (f64::NAN, 1.0)),
((f64::INFINITY, 1.0), -1.5, (f64::INFINITY, 1.0)),
((0.0, -0.0), 2.0, (-2.0, -0.0)),
((0.0, -0.0), 0.0, (0.0, -0.0)),
((0.0, -0.0), -0.0, (0.0, -0.0)),
((0.0, -0.0), f64::INFINITY, (f64::NEG_INFINITY, -0.0)),
((0.0, -0.0), f64::NAN, (f64::NAN, -0.0)),
((0.0, -0.0), -1.5, (1.5, -0.0)),
((-0.0, 3.0), 2.0, (-2.0, 3.0)),
((-0.0, 3.0), 0.0, (-0.0, 3.0)),
((-0.0, 3.0), -0.0, (0.0, 3.0)),
((-0.0, 3.0), f64::INFINITY, (f64::NEG_INFINITY, 3.0)),
((-0.0, 3.0), f64::NAN, (f64::NAN, 3.0)),
((-0.0, 3.0), -1.5, (1.5, 3.0)),
((f64::NAN, 1.0), 2.0, (f64::NAN, 1.0)),
((f64::NAN, 1.0), 0.0, (f64::NAN, 1.0)),
((f64::NAN, 1.0), -0.0, (f64::NAN, 1.0)),
((f64::NAN, 1.0), f64::INFINITY, (f64::NAN, 1.0)),
((f64::NAN, 1.0), f64::NAN, (f64::NAN, 1.0)),
((f64::NAN, 1.0), -1.5, (f64::NAN, 1.0)),
((1e+300, -1e+300), 2.0, (1e+300, -1e+300)),
((1e+300, -1e+300), 0.0, (1e+300, -1e+300)),
((1e+300, -1e+300), -0.0, (1e+300, -1e+300)),
(
(1e+300, -1e+300),
f64::INFINITY,
(f64::NEG_INFINITY, -1e+300),
),
((1e+300, -1e+300), f64::NAN, (f64::NAN, -1e+300)),
((1e+300, -1e+300), -1.5, (1e+300, -1e+300)),
((-2.0, -0.5), 2.0, (-4.0, -0.5)),
((-2.0, -0.5), 0.0, (-2.0, -0.5)),
((-2.0, -0.5), -0.0, (-2.0, -0.5)),
((-2.0, -0.5), f64::INFINITY, (f64::NEG_INFINITY, -0.5)),
((-2.0, -0.5), f64::NAN, (f64::NAN, -0.5)),
((-2.0, -0.5), -1.5, (-0.5, -0.5)),
(
(f64::INFINITY, f64::INFINITY),
2.0,
(f64::INFINITY, f64::INFINITY),
),
(
(f64::INFINITY, f64::INFINITY),
0.0,
(f64::INFINITY, f64::INFINITY),
),
(
(f64::INFINITY, f64::INFINITY),
-0.0,
(f64::INFINITY, f64::INFINITY),
),
(
(f64::INFINITY, f64::INFINITY),
f64::INFINITY,
(f64::NAN, f64::INFINITY),
),
(
(f64::INFINITY, f64::INFINITY),
f64::NAN,
(f64::NAN, f64::INFINITY),
),
(
(f64::INFINITY, f64::INFINITY),
-1.5,
(f64::INFINITY, f64::INFINITY),
),
];
for &((re, im), s, want) in CASES {
let z = Complex::new(re, im);
check_c(
"z_sub_s",
&format!("{z:?}, {s:?}"),
z - s,
want,
1e-13,
false,
);
}
}
#[test]
fn complex_z_mul_s() {
let _report = Report;
const CASES: &[((f64, f64), f64, (f64, f64))] = &[
((1.0, 2.0), 2.0, (2.0, 4.0)),
((1.0, 2.0), 0.0, (0.0, 0.0)),
((1.0, 2.0), -0.0, (-0.0, 0.0)),
((1.0, 2.0), f64::INFINITY, (f64::INFINITY, f64::INFINITY)),
((1.0, 2.0), f64::NAN, (f64::NAN, f64::NAN)),
((1.0, 2.0), -1.5, (-1.5, -3.0)),
((f64::INFINITY, 1.0), 2.0, (f64::INFINITY, f64::NAN)),
((f64::INFINITY, 1.0), 0.0, (f64::NAN, f64::NAN)),
((f64::INFINITY, 1.0), -0.0, (f64::NAN, f64::NAN)),
(
(f64::INFINITY, 1.0),
f64::INFINITY,
(f64::INFINITY, f64::NAN),
),
((f64::INFINITY, 1.0), f64::NAN, (f64::NAN, f64::NAN)),
((f64::INFINITY, 1.0), -1.5, (f64::NEG_INFINITY, f64::NAN)),
((0.0, -0.0), 2.0, (0.0, 0.0)),
((0.0, -0.0), 0.0, (0.0, 0.0)),
((0.0, -0.0), -0.0, (0.0, 0.0)),
((0.0, -0.0), f64::INFINITY, (f64::NAN, f64::NAN)),
((0.0, -0.0), f64::NAN, (f64::NAN, f64::NAN)),
((0.0, -0.0), -1.5, (0.0, 0.0)),
((-0.0, 3.0), 2.0, (-0.0, 6.0)),
((-0.0, 3.0), 0.0, (-0.0, 0.0)),
((-0.0, 3.0), -0.0, (0.0, -0.0)),
((-0.0, 3.0), f64::INFINITY, (f64::NAN, f64::INFINITY)),
((-0.0, 3.0), f64::NAN, (f64::NAN, f64::NAN)),
((-0.0, 3.0), -1.5, (0.0, -4.5)),
((f64::NAN, 1.0), 2.0, (f64::NAN, f64::NAN)),
((f64::NAN, 1.0), 0.0, (f64::NAN, f64::NAN)),
((f64::NAN, 1.0), -0.0, (f64::NAN, f64::NAN)),
((f64::NAN, 1.0), f64::INFINITY, (f64::NAN, f64::NAN)),
((f64::NAN, 1.0), f64::NAN, (f64::NAN, f64::NAN)),
((f64::NAN, 1.0), -1.5, (f64::NAN, f64::NAN)),
((1e+300, -1e+300), 2.0, (2e+300, -2e+300)),
((1e+300, -1e+300), 0.0, (0.0, 0.0)),
((1e+300, -1e+300), -0.0, (0.0, 0.0)),
(
(1e+300, -1e+300),
f64::INFINITY,
(f64::INFINITY, f64::NEG_INFINITY),
),
((1e+300, -1e+300), f64::NAN, (f64::NAN, f64::NAN)),
((1e+300, -1e+300), -1.5, (-1.5e+300, 1.5e+300)),
((-2.0, -0.5), 2.0, (-4.0, -1.0)),
((-2.0, -0.5), 0.0, (0.0, -0.0)),
((-2.0, -0.5), -0.0, (0.0, 0.0)),
(
(-2.0, -0.5),
f64::INFINITY,
(f64::NEG_INFINITY, f64::NEG_INFINITY),
),
((-2.0, -0.5), f64::NAN, (f64::NAN, f64::NAN)),
((-2.0, -0.5), -1.5, (3.0, 0.75)),
((f64::INFINITY, f64::INFINITY), 2.0, (f64::NAN, f64::NAN)),
((f64::INFINITY, f64::INFINITY), 0.0, (f64::NAN, f64::NAN)),
((f64::INFINITY, f64::INFINITY), -0.0, (f64::NAN, f64::NAN)),
(
(f64::INFINITY, f64::INFINITY),
f64::INFINITY,
(f64::NAN, f64::NAN),
),
(
(f64::INFINITY, f64::INFINITY),
f64::NAN,
(f64::NAN, f64::NAN),
),
((f64::INFINITY, f64::INFINITY), -1.5, (f64::NAN, f64::NAN)),
];
for &((re, im), s, want) in CASES {
let z = Complex::new(re, im);
check_c(
"z_mul_s",
&format!("{z:?}, {s:?}"),
z * s,
want,
1e-13,
false,
);
}
}
#[test]
fn complex_z_div_s() {
let _report = Report;
const CASES: &[((f64, f64), f64, (f64, f64))] = &[
((1.0, 2.0), 2.0, (0.5, 1.0)),
((1.0, 2.0), 0.0, (f64::INFINITY, f64::INFINITY)),
((1.0, 2.0), -0.0, (f64::INFINITY, f64::INFINITY)),
((1.0, 2.0), f64::INFINITY, (0.0, 0.0)),
((1.0, 2.0), f64::NAN, (f64::NAN, f64::NAN)),
((1.0, 2.0), -1.5, (-0.6666666666666666, -1.3333333333333333)),
((f64::INFINITY, 1.0), 2.0, (f64::INFINITY, f64::NAN)),
((f64::INFINITY, 1.0), 0.0, (f64::INFINITY, f64::INFINITY)),
((f64::INFINITY, 1.0), -0.0, (f64::INFINITY, f64::INFINITY)),
((f64::INFINITY, 1.0), f64::INFINITY, (f64::NAN, f64::NAN)),
((f64::INFINITY, 1.0), f64::NAN, (f64::NAN, f64::NAN)),
((f64::INFINITY, 1.0), -1.5, (f64::NEG_INFINITY, f64::NAN)),
((0.0, -0.0), 2.0, (0.0, -0.0)),
((0.0, -0.0), 0.0, (f64::NAN, f64::NAN)),
((0.0, -0.0), -0.0, (f64::NAN, f64::NAN)),
((0.0, -0.0), f64::INFINITY, (0.0, -0.0)),
((0.0, -0.0), f64::NAN, (f64::NAN, f64::NAN)),
((0.0, -0.0), -1.5, (-0.0, -0.0)),
((-0.0, 3.0), 2.0, (0.0, 1.5)),
((-0.0, 3.0), 0.0, (f64::NAN, f64::INFINITY)),
((-0.0, 3.0), -0.0, (f64::NAN, f64::INFINITY)),
((-0.0, 3.0), f64::INFINITY, (0.0, 0.0)),
((-0.0, 3.0), f64::NAN, (f64::NAN, f64::NAN)),
((-0.0, 3.0), -1.5, (0.0, -2.0)),
((f64::NAN, 1.0), 2.0, (f64::NAN, f64::NAN)),
((f64::NAN, 1.0), 0.0, (f64::NAN, f64::INFINITY)),
((f64::NAN, 1.0), -0.0, (f64::NAN, f64::INFINITY)),
((f64::NAN, 1.0), f64::INFINITY, (f64::NAN, f64::NAN)),
((f64::NAN, 1.0), f64::NAN, (f64::NAN, f64::NAN)),
((f64::NAN, 1.0), -1.5, (f64::NAN, f64::NAN)),
((1e+300, -1e+300), 2.0, (5e+299, -5e+299)),
((1e+300, -1e+300), 0.0, (f64::INFINITY, f64::NEG_INFINITY)),
((1e+300, -1e+300), -0.0, (f64::INFINITY, f64::NEG_INFINITY)),
((1e+300, -1e+300), f64::INFINITY, (0.0, -0.0)),
((1e+300, -1e+300), f64::NAN, (f64::NAN, f64::NAN)),
(
(1e+300, -1e+300),
-1.5,
(-6.666666666666667e+299, 6.666666666666667e+299),
),
((-2.0, -0.5), 2.0, (-1.0, -0.25)),
((-2.0, -0.5), 0.0, (f64::NEG_INFINITY, f64::NEG_INFINITY)),
((-2.0, -0.5), -0.0, (f64::NEG_INFINITY, f64::NEG_INFINITY)),
((-2.0, -0.5), f64::INFINITY, (-0.0, -0.0)),
((-2.0, -0.5), f64::NAN, (f64::NAN, f64::NAN)),
((-2.0, -0.5), -1.5, (1.3333333333333333, 0.3333333333333333)),
((f64::INFINITY, f64::INFINITY), 2.0, (f64::NAN, f64::NAN)),
(
(f64::INFINITY, f64::INFINITY),
0.0,
(f64::INFINITY, f64::INFINITY),
),
(
(f64::INFINITY, f64::INFINITY),
-0.0,
(f64::INFINITY, f64::INFINITY),
),
(
(f64::INFINITY, f64::INFINITY),
f64::INFINITY,
(f64::NAN, f64::NAN),
),
(
(f64::INFINITY, f64::INFINITY),
f64::NAN,
(f64::NAN, f64::NAN),
),
((f64::INFINITY, f64::INFINITY), -1.5, (f64::NAN, f64::NAN)),
];
for &((re, im), s, want) in CASES {
let z = Complex::new(re, im);
check_c(
"z_div_s",
&format!("{z:?}, {s:?}"),
z / s,
want,
1e-13,
false,
);
}
}
#[test]
fn complex_s_add_z() {
let _report = Report;
const CASES: &[((f64, f64), f64, (f64, f64))] = &[
((1.0, 2.0), 2.0, (3.0, 2.0)),
((1.0, 2.0), 0.0, (1.0, 2.0)),
((1.0, 2.0), -0.0, (1.0, 2.0)),
((1.0, 2.0), f64::INFINITY, (f64::INFINITY, 2.0)),
((1.0, 2.0), f64::NAN, (f64::NAN, 2.0)),
((1.0, 2.0), -1.5, (-0.5, 2.0)),
((f64::INFINITY, 1.0), 2.0, (f64::INFINITY, 1.0)),
((f64::INFINITY, 1.0), 0.0, (f64::INFINITY, 1.0)),
((f64::INFINITY, 1.0), -0.0, (f64::INFINITY, 1.0)),
((f64::INFINITY, 1.0), f64::INFINITY, (f64::INFINITY, 1.0)),
((f64::INFINITY, 1.0), f64::NAN, (f64::NAN, 1.0)),
((f64::INFINITY, 1.0), -1.5, (f64::INFINITY, 1.0)),
((0.0, -0.0), 2.0, (2.0, 0.0)),
((0.0, -0.0), 0.0, (0.0, 0.0)),
((0.0, -0.0), -0.0, (0.0, 0.0)),
((0.0, -0.0), f64::INFINITY, (f64::INFINITY, 0.0)),
((0.0, -0.0), f64::NAN, (f64::NAN, 0.0)),
((0.0, -0.0), -1.5, (-1.5, 0.0)),
((-0.0, 3.0), 2.0, (2.0, 3.0)),
((-0.0, 3.0), 0.0, (0.0, 3.0)),
((-0.0, 3.0), -0.0, (-0.0, 3.0)),
((-0.0, 3.0), f64::INFINITY, (f64::INFINITY, 3.0)),
((-0.0, 3.0), f64::NAN, (f64::NAN, 3.0)),
((-0.0, 3.0), -1.5, (-1.5, 3.0)),
((f64::NAN, 1.0), 2.0, (f64::NAN, 1.0)),
((f64::NAN, 1.0), 0.0, (f64::NAN, 1.0)),
((f64::NAN, 1.0), -0.0, (f64::NAN, 1.0)),
((f64::NAN, 1.0), f64::INFINITY, (f64::NAN, 1.0)),
((f64::NAN, 1.0), f64::NAN, (f64::NAN, 1.0)),
((f64::NAN, 1.0), -1.5, (f64::NAN, 1.0)),
((1e+300, -1e+300), 2.0, (1e+300, -1e+300)),
((1e+300, -1e+300), 0.0, (1e+300, -1e+300)),
((1e+300, -1e+300), -0.0, (1e+300, -1e+300)),
((1e+300, -1e+300), f64::INFINITY, (f64::INFINITY, -1e+300)),
((1e+300, -1e+300), f64::NAN, (f64::NAN, -1e+300)),
((1e+300, -1e+300), -1.5, (1e+300, -1e+300)),
((-2.0, -0.5), 2.0, (0.0, -0.5)),
((-2.0, -0.5), 0.0, (-2.0, -0.5)),
((-2.0, -0.5), -0.0, (-2.0, -0.5)),
((-2.0, -0.5), f64::INFINITY, (f64::INFINITY, -0.5)),
((-2.0, -0.5), f64::NAN, (f64::NAN, -0.5)),
((-2.0, -0.5), -1.5, (-3.5, -0.5)),
(
(f64::INFINITY, f64::INFINITY),
2.0,
(f64::INFINITY, f64::INFINITY),
),
(
(f64::INFINITY, f64::INFINITY),
0.0,
(f64::INFINITY, f64::INFINITY),
),
(
(f64::INFINITY, f64::INFINITY),
-0.0,
(f64::INFINITY, f64::INFINITY),
),
(
(f64::INFINITY, f64::INFINITY),
f64::INFINITY,
(f64::INFINITY, f64::INFINITY),
),
(
(f64::INFINITY, f64::INFINITY),
f64::NAN,
(f64::NAN, f64::INFINITY),
),
(
(f64::INFINITY, f64::INFINITY),
-1.5,
(f64::INFINITY, f64::INFINITY),
),
];
for &((re, im), s, want) in CASES {
let z = Complex::new(re, im);
check_c(
"s_add_z",
&format!("{z:?}, {s:?}"),
s + z,
want,
1e-13,
false,
);
}
}
#[test]
fn complex_s_sub_z() {
let _report = Report;
const CASES: &[((f64, f64), f64, (f64, f64))] = &[
((1.0, 2.0), 2.0, (1.0, -2.0)),
((1.0, 2.0), 0.0, (-1.0, -2.0)),
((1.0, 2.0), -0.0, (-1.0, -2.0)),
((1.0, 2.0), f64::INFINITY, (f64::INFINITY, -2.0)),
((1.0, 2.0), f64::NAN, (f64::NAN, -2.0)),
((1.0, 2.0), -1.5, (-2.5, -2.0)),
((f64::INFINITY, 1.0), 2.0, (f64::NEG_INFINITY, -1.0)),
((f64::INFINITY, 1.0), 0.0, (f64::NEG_INFINITY, -1.0)),
((f64::INFINITY, 1.0), -0.0, (f64::NEG_INFINITY, -1.0)),
((f64::INFINITY, 1.0), f64::INFINITY, (f64::NAN, -1.0)),
((f64::INFINITY, 1.0), f64::NAN, (f64::NAN, -1.0)),
((f64::INFINITY, 1.0), -1.5, (f64::NEG_INFINITY, -1.0)),
((0.0, -0.0), 2.0, (2.0, 0.0)),
((0.0, -0.0), 0.0, (0.0, 0.0)),
((0.0, -0.0), -0.0, (-0.0, 0.0)),
((0.0, -0.0), f64::INFINITY, (f64::INFINITY, 0.0)),
((0.0, -0.0), f64::NAN, (f64::NAN, 0.0)),
((0.0, -0.0), -1.5, (-1.5, 0.0)),
((-0.0, 3.0), 2.0, (2.0, -3.0)),
((-0.0, 3.0), 0.0, (0.0, -3.0)),
((-0.0, 3.0), -0.0, (0.0, -3.0)),
((-0.0, 3.0), f64::INFINITY, (f64::INFINITY, -3.0)),
((-0.0, 3.0), f64::NAN, (f64::NAN, -3.0)),
((-0.0, 3.0), -1.5, (-1.5, -3.0)),
((f64::NAN, 1.0), 2.0, (f64::NAN, -1.0)),
((f64::NAN, 1.0), 0.0, (f64::NAN, -1.0)),
((f64::NAN, 1.0), -0.0, (f64::NAN, -1.0)),
((f64::NAN, 1.0), f64::INFINITY, (f64::NAN, -1.0)),
((f64::NAN, 1.0), f64::NAN, (f64::NAN, -1.0)),
((f64::NAN, 1.0), -1.5, (f64::NAN, -1.0)),
((1e+300, -1e+300), 2.0, (-1e+300, 1e+300)),
((1e+300, -1e+300), 0.0, (-1e+300, 1e+300)),
((1e+300, -1e+300), -0.0, (-1e+300, 1e+300)),
((1e+300, -1e+300), f64::INFINITY, (f64::INFINITY, 1e+300)),
((1e+300, -1e+300), f64::NAN, (f64::NAN, 1e+300)),
((1e+300, -1e+300), -1.5, (-1e+300, 1e+300)),
((-2.0, -0.5), 2.0, (4.0, 0.5)),
((-2.0, -0.5), 0.0, (2.0, 0.5)),
((-2.0, -0.5), -0.0, (2.0, 0.5)),
((-2.0, -0.5), f64::INFINITY, (f64::INFINITY, 0.5)),
((-2.0, -0.5), f64::NAN, (f64::NAN, 0.5)),
((-2.0, -0.5), -1.5, (0.5, 0.5)),
(
(f64::INFINITY, f64::INFINITY),
2.0,
(f64::NEG_INFINITY, f64::NEG_INFINITY),
),
(
(f64::INFINITY, f64::INFINITY),
0.0,
(f64::NEG_INFINITY, f64::NEG_INFINITY),
),
(
(f64::INFINITY, f64::INFINITY),
-0.0,
(f64::NEG_INFINITY, f64::NEG_INFINITY),
),
(
(f64::INFINITY, f64::INFINITY),
f64::INFINITY,
(f64::NAN, f64::NEG_INFINITY),
),
(
(f64::INFINITY, f64::INFINITY),
f64::NAN,
(f64::NAN, f64::NEG_INFINITY),
),
(
(f64::INFINITY, f64::INFINITY),
-1.5,
(f64::NEG_INFINITY, f64::NEG_INFINITY),
),
];
for &((re, im), s, want) in CASES {
let z = Complex::new(re, im);
check_c(
"s_sub_z",
&format!("{z:?}, {s:?}"),
s - z,
want,
1e-13,
false,
);
}
}
#[test]
fn complex_s_mul_z() {
let _report = Report;
const CASES: &[((f64, f64), f64, (f64, f64))] = &[
((1.0, 2.0), 2.0, (2.0, 4.0)),
((1.0, 2.0), 0.0, (0.0, 0.0)),
((1.0, 2.0), -0.0, (-0.0, 0.0)),
((1.0, 2.0), f64::INFINITY, (f64::INFINITY, f64::INFINITY)),
((1.0, 2.0), f64::NAN, (f64::NAN, f64::NAN)),
((1.0, 2.0), -1.5, (-1.5, -3.0)),
((f64::INFINITY, 1.0), 2.0, (f64::INFINITY, f64::NAN)),
((f64::INFINITY, 1.0), 0.0, (f64::NAN, f64::NAN)),
((f64::INFINITY, 1.0), -0.0, (f64::NAN, f64::NAN)),
(
(f64::INFINITY, 1.0),
f64::INFINITY,
(f64::INFINITY, f64::NAN),
),
((f64::INFINITY, 1.0), f64::NAN, (f64::NAN, f64::NAN)),
((f64::INFINITY, 1.0), -1.5, (f64::NEG_INFINITY, f64::NAN)),
((0.0, -0.0), 2.0, (0.0, 0.0)),
((0.0, -0.0), 0.0, (0.0, 0.0)),
((0.0, -0.0), -0.0, (0.0, 0.0)),
((0.0, -0.0), f64::INFINITY, (f64::NAN, f64::NAN)),
((0.0, -0.0), f64::NAN, (f64::NAN, f64::NAN)),
((0.0, -0.0), -1.5, (0.0, 0.0)),
((-0.0, 3.0), 2.0, (-0.0, 6.0)),
((-0.0, 3.0), 0.0, (-0.0, 0.0)),
((-0.0, 3.0), -0.0, (0.0, -0.0)),
((-0.0, 3.0), f64::INFINITY, (f64::NAN, f64::INFINITY)),
((-0.0, 3.0), f64::NAN, (f64::NAN, f64::NAN)),
((-0.0, 3.0), -1.5, (0.0, -4.5)),
((f64::NAN, 1.0), 2.0, (f64::NAN, f64::NAN)),
((f64::NAN, 1.0), 0.0, (f64::NAN, f64::NAN)),
((f64::NAN, 1.0), -0.0, (f64::NAN, f64::NAN)),
((f64::NAN, 1.0), f64::INFINITY, (f64::NAN, f64::NAN)),
((f64::NAN, 1.0), f64::NAN, (f64::NAN, f64::NAN)),
((f64::NAN, 1.0), -1.5, (f64::NAN, f64::NAN)),
((1e+300, -1e+300), 2.0, (2e+300, -2e+300)),
((1e+300, -1e+300), 0.0, (0.0, 0.0)),
((1e+300, -1e+300), -0.0, (0.0, 0.0)),
(
(1e+300, -1e+300),
f64::INFINITY,
(f64::INFINITY, f64::NEG_INFINITY),
),
((1e+300, -1e+300), f64::NAN, (f64::NAN, f64::NAN)),
((1e+300, -1e+300), -1.5, (-1.5e+300, 1.5e+300)),
((-2.0, -0.5), 2.0, (-4.0, -1.0)),
((-2.0, -0.5), 0.0, (0.0, -0.0)),
((-2.0, -0.5), -0.0, (0.0, 0.0)),
(
(-2.0, -0.5),
f64::INFINITY,
(f64::NEG_INFINITY, f64::NEG_INFINITY),
),
((-2.0, -0.5), f64::NAN, (f64::NAN, f64::NAN)),
((-2.0, -0.5), -1.5, (3.0, 0.75)),
((f64::INFINITY, f64::INFINITY), 2.0, (f64::NAN, f64::NAN)),
((f64::INFINITY, f64::INFINITY), 0.0, (f64::NAN, f64::NAN)),
((f64::INFINITY, f64::INFINITY), -0.0, (f64::NAN, f64::NAN)),
(
(f64::INFINITY, f64::INFINITY),
f64::INFINITY,
(f64::NAN, f64::NAN),
),
(
(f64::INFINITY, f64::INFINITY),
f64::NAN,
(f64::NAN, f64::NAN),
),
((f64::INFINITY, f64::INFINITY), -1.5, (f64::NAN, f64::NAN)),
];
for &((re, im), s, want) in CASES {
let z = Complex::new(re, im);
check_c(
"s_mul_z",
&format!("{z:?}, {s:?}"),
s * z,
want,
1e-13,
false,
);
}
}
#[test]
fn complex_s_div_z() {
let _report = Report;
const CASES: &[((f64, f64), f64, (f64, f64))] = &[
((1.0, 2.0), 2.0, (0.4, -0.8)),
((1.0, 2.0), 0.0, (0.0, 0.0)),
((1.0, 2.0), -0.0, (0.0, 0.0)),
(
(1.0, 2.0),
f64::INFINITY,
(f64::INFINITY, f64::NEG_INFINITY),
),
((1.0, 2.0), f64::NAN, (f64::NAN, f64::NAN)),
((1.0, 2.0), -1.5, (-0.30000000000000004, 0.6000000000000001)),
((f64::INFINITY, 1.0), 2.0, (0.0, 0.0)),
((f64::INFINITY, 1.0), 0.0, (0.0, 0.0)),
((f64::INFINITY, 1.0), -0.0, (0.0, 0.0)),
((f64::INFINITY, 1.0), f64::INFINITY, (f64::NAN, f64::NAN)),
((f64::INFINITY, 1.0), f64::NAN, (f64::NAN, f64::NAN)),
((f64::INFINITY, 1.0), -1.5, (-0.0, 0.0)),
((0.0, -0.0), 2.0, (f64::INFINITY, f64::NAN)),
((0.0, -0.0), 0.0, (f64::NAN, f64::NAN)),
((0.0, -0.0), -0.0, (f64::NAN, f64::NAN)),
((0.0, -0.0), f64::INFINITY, (f64::INFINITY, f64::NAN)),
((0.0, -0.0), f64::NAN, (f64::NAN, f64::NAN)),
((0.0, -0.0), -1.5, (f64::NEG_INFINITY, f64::NAN)),
((-0.0, 3.0), 2.0, (0.0, -0.6666666666666666)),
((-0.0, 3.0), 0.0, (0.0, -0.0)),
((-0.0, 3.0), -0.0, (0.0, 0.0)),
((-0.0, 3.0), f64::INFINITY, (f64::NAN, f64::NEG_INFINITY)),
((-0.0, 3.0), f64::NAN, (f64::NAN, f64::NAN)),
((-0.0, 3.0), -1.5, (0.0, 0.5)),
((f64::NAN, 1.0), 2.0, (f64::NAN, f64::NAN)),
((f64::NAN, 1.0), 0.0, (f64::NAN, f64::NAN)),
((f64::NAN, 1.0), -0.0, (f64::NAN, f64::NAN)),
((f64::NAN, 1.0), f64::INFINITY, (f64::NAN, f64::NAN)),
((f64::NAN, 1.0), f64::NAN, (f64::NAN, f64::NAN)),
((f64::NAN, 1.0), -1.5, (f64::NAN, f64::NAN)),
((1e+300, -1e+300), 2.0, (1e-300, 1e-300)),
((1e+300, -1e+300), 0.0, (0.0, 0.0)),
((1e+300, -1e+300), -0.0, (-0.0, 0.0)),
(
(1e+300, -1e+300),
f64::INFINITY,
(f64::INFINITY, f64::INFINITY),
),
((1e+300, -1e+300), f64::NAN, (f64::NAN, f64::NAN)),
((1e+300, -1e+300), -1.5, (-7.5e-301, -7.5e-301)),
(
(-2.0, -0.5),
2.0,
(-0.9411764705882353, 0.23529411764705882),
),
((-2.0, -0.5), 0.0, (-0.0, -0.0)),
((-2.0, -0.5), -0.0, (-0.0, -0.0)),
(
(-2.0, -0.5),
f64::INFINITY,
(f64::NEG_INFINITY, f64::INFINITY),
),
((-2.0, -0.5), f64::NAN, (f64::NAN, f64::NAN)),
(
(-2.0, -0.5),
-1.5,
(0.7058823529411764, -0.1764705882352941),
),
((f64::INFINITY, f64::INFINITY), 2.0, (f64::NAN, f64::NAN)),
((f64::INFINITY, f64::INFINITY), 0.0, (f64::NAN, f64::NAN)),
((f64::INFINITY, f64::INFINITY), -0.0, (f64::NAN, f64::NAN)),
(
(f64::INFINITY, f64::INFINITY),
f64::INFINITY,
(f64::NAN, f64::NAN),
),
(
(f64::INFINITY, f64::INFINITY),
f64::NAN,
(f64::NAN, f64::NAN),
),
((f64::INFINITY, f64::INFINITY), -1.5, (f64::NAN, f64::NAN)),
];
for &((re, im), s, want) in CASES {
let z = Complex::new(re, im);
check_c(
"s_div_z",
&format!("{z:?}, {s:?}"),
s / z,
want,
1e-13,
false,
);
}
}
#[test]
fn complex_scalar_assign_ops() {
let _report = Report;
let mut z = Complex::new(1.0, 2.0);
z += 3.0;
assert_eq!(z, Complex::new(4.0, 2.0));
z -= 1.0;
assert_eq!(z, Complex::new(3.0, 2.0));
z *= 2.0;
assert_eq!(z, Complex::new(6.0, 4.0));
z /= 2.0;
assert_eq!(z, Complex::new(3.0, 2.0));
z *= Complex::i();
assert_eq!(z, Complex::new(-2.0, 3.0));
assert_eq!(-z, Complex::new(2.0, -3.0));
assert_eq!(Complex::<f32>::default(), Complex::new(0.0, 0.0));
assert_eq!(Complex::from_real(2.5f64), Complex::new(2.5, 0.0));
assert_eq!(2.0f32 * Complex::new(1.0f32, -1.0), Complex::new(2.0, -2.0));
}
#[test]
fn complex_nan_is_not_equal_to_itself() {
let _report = Report;
let z = Complex::new(f64::NAN, 1.0);
assert_ne!(z, z);
assert_eq!(Complex::new(0.0, -0.0), Complex::new(-0.0, 0.0));
}
#[test]
fn complex_imaginary_unit_squares_to_minus_one() {
let _report = Report;
let i = Complex::<f64>::i();
assert_eq!(i * i, Complex::new(-1.0, 0.0));
assert_eq!(Complex::<f32>::i().norm_sqr(), 1.0);
}
#[test]
fn complex_from_polar_roundtrip() {
let _report = Report;
let z = Complex::from_polar(2.0f64, core::f64::consts::FRAC_PI_3);
assert!((z.norm() - 2.0).abs() < 1e-15);
assert!((z.arg() - core::f64::consts::FRAC_PI_3).abs() < 1e-15);
assert!((Complex::new(3.0f64, 4.0).norm_sqr() - 25.0).abs() == 0.0);
}
#[test]
fn complex_exp_overflow_edge_matches_mpmath() {
let _report = Report;
const CASES: &[((f64, f64), (f64, f64))] = &[
((710.0, 1.0), (1.2070325234545281e+308, f64::INFINITY)),
(
(709.9, 1.5707963267948966),
(1.2377517789083512e+292, f64::INFINITY),
),
];
for &((re, im), want) in CASES {
let z = Complex::new(re, im);
check_c("exp", &format!("{z:?}"), z.exp(), want, 1e-14, false);
}
}
#[test]
fn complex_sinh_overflow_edge_matches_mpmath() {
let _report = Report;
const CASES: &[((f64, f64), (f64, f64))] = &[
(
(710.0, 1.0),
(6.035162617272641e+307, 9.399208879688907e+307),
),
(
(709.9, 1.5707963267948966),
(6.188758894541756e+291, 1.010701028059782e+308),
),
];
for &((re, im), want) in CASES {
let z = Complex::new(re, im);
check_c("sinh", &format!("{z:?}"), z.sinh(), want, 1e-14, false);
}
}
#[test]
fn complex_cosh_overflow_edge_matches_mpmath() {
let _report = Report;
const CASES: &[((f64, f64), (f64, f64))] = &[
(
(710.0, 1.0),
(6.035162617272641e+307, 9.399208879688907e+307),
),
(
(709.9, 1.5707963267948966),
(6.188758894541756e+291, 1.010701028059782e+308),
),
];
for &((re, im), want) in CASES {
let z = Complex::new(re, im);
check_c("cosh", &format!("{z:?}"), z.cosh(), want, 1e-14, false);
}
}
#[test]
fn complex_sqrt_overflow_edge_matches_mpmath() {
let _report = Report;
const CASES: &[((f64, f64), (f64, f64))] = &[
(
(1.7e+308, 1.7e+308),
(1.4325088230154573e+154, 5.933645827121221e+153),
),
(
(-1.7e+308, 1.0),
(3.8348249442368524e-155, 1.3038404810405297e+154),
),
];
for &((re, im), want) in CASES {
let z = Complex::new(re, im);
check_c("sqrt", &format!("{z:?}"), z.sqrt(), want, 1e-14, false);
}
}
#[test]
fn complex_mul_overflow_is_plain_ieee() {
let _report = Report;
let z = Complex::new(1e300f64, 1e300);
let p = z * z;
assert_eq!(p.im, f64::INFINITY);
assert!(!p.re.is_finite());
}
#[test]
fn complex_branch_cuts_follow_the_sign_of_zero() {
let _report = Report;
use core::f64::consts::PI;
let up = Complex::new(-4.0, 0.0).sqrt();
let down = Complex::new(-4.0, -0.0).sqrt();
assert_eq!((up.re, up.im), (0.0, 2.0));
assert!(down.re == 0.0 && down.im == -2.0);
assert_eq!(Complex::new(-1.0, 0.0).ln(), Complex::new(0.0, PI));
assert_eq!(Complex::new(-1.0, -0.0).ln(), Complex::new(0.0, -PI));
assert_eq!(
Complex::new(0.0, 0.0).ln(),
Complex::new(f64::NEG_INFINITY, 0.0)
);
assert_eq!(Complex::new(-0.0, 0.0).ln().im, PI);
let z = Complex::new(-0.0f64, 0.0).sqrt();
assert!(z.re == 0.0 && !z.re.is_sign_negative() && z.im == 0.0);
let w = Complex::new(0.0f64, -0.0).sqrt();
assert!(w.im.is_sign_negative());
}
#[test]
fn complex_hand_checked_values() {
let _report = Report;
use core::f64::consts::{E, FRAC_PI_2, PI};
let e_ipi = Complex::new(0.0, PI).exp();
assert!((e_ipi.re + 1.0).abs() < 1e-15 && e_ipi.im.abs() < 2e-16);
let i_pow_i = Complex::<f64>::i().powc(Complex::i());
assert!((i_pow_i.re - (-FRAC_PI_2).exp()).abs() < 1e-15 && i_pow_i.im.abs() < 1e-15);
let z = Complex::new(3.0, 4.0);
assert_eq!(z.norm(), 5.0);
assert_eq!(z.sqrt(), Complex::new(2.0, 1.0));
assert_eq!(z * z.conj(), Complex::new(25.0, 0.0));
assert_eq!(z / z, Complex::new(1.0, 0.0));
assert_eq!(z.powf(2.0), Complex::new(-7.0, 24.0));
assert_eq!(z.powc(Complex::new(0.0, 0.0)), Complex::new(1.0, 0.0));
let l = Complex::new(E, 0.0).ln();
assert!((l.re - 1.0).abs() < 1e-15 && l.im == 0.0);
let a = Complex::new(0.7f64, -1.3);
let s = a.sin() * a.sin() + a.cos() * a.cos();
assert!((s.re - 1.0).abs() < 1e-14 && s.im.abs() < 1e-14);
let h = a.cosh() * a.cosh() - a.sinh() * a.sinh();
assert!((h.re - 1.0).abs() < 1e-14 && h.im.abs() < 1e-14);
let t = a.tanh();
let q = a.sinh() / a.cosh();
assert!((t.re - q.re).abs() < 1e-14 && (t.im - q.im).abs() < 1e-14);
}
#[test]
fn complex_powc_f64() {
let _report = Report;
const CASES: &[((f64, f64), (f64, f64), (f64, f64))] = &[
((0.0, 0.0), (0.0, 0.0), (1.0, 0.0)),
((0.0, 0.0), (2.0, 0.0), (0.0, 0.0)),
((0.0, 0.0), (-1.0, 0.0), (f64::NAN, f64::NAN)),
((0.0, 0.0), (1.0, 1.0), (0.0, 0.0)),
((0.0, 0.0), (0.5, 0.0), (0.0, 0.0)),
((0.0, 0.0), (0.0, 1e-300), (f64::NAN, f64::NAN)),
((1.0, 2.0), (0.0, 0.0), (1.0, 0.0)),
((1.0, 2.0), (1.0, 0.0), (1.0, 2.0)),
((1.0, 2.0), (2.0, 0.0), (-3.0, 4.0)),
((1.0, 2.0), (3.0, 0.0), (-11.0, -2.0)),
((1.0, 2.0), (4.0, 0.0), (-7.0, -24.0)),
((1.0, 2.0), (-1.0, 0.0), (0.2, -0.4)),
((1.0, 2.0), (-2.0, 0.0), (-0.12, -0.16)),
((1.0, 2.0), (5.0, 0.0), (41.0, -38.0)),
((1.0, 2.0), (7.0, 0.0), (29.0, 278.0)),
((1.0, 2.0), (10.0, 0.0), (237.0, -3116.0)),
(
(1.0, 2.0),
(99.0, 0.0),
(-3.7339294613021816e+34, 1.3546176148418555e+34),
),
(
(1.0, 2.0),
(-99.0, 0.0),
(-2.3666589614147896e-35, -8.585909162670051e-36),
),
(
(1.0, 2.0),
(100.0, 0.0),
(-6.443164690985956e+34, -6.113241307762409e+34),
),
(
(1.0, 2.0),
(101.0, 0.0),
(5.783317924538809e+34, -1.8999570689734217e+35),
),
(
(1.0, 2.0),
(0.5, 0.0),
(1.272019649514069, 0.7861513777574233),
),
(
(1.0, 2.0),
(1.5, 0.0),
(-0.30028310600077707, 3.3301906767855605),
),
(
(1.0, 2.0),
(0.5, 0.5),
(0.4958933099972861, 0.7022180709459005),
),
((0.0, 2.0), (0.5, 0.0), (1.0, 1.0)),
((-1.0, 0.0), (0.5, 0.0), (6.123233995736766e-17, 1.0)),
((-1.0, -0.0), (0.5, 0.0), (6.123233995736766e-17, -1.0)),
(
(-8.0, 0.0),
(0.3333333333333333, 0.0),
(1.0, 1.732050807568877),
),
((3.0, 4.0), (2.0, 0.0), (-7.0, 24.0)),
((f64::INFINITY, 0.0), (2.0, 0.0), (f64::INFINITY, f64::NAN)),
((f64::INFINITY, 1.0), (3.0, 0.0), (f64::NAN, f64::INFINITY)),
((f64::NAN, 0.0), (2.0, 0.0), (f64::NAN, f64::NAN)),
((1.0, 1.0), (f64::NAN, 0.0), (f64::NAN, f64::NAN)),
(
(1.0, 1.0),
(10000000000.0, 0.0),
(f64::INFINITY, f64::NEG_INFINITY),
),
((2.0, 0.0), (10.0, 0.0), (1024.0, 0.0)),
((2.0, 0.0), (-10.0, 0.0), (0.0009765625, 0.0)),
((2.0, 0.0), (0.5, 0.0), (1.4142135623730951, 0.0)),
(
(0.5, 0.5),
(2.5, 0.0),
(-0.16089856322639562, 0.3884434935075093),
),
((1e+100, 1e+100), (2.0, 0.0), (0.0, 2e+200)),
((1e+200, 1e+200), (3.0, 0.0), (f64::NAN, f64::NAN)),
(
(-2.0, -3.0),
(3.0, 2.0),
(-2524.3845222193604, 2447.104537950196),
),
((0.0, 1.0), (0.0, 1.0), (0.20787957635076193, 0.0)),
(
(2.718281828459045, 0.0),
(0.0, 3.141592653589793),
(-1.0, 1.2246467991473532e-16),
),
((10.0, 0.0), (300.0, 0.0), (1e+300, 0.0)),
];
for &((ar, ai), (br, bi), want) in CASES {
let (a, b) = (Complex::new(ar, ai), Complex::new(br, bi));
check_c(
"powc",
&format!("{a:?}, {b:?}"),
a.powc(b),
want,
1e-11,
!(finite_input(a) && finite_input(b)),
);
}
}
#[test]
fn complex_powf_f64() {
let _report = Report;
const CASES: &[((f64, f64), f64, (f64, f64))] = &[
((0.0, 0.0), 0.0, (1.0, 0.0)),
((0.0, 0.0), 2.0, (0.0, 0.0)),
((0.0, 0.0), -1.0, (f64::NAN, f64::NAN)),
((0.0, 0.0), 0.5, (0.0, 0.0)),
((1.0, 2.0), 0.0, (1.0, 0.0)),
((1.0, 2.0), 1.0, (1.0, 2.0)),
((1.0, 2.0), 2.0, (-3.0, 4.0)),
((1.0, 2.0), 3.0, (-11.0, -2.0)),
((1.0, 2.0), 4.0, (-7.0, -24.0)),
((1.0, 2.0), -1.0, (0.2, -0.4)),
((1.0, 2.0), -2.0, (-0.12, -0.16)),
((1.0, 2.0), 5.0, (41.0, -38.0)),
((1.0, 2.0), 7.0, (29.0, 278.0)),
((1.0, 2.0), 10.0, (237.0, -3116.0)),
(
(1.0, 2.0),
99.0,
(-3.7339294613021816e+34, 1.3546176148418555e+34),
),
(
(1.0, 2.0),
-99.0,
(-2.3666589614147896e-35, -8.585909162670051e-36),
),
(
(1.0, 2.0),
100.0,
(-6.443164690985956e+34, -6.113241307762409e+34),
),
(
(1.0, 2.0),
101.0,
(5.783317924538809e+34, -1.8999570689734217e+35),
),
((1.0, 2.0), 0.5, (1.272019649514069, 0.7861513777574233)),
((1.0, 2.0), 1.5, (-0.30028310600077707, 3.3301906767855605)),
((0.0, 2.0), 0.5, (1.0, 1.0)),
((-1.0, 0.0), 0.5, (6.123233995736766e-17, 1.0)),
((-1.0, -0.0), 0.5, (6.123233995736766e-17, -1.0)),
((-8.0, 0.0), 0.3333333333333333, (1.0, 1.732050807568877)),
((3.0, 4.0), 2.0, (-7.0, 24.0)),
((f64::INFINITY, 0.0), 2.0, (f64::INFINITY, f64::NAN)),
((f64::INFINITY, 1.0), 3.0, (f64::NAN, f64::INFINITY)),
((f64::NAN, 0.0), 2.0, (f64::NAN, f64::NAN)),
((1.0, 1.0), f64::NAN, (f64::NAN, f64::NAN)),
(
(1.0, 1.0),
10000000000.0,
(f64::INFINITY, f64::NEG_INFINITY),
),
((2.0, 0.0), 10.0, (1024.0, 0.0)),
((2.0, 0.0), -10.0, (0.0009765625, 0.0)),
((2.0, 0.0), 0.5, (1.4142135623730951, 0.0)),
((0.5, 0.5), 2.5, (-0.16089856322639562, 0.3884434935075093)),
((1e+100, 1e+100), 2.0, (0.0, 2e+200)),
((1e+200, 1e+200), 3.0, (f64::NAN, f64::NAN)),
((10.0, 0.0), 300.0, (1e+300, 0.0)),
];
for &((ar, ai), p, want) in CASES {
let a = Complex::new(ar, ai);
check_c(
"powf",
&format!("{a:?}, {p:?}"),
a.powf(p),
want,
1e-11,
!(finite_input(a) && p.is_finite()),
);
}
}
#[test]
fn complex_powc_f32() {
let _report = Report;
const CASES: &[((f32, f32), (f32, f32), (f32, f32))] = &[
((1.0, 2.0), (2.0, 0.0), (-3.0, 4.0)),
((1.0, 2.0), (3.0, 0.0), (-11.0, -2.0)),
((1.0, 2.0), (5.0, 0.0), (41.0, -38.0)),
((1.0, 2.0), (-2.0, 0.0), (-0.12, -0.16)),
((0.5, 0.25), (0.5, 0.0), (0.72767335, 0.17178038)),
((2.0, 0.0), (10.0, 0.0), (1024.0, 0.0)),
];
for &((ar, ai), (br, bi), want) in CASES {
let (a, b) = (Complex::new(ar, ai), Complex::new(br, bi));
check_c(
"powc",
&format!("{a:?}, {b:?}"),
a.powc(b),
want,
2e-4,
false,
);
}
}
#[test]
fn complex_display_f64() {
let _report = Report;
const CASES: &[(f64, f64, &str)] = &[
(1.0, 2.0, "(1+2j)"),
(-0.5, -1.0, "(-0.5-1j)"),
(0.0, 2.0, "2j"),
(-0.0, -2.0, "(-0-2j)"),
(0.0, 0.0, "0j"),
(-0.0, 1.0, "(-0+1j)"),
(0.0, -0.0, "-0j"),
(1.0, -0.0, "(1-0j)"),
(1e+16, 1.0, "(1e+16+1j)"),
(1000000000000000.0, 1.0, "(1000000000000000+1j)"),
(1e-05, 0.0001, "(1e-05+0.0001j)"),
(0.0001, 1.0, "(0.0001+1j)"),
(123456789.123, -2.5e-07, "(123456789.123-2.5e-07j)"),
(f64::NAN, f64::NAN, "(nan+nanj)"),
(f64::INFINITY, f64::NEG_INFINITY, "(inf-infj)"),
(0.0, f64::NAN, "nanj"),
(f64::NEG_INFINITY, 0.0, "(-inf+0j)"),
(f64::NAN, 1.0, "(nan+1j)"),
(1.5, 0.0, "(1.5+0j)"),
(100.0, 100.0, "(100+100j)"),
(0.1, 0.2, "(0.1+0.2j)"),
(1e+22, -1e-22, "(1e+22-1e-22j)"),
(
5e-324,
1.7976931348623157e+308,
"(5e-324+1.7976931348623157e+308j)",
),
(3.0, -4.0, "(3-4j)"),
(-1e+300, 1e-300, "(-1e+300+1e-300j)"),
(1.2345678901234567e+19, 1.0, "(1.2345678901234567e+19+1j)"),
(2.5, 3.5, "(2.5+3.5j)"),
(
0.3333333333333333,
-0.6666666666666666,
"(0.3333333333333333-0.6666666666666666j)",
),
];
for &(re, im, want) in CASES {
assert_eq!(
Complex::new(re, im).to_string(),
want,
"Display of ({re:?}, {im:?})"
);
}
}
#[test]
fn complex_display_f32() {
let _report = Report;
const CASES: &[(f32, f32, &str)] = &[
(1.0, 2.0, "(1+2j)"),
(-0.5, -1.0, "(-0.5-1j)"),
(0.0, 2.0, "2j"),
(0.1, 0.2, "(0.1+0.2j)"),
(1e+16, 1.0, "(1e+16+1j)"),
(3.4028235e+38, -1e-45, "(3.4028235e+38-1e-45j)"),
(f32::NAN, f32::INFINITY, "(nan+infj)"),
(0.33333334, 1.0, "(0.33333334+1j)"),
(1.6777216e+07, 0.5, "(1.6777216e+07+0.5j)"),
];
for &(re, im, want) in CASES {
assert_eq!(
Complex::new(re, im).to_string(),
want,
"Display of ({re:?}, {im:?})"
);
}
}
#[test]
fn complex_cmp_numpy_matches_np_sort() {
let _report = Report;
const INPUT: &[(f64, f64)] = &[
(f64::NAN, f64::NAN),
(f64::INFINITY, 0.0),
(2.0, 0.0),
(f64::NAN, 0.0),
(f64::INFINITY, -3.0),
(f64::NEG_INFINITY, 0.0),
(-1.0, f64::NAN),
(0.0, 1.0),
(-1.0, -3.0),
(f64::INFINITY, f64::INFINITY),
(-0.0, f64::INFINITY),
(-1.0, 0.0),
(f64::NAN, f64::INFINITY),
(0.0, -3.0),
(-0.0, f64::NAN),
(f64::NEG_INFINITY, -3.0),
(-1.0, f64::INFINITY),
(0.0, f64::INFINITY),
(-0.0, -3.0),
(0.0, 0.0),
(2.0, f64::INFINITY),
(2.0, -3.0),
(f64::NAN, 1.0),
(f64::INFINITY, f64::NAN),
(2.0, 1.0),
(f64::INFINITY, 1.0),
(f64::NEG_INFINITY, f64::INFINITY),
(f64::NEG_INFINITY, f64::NAN),
(0.0, f64::NAN),
(2.0, f64::NAN),
(-0.0, 0.0),
(f64::NAN, -3.0),
(-0.0, 1.0),
(f64::NEG_INFINITY, 1.0),
(-1.0, 1.0),
];
const SORTED: &[(f64, f64)] = &[
(f64::NEG_INFINITY, -3.0),
(f64::NEG_INFINITY, 0.0),
(f64::NEG_INFINITY, 1.0),
(f64::NEG_INFINITY, f64::INFINITY),
(-1.0, -3.0),
(-1.0, 0.0),
(-1.0, 1.0),
(-1.0, f64::INFINITY),
(-0.0, -3.0),
(0.0, -3.0),
(-0.0, 0.0),
(0.0, 0.0),
(-0.0, 1.0),
(0.0, 1.0),
(0.0, f64::INFINITY),
(-0.0, f64::INFINITY),
(2.0, -3.0),
(2.0, 0.0),
(2.0, 1.0),
(2.0, f64::INFINITY),
(f64::INFINITY, -3.0),
(f64::INFINITY, 0.0),
(f64::INFINITY, 1.0),
(f64::INFINITY, f64::INFINITY),
(f64::NEG_INFINITY, f64::NAN),
(-1.0, f64::NAN),
(-0.0, f64::NAN),
(0.0, f64::NAN),
(2.0, f64::NAN),
(f64::INFINITY, f64::NAN),
(f64::NAN, -3.0),
(f64::NAN, 0.0),
(f64::NAN, 1.0),
(f64::NAN, f64::INFINITY),
(f64::NAN, f64::NAN),
];
let mut v: Vec<Complex<f64>> = INPUT.iter().map(|&(r, i)| Complex::new(r, i)).collect();
v.sort_by(|a, b| a.cmp_numpy(b));
assert_eq!(v.len(), SORTED.len());
for (k, (z, &(wr, wi))) in v.iter().zip(SORTED).enumerate() {
let same = |g: f64, w: f64| (g.is_nan() && w.is_nan()) || g == w;
assert!(
same(z.re, wr) && same(z.im, wi),
"position {k}: got {z:?}, NumPy says ({wr:?}, {wi:?})"
);
}
}
#[test]
fn complex_cmp_numpy_pairs() {
let _report = Report;
const CASES: &[((f64, f64), (f64, f64), i32)] = &[
((f64::NAN, f64::NAN), (f64::NAN, f64::NAN), 0),
((f64::NAN, f64::NAN), (f64::NAN, 1.0), 1),
((f64::NAN, f64::NAN), (1.0, f64::NAN), 1),
((f64::NAN, f64::NAN), (1.0, 1.0), 1),
((f64::NAN, f64::NAN), (1.0, 2.0), 1),
((f64::NAN, f64::NAN), (0.0, 5.0), 1),
((f64::NAN, f64::NAN), (f64::INFINITY, f64::NEG_INFINITY), 1),
((f64::NAN, f64::NAN), (f64::NEG_INFINITY, f64::NAN), 1),
((f64::NAN, f64::NAN), (2.0, 0.0), 1),
((f64::NAN, f64::NAN), (-0.0, 0.0), 1),
((f64::NAN, 1.0), (f64::NAN, f64::NAN), -1),
((f64::NAN, 1.0), (f64::NAN, 1.0), 0),
((f64::NAN, 1.0), (1.0, f64::NAN), 1),
((f64::NAN, 1.0), (1.0, 1.0), 1),
((f64::NAN, 1.0), (1.0, 2.0), 1),
((f64::NAN, 1.0), (0.0, 5.0), 1),
((f64::NAN, 1.0), (f64::INFINITY, f64::NEG_INFINITY), 1),
((f64::NAN, 1.0), (f64::NEG_INFINITY, f64::NAN), 1),
((f64::NAN, 1.0), (2.0, 0.0), 1),
((f64::NAN, 1.0), (-0.0, 0.0), 1),
((1.0, f64::NAN), (f64::NAN, f64::NAN), -1),
((1.0, f64::NAN), (f64::NAN, 1.0), -1),
((1.0, f64::NAN), (1.0, f64::NAN), 0),
((1.0, f64::NAN), (1.0, 1.0), 1),
((1.0, f64::NAN), (1.0, 2.0), 1),
((1.0, f64::NAN), (0.0, 5.0), 1),
((1.0, f64::NAN), (f64::INFINITY, f64::NEG_INFINITY), 1),
((1.0, f64::NAN), (f64::NEG_INFINITY, f64::NAN), 1),
((1.0, f64::NAN), (2.0, 0.0), 1),
((1.0, f64::NAN), (-0.0, 0.0), 1),
((1.0, 1.0), (f64::NAN, f64::NAN), -1),
((1.0, 1.0), (f64::NAN, 1.0), -1),
((1.0, 1.0), (1.0, f64::NAN), -1),
((1.0, 1.0), (1.0, 1.0), 0),
((1.0, 1.0), (1.0, 2.0), -1),
((1.0, 1.0), (0.0, 5.0), 1),
((1.0, 1.0), (f64::INFINITY, f64::NEG_INFINITY), -1),
((1.0, 1.0), (f64::NEG_INFINITY, f64::NAN), -1),
((1.0, 1.0), (2.0, 0.0), -1),
((1.0, 1.0), (-0.0, 0.0), 1),
((1.0, 2.0), (f64::NAN, f64::NAN), -1),
((1.0, 2.0), (f64::NAN, 1.0), -1),
((1.0, 2.0), (1.0, f64::NAN), -1),
((1.0, 2.0), (1.0, 1.0), 1),
((1.0, 2.0), (1.0, 2.0), 0),
((1.0, 2.0), (0.0, 5.0), 1),
((1.0, 2.0), (f64::INFINITY, f64::NEG_INFINITY), -1),
((1.0, 2.0), (f64::NEG_INFINITY, f64::NAN), -1),
((1.0, 2.0), (2.0, 0.0), -1),
((1.0, 2.0), (-0.0, 0.0), 1),
((0.0, 5.0), (f64::NAN, f64::NAN), -1),
((0.0, 5.0), (f64::NAN, 1.0), -1),
((0.0, 5.0), (1.0, f64::NAN), -1),
((0.0, 5.0), (1.0, 1.0), -1),
((0.0, 5.0), (1.0, 2.0), -1),
((0.0, 5.0), (0.0, 5.0), 0),
((0.0, 5.0), (f64::INFINITY, f64::NEG_INFINITY), -1),
((0.0, 5.0), (f64::NEG_INFINITY, f64::NAN), -1),
((0.0, 5.0), (2.0, 0.0), -1),
((0.0, 5.0), (-0.0, 0.0), 1),
((f64::INFINITY, f64::NEG_INFINITY), (f64::NAN, f64::NAN), -1),
((f64::INFINITY, f64::NEG_INFINITY), (f64::NAN, 1.0), -1),
((f64::INFINITY, f64::NEG_INFINITY), (1.0, f64::NAN), -1),
((f64::INFINITY, f64::NEG_INFINITY), (1.0, 1.0), 1),
((f64::INFINITY, f64::NEG_INFINITY), (1.0, 2.0), 1),
((f64::INFINITY, f64::NEG_INFINITY), (0.0, 5.0), 1),
(
(f64::INFINITY, f64::NEG_INFINITY),
(f64::INFINITY, f64::NEG_INFINITY),
0,
),
(
(f64::INFINITY, f64::NEG_INFINITY),
(f64::NEG_INFINITY, f64::NAN),
-1,
),
((f64::INFINITY, f64::NEG_INFINITY), (2.0, 0.0), 1),
((f64::INFINITY, f64::NEG_INFINITY), (-0.0, 0.0), 1),
((f64::NEG_INFINITY, f64::NAN), (f64::NAN, f64::NAN), -1),
((f64::NEG_INFINITY, f64::NAN), (f64::NAN, 1.0), -1),
((f64::NEG_INFINITY, f64::NAN), (1.0, f64::NAN), -1),
((f64::NEG_INFINITY, f64::NAN), (1.0, 1.0), 1),
((f64::NEG_INFINITY, f64::NAN), (1.0, 2.0), 1),
((f64::NEG_INFINITY, f64::NAN), (0.0, 5.0), 1),
(
(f64::NEG_INFINITY, f64::NAN),
(f64::INFINITY, f64::NEG_INFINITY),
1,
),
(
(f64::NEG_INFINITY, f64::NAN),
(f64::NEG_INFINITY, f64::NAN),
0,
),
((f64::NEG_INFINITY, f64::NAN), (2.0, 0.0), 1),
((f64::NEG_INFINITY, f64::NAN), (-0.0, 0.0), 1),
((2.0, 0.0), (f64::NAN, f64::NAN), -1),
((2.0, 0.0), (f64::NAN, 1.0), -1),
((2.0, 0.0), (1.0, f64::NAN), -1),
((2.0, 0.0), (1.0, 1.0), 1),
((2.0, 0.0), (1.0, 2.0), 1),
((2.0, 0.0), (0.0, 5.0), 1),
((2.0, 0.0), (f64::INFINITY, f64::NEG_INFINITY), -1),
((2.0, 0.0), (f64::NEG_INFINITY, f64::NAN), -1),
((2.0, 0.0), (2.0, 0.0), 0),
((2.0, 0.0), (-0.0, 0.0), 1),
((-0.0, 0.0), (f64::NAN, f64::NAN), -1),
((-0.0, 0.0), (f64::NAN, 1.0), -1),
((-0.0, 0.0), (1.0, f64::NAN), -1),
((-0.0, 0.0), (1.0, 1.0), -1),
((-0.0, 0.0), (1.0, 2.0), -1),
((-0.0, 0.0), (0.0, 5.0), -1),
((-0.0, 0.0), (f64::INFINITY, f64::NEG_INFINITY), -1),
((-0.0, 0.0), (f64::NEG_INFINITY, f64::NAN), -1),
((-0.0, 0.0), (2.0, 0.0), -1),
((-0.0, 0.0), (-0.0, 0.0), 0),
];
for &((ar, ai), (br, bi), want) in CASES {
let got = Complex::new(ar, ai).cmp_numpy(&Complex::new(br, bi)) as i32;
assert_eq!(got, want, "cmp_numpy(({ar:?}, {ai:?}), ({br:?}, {bi:?}))");
}
}