xref: /plan9/sys/src/libc/port/muldiv.c (revision 80ee5cbfe36716af62da8896207e9763b8e3d760)
159cc4ca5SDavid du Colombier #include <u.h>
259cc4ca5SDavid du Colombier #include <libc.h>
359cc4ca5SDavid du Colombier 
459cc4ca5SDavid du Colombier ulong
umuldiv(ulong a,ulong b,ulong c)559cc4ca5SDavid du Colombier umuldiv(ulong a, ulong b, ulong c)
659cc4ca5SDavid du Colombier {
7*80ee5cbfSDavid du Colombier 	double d;
8*80ee5cbfSDavid du Colombier 
9*80ee5cbfSDavid du Colombier 	d = ((double)a * (double)b) / (double)c;
10*80ee5cbfSDavid du Colombier 	if(d >= 4294967296.)
11*80ee5cbfSDavid du Colombier 		abort();
12*80ee5cbfSDavid du Colombier 	return d;
1359cc4ca5SDavid du Colombier }
1459cc4ca5SDavid du Colombier 
1559cc4ca5SDavid du Colombier long
muldiv(long a,long b,long c)1659cc4ca5SDavid du Colombier muldiv(long a, long b, long c)
1759cc4ca5SDavid du Colombier {
1859cc4ca5SDavid du Colombier 	int s;
1959cc4ca5SDavid du Colombier 	long v;
2059cc4ca5SDavid du Colombier 
2159cc4ca5SDavid du Colombier 	s = 0;
2259cc4ca5SDavid du Colombier 	if(a < 0) {
2359cc4ca5SDavid du Colombier 		s = !s;
2459cc4ca5SDavid du Colombier 		a = -a;
2559cc4ca5SDavid du Colombier 	}
2659cc4ca5SDavid du Colombier 	if(b < 0) {
2759cc4ca5SDavid du Colombier 		s = !s;
2859cc4ca5SDavid du Colombier 		b = -b;
2959cc4ca5SDavid du Colombier 	}
3059cc4ca5SDavid du Colombier 	if(c < 0) {
3159cc4ca5SDavid du Colombier 		s = !s;
3259cc4ca5SDavid du Colombier 		c = -c;
3359cc4ca5SDavid du Colombier 	}
3459cc4ca5SDavid du Colombier 	v = umuldiv(a, b, c);
3559cc4ca5SDavid du Colombier 	if(s)
3659cc4ca5SDavid du Colombier 		v = -v;
3759cc4ca5SDavid du Colombier 	return v;
3859cc4ca5SDavid du Colombier }
39