Path: csiph.com!eternal-september.org!feeder.eternal-september.org!reader01.eternal-september.org!.POSTED!not-for-mail From: Ben Bacarisse Newsgroups: comp.lang.c Subject: Re: Bart, a tcc "issue" Date: Sun, 10 Nov 2019 03:04:57 +0000 Organization: A noiseless patient Spider Lines: 47 Message-ID: <87mud42zza.fsf@bsb.me.uk> References: <86k189ejbd.fsf@linuxsc.com> <87sgmw3ajx.fsf@bsb.me.uk> Mime-Version: 1.0 Content-Type: text/plain Injection-Info: reader02.eternal-september.org; posting-host="a6f2659544a53531bdb2ad125aac83f7"; logging-data="21625"; mail-complaints-to="abuse@eternal-september.org"; posting-account="U2FsdGVkX18GqJNoxQ6YNNMoqwCJMS4Twx/yOFdQPPg=" Cancel-Lock: sha1:pkcplGfjNfvXfll3baK4+OkIQVc= sha1:5YTg93iGFC08IDOlerFtwQKSP1w= X-BSB-Auth: 1.1e4803b45154c7bbd8de.20191110030457GMT.87mud42zza.fsf@bsb.me.uk Xref: csiph.com comp.lang.c:147865 Richard Damon writes: > On 11/9/19 6:16 PM, Ben Bacarisse wrote: >> Tim Rentsch writes: >> >>> It's interesting -- three different people posted corrections or >>> improvements to the uniform interval code, and all of the revisions >>> have been a little bit off in one way or another. Care is needed to >>> deal with edge cases correctly. >>> >>> int >>> uniform_less_than( unsigned k ){ >>> unsigned d, r; >>> >>> if( k-1 > RAND_MAX || k == 0 ) oops_someone_messed_up(); >>> >>> d = (RAND_MAX - (k-1)) / k + 1; >>> do r = rand()/d; while( r >= k ); >>> >>> return r; >>> } >>> >>> int >>> uniform_on_closed_interval( int a, int b ){ >>> if( a > b ) return uniform_on_closed_interval( b, a ); >>> >>> return a + uniform_less_than( b + 1u - a ); >>> } >>> >>> A good test for a uniform closed-interval RNG is to check that >>> it handles the interval 0..RAND_MAX, including both endpoints, >>> correctly. >> >> Are you considering edge cases in the C standard? If so, one of those >> has RAND_MAX == UINT_MAX. > > Since rand() returns an int, the only way for RAND_MAX to be UINT_MAX is > if UINT_MAX == INT_MAX (which generally means a Signed-Magnitude machine > or some other odd architecture). And yes, if you want to deal with that > sort of machine a lot of care needs to be taken, as a lot of things we > often take for granted aren't true, like that an unsigned can count the > number of values between any two signed numbers!! Yes, it's a gruesome corner case for some types of code. -- Ben.