I think there are faster methods for doing an on/off.
$value = (1 - $value);
or better:
$value = (1 ^ $value); // which uses the xor function.
Below are the benchs on my computer, for loop of 10,000,000 with PHP Version 5.2.1
$value = abs($value -1); // 4.12641406059 sec
$value = (1 - $value); // 1.58847904205 sec
$value = (1 ^ $value); // 1.49518704414 sec
Note that using function call for such operation is very slow.
function on_off($value) {
return (1 ^ $value);
} // 7.10739612579 sec
abs
(PHP 4, PHP 5)
abs — Absolute value
Parameters
- number
-
The numeric value to process
Return Values
The absoulte value of number . If the argument number is of type float, the return type is also float, otherwise it is integer (as float usually has a bigger value range than integer).
Examples
Example #1 abs() example
<?php
$abs = abs(-4.2); // $abs = 4.2; (double/float)
$abs2 = abs(5); // $abs2 = 5; (integer)
$abs3 = abs(-5); // $abs3 = 5; (integer)
?>
abs
zyphos at zyphos dot be
18-Jun-2008 10:15
18-Jun-2008 10:15
olivierlabbe at votreespace dot net
11-Jun-2008 08:35
11-Jun-2008 08:35
making an on/off switch with 0 and 1
function on_off($value) {
return abs($value -1);
}
if you send 0, it'll return 1, and 1 return 0.
0 - 1 = -1, absolute of -1 = 1
1 - 1 = 0, absolute of 0 = 0
estoesunapija at hotmail dot com
26-Mar-2008 11:29
26-Mar-2008 11:29
//Not for working with float
//anyways, seems cool for integers
//This works, iff is_int($num)
function nabs ($num=NULL){
$num = (int)$num;
if ($num<=0) return 0; //why bother bit flipping with 0
return ~$num + 1;
}
thomas at tgohome dot com
30-Dec-2007 12:00
30-Dec-2007 12:00
If we want to into a war about speed with negative absolute numbers, I think bitwise operations should just about do it.
<?php
function n_abs($v) { return ~abs($v) + 1; }
?>
A NOT operation on any number with a sign bit will produce the negative of that number minus one. All we need to do is add one. Voila!
Speed test results (30000 iterations of various methods) produced very close dueling between the previous suggested method. Although I am on an overloaded Windows PC so I'm no benchmark, and I'll leave it up to you, the reader of this message.
Josh
08-Jan-2006 01:06
08-Jan-2006 01:06
Let's say you are resizing images to a standard size that can be expressed as a ratio (width/height). The problem I came into was that I wanted to be reasonable with the proportion of the images that my customer is uploading (couldn't we all use a little less horizontal on pictures?), but I wanted to reject the horizontal pictures when they were uploading vertical ones. So I wanted to accept proportions of images that were within a reasonable threshold (+ or -) of what I will be resizing them to.
Assuming a standard of 1 to 4 (0.25) and a threshold of no more than 0.05 deviation, then the number 0.30 and 0.20 would return true and 0.19 would return false.
<?php
function threshold($given,$thresh,$standard)
{
return (abs($given-$standard)<=$thresh) ? true : false;
}
?>
jeremys at hang dash wire dot com
12-Dec-2005 05:05
12-Dec-2005 05:05
I'm unable to replicate concordia's problem with the $n = $n - $n * 2 code. I agree with the simplification to $n *= -1. But there's no reason that concordia's code should return 6 for the value -2, and it doesn't appear to. When I tried it, PHP returned 2, as it should. If PHP were somehow flipping the sign of integers randomly, that would be a *major* bug!
There doesn't seem to be a sgn() function yet. Here's some quick code to do it:
function sgn($x) {
return $x ? ($x>0 ? 1 : -1) : 0;
}
You could use $x ? abs($x)/$x : 0 too, but might as well avoid the float division.
Lazarus
12-Dec-2005 03:53
12-Dec-2005 03:53
Even that is unnecessarily complex. Try this:
<?php
function n_abs($v) { return -abs($v) ; }
?>
Faster too.
rdk
10-Nov-2005 08:04
10-Nov-2005 08:04
concordia, you seem to be overcomplicating matters. If you want to do the reverse of the abs function, the only code required is:
<?php
function n_abs($num) {
return ($num > 0) ? $num * -1 : $num;
}
n_abs(2); //-2
n_abs(-2); //-2
?>
If you want to switch the sign bit of a number, as your example seems to indicate...
turn_neg (2); // -2
turn_neg (-2); // 2
...you just need to do $num *= -1;
Your function also doesn't seem to work. Switching "if (is_neg ($num))" to "if (!is_neg ($num))" would make it function as indicated by your comments (i.e. toggle the sign bit), but it would still be overly complicated.
concordia at game dot xakep dot org
06-Nov-2005 10:35
06-Nov-2005 10:35
Sometimes you may want to do the opposite of abs(): turn a positive number into a negative.
<?php
function turn_neg ($num) {
return $num - $num * 2;
}
?>
But this can create errors when you put a negative number inside...
turn_neg (-2) returns 6.
<?php
turn_neg (-2); // 6.
?>
The solution is to make another function to determine if the number is negative or not.
<?php
function is_neg ($num) {
return $num < 0;
}
function turn_neg ($num) {
if (is_neg ($num)) {
return $num - $num * 2;
} else {
return abs ($num);
}
}
turn_neg (2); // -2
turn_neg (-2); // 2
?>
Or, if the number is not negative, you could also return false.
alreece45 at yahoo dot com
10-Aug-2005 09:05
10-Aug-2005 09:05
Both of the below codes were wrong.
<?php
// Check to see if $range is numberic, if not, set it to the integer value 1
if(!is_numeric($range)) {
$range=1;
}
// Check to see if $range is an integer and not a float. Use is_int() and not int().
if(!is_int($range)) {
// Make it an integer. Use intval() here, not int_val.
$range=intval($range);
}
$range=abs($range);
?>
The only thing I don't get is why we have to check before doing the functions. Whether or not we do the functions it will give us what we want. The only check I really understand being there is the one that sets it to one.
Why not just do:
<?php
// If $range is numberic, make it in positive integer, otherwise, make it one.
$range = is_numeric($range) ? abs(intval($range)) : 1;
?>
Seems like a lot less code. Or If you prefer to stay with if statements:
<?php
if(is_numberic($range)) {
// If $range is numberic, make it in positive integer.
$range = abs(intval($range));
}
else {
//otherwise, make it one.
$range = 1;
}
?>
Both ways seem smaller to me.
abodeman at y a h o o
25-May-2004 02:59
25-May-2004 02:59
There's another problem in the below code. The correct function to see whether a value is an integer is is_int(), not int(), so the code should look like this:
<?php
if(!is_numeric($range))//checks for numeric input
{
$range=1;
}//sets $range to integer 1 if input is anything other than a numeric value
if(!is_int($range))//checks to make sure it is an integer (not decimal)
{
$range=int_val($range);
}//if a decimal- sets $range to integer value
$range=abs($range);//sets value to positive whole number
?>
mbender at duforu dot com
01-Mar-2004 10:59
01-Mar-2004 10:59
In reference to the previous code sample the int_val function is actually intval() [http://us4.php.net/manual/en/function.intval.php]:
<?php
if(!is_numeric($range))//checks for numeric input
{
$range=1;
} //sets $range to integer 1 if input is anything other than a numeric value
if(!int($range))//checks to make sure it is an integer (not decimal)
{
$range=intval($range) // not -> int_val($range);
}//if a decimal- sets $range to integer value
$range=abs($range);//sets value to positive whole number
?>
bgustin AT trukfixer DOT com
16-Jul-2003 05:50
16-Jul-2003 05:50
assume we take user input from a form untreated and assign it to variable $range. We want to be sure this number is a Positive Whole number, since abs() just sets a number to positive or 0, and we dont want decimals...
<?php
if(!is_numeric($range))//checks for numeric input
{
$range=1;
}//sets $range to integer 1 if input is anything other than a numeric value
if(!int($range))//checks to make sure it is an integer (not decimal)
{
$range=int_val($range);
}//if a decimal- sets $range to integer value
$range=abs($range);//sets value to positive whole number
?>
for example the input "testing" would return $range =1,
the input "3.578" would return value=3
If the input is null, I am havent tested to see if it gets set to 1 courtesy of int_val or not, but I believe it will be.
I'm sure there's probably a more elegant way to do this using regex, however for an apprentice php coder, this might be a little easier to understand and use.
