You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
27 lines
687 B
27 lines
687 B
#ifndef FAST_DIV_HEAVY_CL
|
|
#define FAST_DIV_HEAVY_CL
|
|
|
|
inline long fast_div_heavy(long _a, int _b)
|
|
{
|
|
long a = abs(_a);
|
|
int b = abs(_b);
|
|
|
|
float rcp = native_recip(convert_float_rte(b));
|
|
float rcp2 = as_float(as_uint(rcp) + (32U << 23));
|
|
|
|
ulong q1 = convert_ulong(convert_float_rte(as_int2(a).s1) * rcp2);
|
|
a -= q1 * as_uint(b);
|
|
|
|
float q2f = convert_float_rte(as_int2(a >> 12).s0) * rcp;
|
|
q2f = as_float(as_uint(q2f) + (12U << 23));
|
|
long q2 = convert_long_rte(q2f);
|
|
int a2 = as_int2(a).s0 - as_int2(q2).s0 * b;
|
|
|
|
int q3 = convert_int_rte(convert_float_rte(a2) * rcp);
|
|
q3 += (a2 - q3 * b) >> 31;
|
|
|
|
const long q = q1 + q2 + q3;
|
|
return ((as_int2(_a).s1 ^ _b) < 0) ? -q : q;
|
|
}
|
|
|
|
#endif
|
|
|