Join Now

Hvordan sammenligner man noget - næsten - ens?

by Occasional Contributor jmic_nyk on ‎05-11-2016 08:56 AM (373 Views)

Hvordan sammenligner man noget næsten ens, altså et " almost = "  -evt. med en tolerance?

 

Aktuelt har jeg to timestamps fra to tabeller, som er en del af en større join betingelse. De to timestamps stammer (ssv.) fra samme transaktion, men med nogle få mikro/nano sekunders forskel.

 

Er der en funktion eller noget man kan anvende således at "a.tms almost eq b.tms" - evt med en eller anden tolerance (gælder inden for 0.5% afvigelse eller hvad ved jeg).

 

 

Der må være en nemmere metode end at "klippe decimaler" i  de to timestamps.

Comments
by SAS Employee AllanLassen
on ‎05-20-2016 05:20 AM

Hej Jmic_nyk,

 

Glimrende spørgsmål, og et spørgsmål som jeg forhåbentlig kan hjælpe dig med!

 

Mit forslag til en løsning, kunne være at du forsøger at kigge på den "absolutte" forskel mellem de to timestamps, og selv definerer en passende tærskelværdi. Absolut skal i øvrigt her forstås som den matematiske funktion der fjerner et eventuelt fortegn.

 

Så mit forslag til en formel for "a.tms almost eq b.tms" ville se sådan her ud (hvor tau skal erstattes med din egen tærskelværdi der giver det ønskede resultat):

abs( a.tms - b.tms ) < tau

 

Jeg har prøvet at skrive lidt kode nedenfor som dels pakker formlen ind i en SAS-funktion (skrevet med proc fcmp), og som viser resultatet af sammenligningen:

 

proc fcmp outlib=work.functions.diff;
	function abs_diff(val1, val2);
		return ( abs(val1-val2) );
	endsub;
run;

options cmplib=(work.functions);

data a;
	a = 1 + 2e-8;
	b = 1 + 4e-8;

	c = abs_diff(a,b);

	compare_equal = ( abs_diff(a,b) < 5e8 );
run;

 

Jeg håber det svarede på dit spørgsmål!

by Occasional Contributor jmic_nyk
on ‎05-20-2016 07:46 AM
Det er et godt bud - og det skal da prøves.