"Olson, Arthur David (NIH/NCI)" <olsona@dc37a.nci.nih.gov> writes:
+ #define C99IPMOD(a, b) ((-1 % 2 < 0 || (a) >= 0) ? \ + ((a) % (b)) : ((a) % (b) - (b)))
A quick reaction: this returns the wrong answer if -1%2 is 1 and a%b is zero. But see below.
+ #define isleap_sum(a, b) isleap(C99IPMOD((a), 400) + C99IPMOD((b), 400))
Surely this is overkill. You can simply use this: #define isleap_sum(a, b) isleap((a) % 400 + (b) % 400) as this will work regardless of whether % means Fortran remainder or modulus.
! year = (double) timeptr->tm_year + (double) TM_YEAR_BASE;
This sort of trick won't work in general on hosts that have 64-bit int and 64-bit double (e.g., some Crays), due to rounding problems.
+ i = a + b; + if ((i > a) == (b > 0))
This kind of overflow-checking won't work reliably in general, since the behavior is undefined if signed integer overflow occurs. I have run into compilers where the above code won't detect overflow correctly. I have a draft solution for the above problems but would like to think about it for a day or so before posting.