Get absolute value efficiently
Hello everyone,
I was searching for a way to get absolute value efficiently using bit level hacks, n found it's int equivalent, but i wanted it on long long so changed int to long long,
Code:
#include <stdio.h>
#define CHAR_BIT 8
unsigned long long getAbs(long long n)
{
long long int const mask = n >> (sizeof(long long) * CHAR_BIT - 1);
return ((n + mask) ^ mask);
}
int main()
{
long long n = -6;
printf("Absoute value of %ll is %llu", n, getAbs(n)); //why the value of n is not printed....
getchar();
return 0;
}
if you don't profile it, you don't know what its 'efficiency' is
Quote:
Originally Posted by
greendragons
Im writing a program where efficiency is very important as im dealing with large numbers, so branching will lead to slow running time, and here comes the bit hack to rescue, mine long long abs works fine(what i didn't notice before), the problem is about printing %ll in printf, i am compiling with gcc C99...
Code:
#define _ISOC99_SOURCE
#include <stdio.h>
#include <stdlib.h>
#include <inttypes.h>
#include <sys/time.h>
#define CHAR_BIT 8
double t(void) {
struct timeval tx;
gettimeofday(&tx,0);
return (double)tx.tv_sec + ((double)tx.tv_usec / 1000000.0);
}
unsigned long long getAbs(long long n)
{
long long int const mask = n >> (sizeof(long long) * CHAR_BIT - 1);
return ((n + mask) ^ mask);
}
int main()
{
double t0;
double t1;
long long v = 100000000;
long long n;
unsigned long long u;
// use homebrew getAbs
n = -v;
t0 = t();
while(n < v) {
u = getAbs(n);
n++;
}
t1 = t();
printf("getAbs : %.6f\n",t1 - t0);
// use runtime library _abs64
n = -v;
t0 = t();
while(n < v) {
u = llabs(n);
n++;
}
t1 = t();
printf("llabs : %.6f\n",t1 - t0);
/*
timing results: getAbs >2x slower than built in llabs
getAbs : 1.265443
llabs : 0.547850
*/
return 0;
}
edit: similar result on Windows.