svn commit: r340664 - head/sys/sys

Mark Millard marklmi at yahoo.com
Tue Nov 20 18:47:08 UTC 2018


Warner Losh imp at FreeBSD.org wrote on
Tue Nov 20 07:11:24 UTC 2018 :

> Instead, used fixed constants because there's no way to say ceil(X)
> for integer math. . . .

For a ratio of unsigned integers, with 0<y:

What of:  ceil_x_div_y(x,y) == (x/y) + (x%y==0 ? 0 : 1)

Code illustration with the ratios that produced the
magic constants . . .

# more ceil_x_div_y.c 
#include <stdio.h>

// ceil_x_div_y(x,y), given 0<y
// post condition: x <= ceil_x_div_y(x,y)*y < x+y
// note:        x-y < (x/y)*y <= x, no ceil involved
// splits into: x-y < (x/y)*y < x    || (x/y)*y == x
// so:          x < (x/y+1)*y) < x+y || (x/y)*y == x
//
// sufficient for: x==2**63 && (y==1000000 || y==1000000000):

unsigned long long ceil_x_div_y(unsigned long long x, unsigned long long y)
{
    return (x/y) + (x%y==0 ? 0 : 1);
}

int main ()
{
    printf("ceil(%llu / %llu) == %llu\n", 1ULL<<63, 1000000000ULL, ceil_x_div_y(1ULL<<63, 1000000000ULL));
    printf("ceil(%llu / %llu) == %llu\n", 1ULL<<63,    1000000ULL, ceil_x_div_y(1ULL<<63,    1000000ULL));
    return 0;
}

# ./a.out
ceil(9223372036854775808 / 1000000000) == 9223372037
ceil(9223372036854775808 / 1000000) == 9223372036855


I used unsigned long long for a simple illustration, not
because I expect the FreeBSD code should use that type.


===
Mark Millard
marklmi at yahoo.com
( dsl-only.net went
away in early 2018-Mar)



More information about the svn-src-head mailing list