#! /usr/bin/gawk -f # Last edited on 2015-02-24 15:00:44 by stolfilocal function check_prices(fname,nlin,pop,plo,phi,pcl,vbt,vcr,pav, pavc,ploc,phic) { # Checks consistency of average, low, high, prices. # Uses global parameters {ulp_vbt,ulp_vcr,ulp_pav,ulp_phl}. if ((vcr == 0) != (vbt == 0)) { file_error(fname, nlin, ("inconsistent vbt = \"" vbt "\" vcr = \"" vcr "\"")); } if (vbt != 0) { if ((vbt < ulp_vbt) || (vcr < ulp_vcr)) { file_error(fname, nlin, ("too small vbt = \"" vbt "\" or vcr = \"" vcr "\"")); } pavc = vcr/vbt; # Computed average price. ploc = (vcr - 0.50001*ulp_vcr)/(vbt + 0.50001*ulp_vbt); # Min average price assuming worst rounding. phic = (vcr + 0.50001*ulp_vcr)/(vbt - 0.50001*ulp_vbt); # Max average price assuming worst rounding. if ((pavc - pav) > 0.500001*ulp_pav) { printf "%s:%s: !! average price inconsistent", fname, nlin > "/dev/stderr"; printf " is %.5f should be %.5f\n", pav, pavc > "/dev/stderr"; if ((phic < pav - 0.500001*ulp_pav) || (ploc > pav + 0.500001*ulp_pav)) { file_error(fname, nlin, ("excessive error")); } } if ((pavc < plo - 0.500001*ulp_phl) || (pavc > phi + 0.500001*ulp_phl)) { printf "%s:%s: !! average price out of lo-hi range", fname, nlin > "/dev/stderr"; printf " is %.5f should be in [%.5f _ %.5f]\n", pavc, plo, phi > "/dev/stderr"; if ((phic < plo - 0.500001*ulp_phl) || (ploc > phi + 0.500001*ulp_phl)) { file_error(fname, nlin, ("excessive overflow")); } } } }