История изменений
Исправление kaldeon, (текущая версия) :
Без проблем. Но это как раз тот случай, когда деталей накопилось слишком много и хелпер обретает смысл. Не из-за того, что любая операция, обёрнутая в функцию, автоматически становится лучше. «Мы не одинаковы.»
#include <u.h>
#include <libc.h>
s32int
midpoint(s32int foo, s32int bar)
{
if (!(bar > 0 && foo > INT32_MAX - bar) && !(bar < 0 && foo < INT32_MIN - bar))
return (foo + bar) / 2;
else if (!(foo < 0 && bar > INT32_MAX + foo) && !(foo > 0 && bar < INT32_MIN + foo))
return foo + (bar - foo) / 2;
else
return bar + (foo - bar) / 2;
}
void
main(void)
{
print("%d\n", midpoint(-2000000000, -2000000000));
print("%d\n", midpoint(-2000000000, +2000000000));
print("%d\n", midpoint(+2000000000, -2000000000));
print("%d\n", midpoint(+2000000000, +2000000000));
exits(0);
}
% 9c test.c && 9l test.o && ./a.out
-2000000000
0
0
2000000000
%
Исходная версия kaldeon, :
Без проблем. Но это как раз тот случай, когда деталей накопилось слишком много и хелпер обретает смысл. Не из-за того, что любая операция, обёрнутая в функцию, автоматически становится лучше. «Мы не одинаковы.»
#include <u.h>
#include <libc.h>
s32int
midpoint(s32int foo, s32int bar)
{
if (!(bar > 0 && foo > INT32_MAX - bar) && !(bar < 0 && foo < INT32_MIN - bar))
return (foo + bar) / 2;
else if (!(foo < 0 && bar > INT32_MAX + foo) && !(foo > 0 && bar < INT32_MIN + foo))
return foo + (bar - foo) / 2;
else
return bar + (foo - bar) / 2;
}
void
main(void)
{
print("%d\n", midpoint(-2000000000, -2000000000));
print("%d\n", midpoint(-2000000000, +2000000000));
print("%d\n", midpoint(+2000000000, -2000000000));
print("%d\n", midpoint(+2000000000, +2000000000));
exits(0);
}
9c test.c && 9l test.o && ./a.out