|
Interesting
But i can not imagine the reason of the code. Can you give the full scope of code? Thinking but nothing find about the code
|
|
|
|
|
A nice piece indeed.
Here is a slightly more defensive version that makes sure the sign is properly handled:
if (i < 0)
return 1 - abs(i);
else if (i == 0)
return 1;
else if (i > 0)
return 1 + abs(i);
(with the added benefit that out-of-range values are left unchanged)
modified 19-Jun-12 2:22am.
|
|
|
|
|
return (i < 0) ? (1 - abs(i)) : ((i == 0) ? 1 : 1 + abs(i));
Here. Shorter now, and less obvious to spot. The benefits of multiple ternaries
|
|
|
|
|
Right. This allows us to move the common constant in front and factor out the abs call:
return 1 + abs(i) * ((i < 0) ? - 1 : ((i == 0) ? 0 : + 1));
But how do we make the i > 0 case explicit ???
Maybe
return 1 + abs(i) * ((i < 0) ? - 1 : ((i == 0) ? 0 : ((i > 0) ? + 1 : abort(), 0)));
|
|
|
|
|
And even better, we can abstract away the "1", who knows, maybe its value will change somewhere in the future:
final int _CONST = 1;
return _CONST + abs(i) * ((i < 0) ? - _CONST : ((i == 0) ? 0 : ((i > 0) ? + _CONST : abort(), 0)));
Can I have that mind bleach now, please?
|
|
|
|
|
|
Hey but what about i being sqrt(2)???
|
|
|
|
|
Function will return sqrt(2) + 1
|
|
|
|
|
|
|
And for sqrt(-1/64) do we get indigestion tablets?
|
|
|
|
|
ASkoro wrote:
And for sqrt(-2)???? Computers ignore complexity. Or is that irrationality? I'm almost sure that's a complex number. If that is true, what is an irrational number? I know they both exist, but can't definitively define them.
|
|
|
|
|
I just tried your method, and my compiler is generating a error about a method must return a value, so I fixed it.
There is a version without bugs, hope it helps:
if (i < 0)
return 1 - abs(i);
else if (i == 0)
return 1;
else if (i > 0)
return 1 + abs(i);
|
|
|
|
|
Sorry, I fail to see how you fixed it. Computers aren't very good at determining there is an unreachable path. Put an unconditional return 1 - abs(i) + abs(i); after all the if statements should fix it. (Especially if i is uint. Checking for negative numbers is really interesting in that case.)
|
|
|
|
|
Came across this piece of solid-gold coding in Android the other day, in good old SurfaceFlinger.cpp:
if (mCurrentState.orientation != orientation) {
if (uint32_t(orientation)<=eOrientation270 || orientation==42) {
mCurrentState.orientationType = flags;
mCurrentState.orientation = orientation;
setTransactionFlags(eTransactionNeeded);
mTransactionCV.wait(mStateLock);
} else {
orientation = BAD_VALUE;
}
}
Sometimes I just don't know what to think any more.
+++DIVIDE BY CUCUMBER ERROR+++
|
|
|
|
|
Well, just hold your phone at 42 degrees .
And also, there were worse f'ups: (Steve Jobs "Don't hold it that way", anyone?) Actually, there were none
|
|
|
|
|
Guess the author is afraid of "AddWithZeroException"
|
|
|
|
|
I a very humble opinion, I think the original developer cared about performance.
There is a big and ugly monster living in or closes that will eat us if we write less performing code.
The problem is, that almost all developers don't understand about performance and do wrong things.
Here, I think he/she are trying to avoid a sum using a comparison. In some cases, like division, it will be a great code.
|
|
|
|
|
For the sake of learning here, why do some of the examples use the abs function in their answers. Why not just i++?
|
|
|
|
|
Rewritten:
return (i == 0) ? 1 : i++;
In division, specifically in the denominator, this code eliminates the divide by zero issue. I think the OP (original programmer) had good intentions.
|
|
|
|
|
Bug Alert. I think you meant perhaps:
return (i == 0) ? 1 : ++i;
|
|
|
|
|
Why not use i++? Obfuscation. The original coder was trying to obfuscate it by using an if statement, so people are running with that theme
We can program with only 1's, but if all you've got are zeros, you've got nothing.
|
|
|
|
|
MehGerbil wrote: Why not just i++? For one thing that would be the same as returning i. (Unless the i was passed with ref. Then you get two values for the price of one.)
MehGerbil wrote: For the sake of learning here That's rich. Trying to learn better coding by studying poor code harder.
|
|
|
|
|
The intent was to write: return i++;
KP Lee wrote: That's rich. Trying to learn better coding by studying poor code harder.
I think fixing bad code is a great way to learn, especially if you learn the "why" along the way.
|
|
|
|
|
It should be 'return i + 1'. ++i is a wasteful update of the variable i, assuming it's local (there's some serious issues if it isn't anyway), and i++ is just wrong because it returns i (before the statement) and not i + 1.
|
|
|
|