use super::*;
use f2rust_std::*;
pub fn F_ZZDM(OK: &mut bool, ctx: &mut Context) -> f2rust_std::Result<()> {
let mut A: f64 = 0.0;
let mut B: f64 = 0.0;
let mut DENOM: f64 = 0.0;
let mut DIV: f64 = 0.0;
let mut LOGVAL: f64 = 0.0;
let mut MULT: f64 = 0.0;
let mut MULTX: f64 = 0.0;
let mut NUMR: f64 = 0.0;
let mut EXPNT: f64 = 0.0;
let mut SEED: i32 = 0;
let mut CONT: bool = false;
testutil::TOPEN(b"F_ZZDM", ctx)?;
SEED = -6273618;
EXPNT = (((f64::log10(spicelib::DPMAX()) as i32) as f64) - 1.0);
testutil::TCASE(b"Safe division check.", ctx)?;
NUMR = 1.0;
DENOM = 10.0;
DIV = spicelib::ZZDIV(NUMR, DENOM, ctx)?;
testutil::CHCKXC(false, b" ", OK, ctx)?;
testutil::CHCKSD(b"ZZDIV 1/10", DIV, b"~", 0.1, 0.000000000001, OK, ctx)?;
testutil::TCASE(b"Underflow division check.", ctx)?;
NUMR = 0.00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001;
DENOM = 100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000.0;
DIV = spicelib::ZZDIV(NUMR, DENOM, ctx)?;
testutil::CHCKXC(false, b" ", OK, ctx)?;
testutil::CHCKSD(b"ZZDIV 1D-400", DIV, b"=", 0.0, 0.0, OK, ctx)?;
testutil::TCASE(b"Overflow division check.", ctx)?;
NUMR = spicelib::DPMAX();
DENOM = 1.0;
DIV = spicelib::ZZDIV(NUMR, DENOM, ctx)?;
testutil::CHCKXC(true, b"SPICE(NUMERICOVERFLOW)", OK, ctx)?;
testutil::CHCKSD(b"ZZDIV DPMAX/1", DIV, b"=", 0.0, 0.0, OK, ctx)?;
testutil::TCASE(b"1/0 division check.", ctx)?;
NUMR = 1.0;
DENOM = 0.0;
DIV = spicelib::ZZDIV(NUMR, DENOM, ctx)?;
testutil::CHCKXC(true, b"SPICE(DIVIDEBYZERO)", OK, ctx)?;
testutil::CHCKSD(b"ZZDIV 1/0", DIV, b"=", 0.0, 0.0, OK, ctx)?;
testutil::TCASE(b"0/0 division check.", ctx)?;
NUMR = 0.0;
DENOM = 0.0;
DIV = spicelib::ZZDIV(NUMR, DENOM, ctx)?;
testutil::CHCKXC(true, b"SPICE(DIVIDEBYZERO)", OK, ctx)?;
testutil::CHCKSD(b"ZZDIV 0/0", DIV, b"=", 0.0, 0.0, OK, ctx)?;
testutil::TCASE(b"Safe multiplication check.", ctx)?;
A = 2.0;
B = 10.0;
MULT = spicelib::ZZMULT(A, B, ctx)?;
testutil::CHCKXC(false, b" ", OK, ctx)?;
testutil::CHCKSD(b"ZZMULT 2*10", MULT, b"~", 20.0, 0.000000000001, OK, ctx)?;
testutil::TCASE(b"A numeric overflow event (1).", ctx)?;
A = 1.0;
B = spicelib::DPMAX();
MULT = spicelib::ZZMULT(A, B, ctx)?;
testutil::CHCKXC(true, b"SPICE(NUMERICOVERFLOW)", OK, ctx)?;
testutil::CHCKSD(
b"ZZMULT overflow (1)",
MULT,
b"=",
0.0,
0.000000000001,
OK,
ctx,
)?;
testutil::TCASE(b"A numeric overflow event (2).", ctx)?;
A = 10000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000.0;
B = 10000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000.0;
MULT = spicelib::ZZMULT(A, B, ctx)?;
testutil::CHCKXC(true, b"SPICE(NUMERICOVERFLOW)", OK, ctx)?;
testutil::CHCKSD(
b"ZZMULT overflow (2)",
MULT,
b"=",
0.0,
0.000000000001,
OK,
ctx,
)?;
testutil::TCASE(b"Zero multiplication check (1).", ctx)?;
A = 0.0;
B = 10.0;
MULT = spicelib::ZZMULT(A, B, ctx)?;
testutil::CHCKXC(false, b" ", OK, ctx)?;
testutil::CHCKSD(b"ZZMULT zero (1)", MULT, b"=", 0.0, 0.000000000001, OK, ctx)?;
testutil::TCASE(b"Zero multiplication check (2).", ctx)?;
A = 10.0;
B = 0.0;
MULT = spicelib::ZZMULT(A, B, ctx)?;
testutil::CHCKXC(false, b" ", OK, ctx)?;
testutil::CHCKSD(b"ZZMULT zero (2)", MULT, b"=", 0.0, 0.000000000001, OK, ctx)?;
testutil::TCASE(b"Zero multiplication check (3).", ctx)?;
A = 0.0;
B = 0.0;
MULT = spicelib::ZZMULT(A, B, ctx)?;
testutil::CHCKXC(false, b" ", OK, ctx)?;
testutil::CHCKSD(b"ZZMULT zero (3)", MULT, b"=", 0.0, 0.000000000001, OK, ctx)?;
testutil::TCASE(b"Random multiplication check.", ctx)?;
for I in 1..=5000 {
A = f64::powf(10.0, testutil::T_RANDD(-EXPNT, EXPNT, &mut SEED, ctx)?);
B = f64::powf(10.0, testutil::T_RANDD(-EXPNT, EXPNT, &mut SEED, ctx)?);
CONT = false;
LOGVAL = (f64::log10(f64::abs(A)) + f64::log10(f64::abs(B)));
CONT = ((LOGVAL < EXPNT) && (LOGVAL > -EXPNT));
if CONT {
MULT = spicelib::ZZMULT(A, B, ctx)?;
testutil::CHCKXC(false, b" ", OK, ctx)?;
MULTX = (A * B);
testutil::CHCKSD(
b"Random multiplication",
MULT,
b"=",
MULTX,
0.000000000001,
OK,
ctx,
)?;
}
}
testutil::TCASE(b"Random division check.", ctx)?;
for I in 1..=5000 {
NUMR = f64::powf(10.0, testutil::T_RANDD(-EXPNT, EXPNT, &mut SEED, ctx)?);
DENOM = f64::powf(10.0, testutil::T_RANDD(-EXPNT, EXPNT, &mut SEED, ctx)?);
CONT = false;
LOGVAL = (f64::log10(f64::abs(NUMR)) - f64::log10(f64::abs(DENOM)));
CONT = (((LOGVAL < EXPNT) && (LOGVAL > -EXPNT)) && (DENOM != 0.0));
if CONT {
DIV = spicelib::ZZDIV(NUMR, DENOM, ctx)?;
testutil::CHCKXC(false, b" ", OK, ctx)?;
MULTX = (NUMR / DENOM);
testutil::CHCKSD(
b"Random division",
DIV,
b"=",
MULTX,
0.000000000001,
OK,
ctx,
)?;
}
}
testutil::T_SUCCESS(OK, ctx);
Ok(())
}