static void PSNR_f32(const long long size, const byte* const __restrict__ recon, const byte* const __restrict__ orig, const int paramc, const double paramv [])
{
using type = float;
if ((size % sizeof(type)) != 0) {fprintf(stderr, "ERROR: PSNR_f32 requires data to be a multiple of %ld bytes long\n", sizeof(type)); throw std::runtime_error("LC error");}
if (paramc != 1) {fprintf(stderr, "ERROR: PSNR_f32 requires one parameter that specifies the minimum allowed peak signal to noise ratio\n"); throw std::runtime_error("LC error");}
const type* const orig_t = (type*)orig;
const type* const recon_t = (type*)recon;
const long long len = size / sizeof(type);
const type errorbound = paramv[0];
double mse = 0;
type inmin = orig_t[0];
type inmax = orig_t[0];
for (long long i = 0; i < len; i++) {
const type diff = recon_t[i] - orig_t[i];
mse += diff * diff;
inmin = std::min(inmin, orig_t[i]);
inmax = std::max(inmax, orig_t[i]);
}
mse /= len;
if (mse != 0) {
type psnr = (inmax == inmin) ? -std::numeric_limits<type>::infinity() : (20 * log10(inmax - inmin) - 10 * log10(mse));
if (psnr < errorbound) {fprintf(stderr, "PSNR_f32 ERROR: decoded data's PSNR of %f does not meet minimum allowed value of %f\n\n", psnr, errorbound); throw std::runtime_error("LC error");}
}
printf("PSNR_f32 verification passed\n");
}