get absolute value without using abs function nor if statement
From Bit Twiddling Hacks:
int v; // we want to find the absolute value of v
unsigned int r; // the result goes here
int const mask = v >> sizeof(int) * CHAR_BIT - 1;
r = (v + mask) ^ mask;
How do I get the absolute value of an integer without using Math.abs?
You can use the conditional operator and the unary negation operator:
function absVal(integer) {
return integer < 0 ? -integer : integer;
}
Finding absolute value of a number without using Math.abs()
If you look inside Math.abs you can probably find the best answer:
Eg, for floats:
/*
* Returns the absolute value of a {@code float} value.
* If the argument is not negative, the argument is returned.
* If the argument is negative, the negation of the argument is returned.
* Special cases:
* <ul><li>If the argument is positive zero or negative zero, the
* result is positive zero.
* <li>If the argument is infinite, the result is positive infinity.
* <li>If the argument is NaN, the result is NaN.</ul>
* In other words, the result is the same as the value of the expression:
* <p>{@code Float.intBitsToFloat(0x7fffffff & Float.floatToIntBits(a))}
*
* @param a the argument whose absolute value is to be determined
* @return the absolute value of the argument.
*/
public static float abs(float a) {
return (a <= 0.0F) ? 0.0F - a : a;
}
How to write absolute value in c
The shortest solution in your first piece of code is to change the printf
statement as follows:
printf("absValue = %u\n", (unsigned)((u<0)?-u:u));
This will print the absolute value of u
. The type conversion (unsigned)
ensures that the data type is as expected by printf
. The statement (u<0)?-u:u
uses the conditional operator to select the value -u
if the condition (u<0
) is true and u
if the condition is false (i.e. u>=0
).
The problem in your code is that u
is a signed integer which means its value is stored using the Two's complement representation in 4 bytes(*) and printf
is not intelligent. When you tell printf
to display an unsigned integer, then printf
will take the 4 bytes holding u
and interpret them as an unsigned integer. Since negative numbers in Two's complement are stored as large positive integers, that is the result you see.
(*) The use of Two's complement and the int
size of 4 is machine-dependent, but common.
Which is the fastest way to get the absolute value of a number
Conditionals are slower than plain arithmetic operations, but much, much faster than something as silly as calculating the square root.
Rules of thumb from my assembly days:
- Integer or bitwise op: 1 cycle
- Floating-point add/sub/mul: 4 cycles
- Floating-point div: ~30 cycles
- Floating-point exponentiation: ~200 cycles
- Floating-point sqrt: ~60 cycles depending on implementation
- Conditional branch: avg. 10 cycles, better if well-predicted, much worse if mispredicted
Related Topics
C++ Static Template Member, One Instance for Each Template Type
Rdrand and Rdseed Intrinsics on Various Compilers
Static Member Access in Constant Expressions
Why Is F(I = -1, I = -1) Undefined Behavior
Detect Windows or Linux in C, C++
Why Is 'Std::Initializer_List' Often Passed by Value
Call Base Class Method from Derived Class Object
Taking Input of a String Word by Word
Translating Python Dictionary to C++
Write Concurrently Vector<Bool>
C++ Using Class Method as a Function Pointer Type
Load the Same Dll Multiple Times
How to Print to Console When Using Qt
Generating a Normal Map from a Height Map
Obtain a Std::Ostream Either from Std::Cout or Std::Ofstream(File)