static void MAXABS_f32(const long long size, const byte* const __restrict__ recon, const byte* const __restrict__ orig, const int paramc, const double paramv [])
{
using type_f = float;
using type_i = int;
assert(sizeof(type_f) == sizeof(type_i));
if ((size % sizeof(type_f)) != 0) {fprintf(stderr, "ERROR: MAXABS_f32 requires data to be a multiple of %ld bytes long\n", sizeof(type_f)); throw std::runtime_error("LC error");}
if (paramc != 1) {fprintf(stderr, "ERROR: MAXABS_f32 requires one parameter that specifies the maximum allowed absolute error\n"); throw std::runtime_error("LC error");}
const type_f errorbound = paramv[0];
if (errorbound <= 0) {fprintf(stderr, "ERROR: MAXABS_f32 requires the maximum allowed absolute error to be greater than zero\n"); throw std::runtime_error("LC error");}
const type_f* const orig_f = (type_f*)orig;
const type_f* const recon_f = (type_f*)recon;
const long long len = size / sizeof(type_f);
for (long long i = 0; i < len; i++) {
if (!std::isfinite(orig_f[i]) || !std::isfinite(recon_f[i])) { if (recon_f[i] != orig_f[i]) {
if (!std::isnan(orig_f[i]) || !std::isnan(recon_f[i])) { fprintf(stderr, "MAXABS_f32 ERROR: absolute error bound exceeded due to NaN or INF at position %lld: value is '%.10f' vs '%.10f'\n\n", i, recon_f[i], orig_f[i]);
throw std::runtime_error("LC error");
}
}
} else {
const type_f lower = orig_f[i] - errorbound;
const type_f upper = orig_f[i] + errorbound;
if ((recon_f[i] < lower) || (recon_f[i] > upper) || (std::abs(orig_f[i] - recon_f[i]) > errorbound)) {
fprintf(stderr, "MAXABS_f32 ERROR: absolute error bound of %.10f exceeded at position %lld: value is '%.10f' vs '%.10f' (diff is '%.10f')\n\n", errorbound, i, recon_f[i], orig_f[i], std::abs(orig_f[i] - recon_f[i]));
throw std::runtime_error("LC error");
}
}
}
printf("MAXABS_f32 verification passed\n");
}