Returns the order of magnitude of one or more numbers. Works on arrays. You can also specify the number base.
order( 1.2e-5 ) %returns -5
order(1) = 0
order( 1.12344e8 ) %returns 8
%Specify base 2:
order(1.2*2^5,2) %returns 5
If you input at the command line:
log(1000)./log(10) - 3
you will see why the original fails at this value. It also fails and a number of other (positive) powers of 10 as shown by the following:
b = -100:100
for q = 1:length(b)
a(q) = order(10^b(q));
plot(b, a, 'kx', b, b, 'ro')
If the black 'x' is not inside a red 'o' then it's a failure.
No failures of negative powers in this range.
Now tested with vector:
>> floor(single(log([1000 100 1000 10000 100])./log(10)))
3 2 3 4 2
Joel, I seem to experience the same problem when the input is an exact integer value. I think this will be a problem when the input is a whole power of the base. I am not sure yet how this shuold be solved, one would have to do a test on the input to detect if it is a whole power of the base within numerical precision
I seem to experience a severe precision error using this function. I get order(1000) = 2. order(1000.000000000001) gives me the correct value of 3.
I see what you're doing and it makes sense, thanks for the reply!
Thanks John. But I think one should leave the order of magnitude of 0 to be minus infinity, that`s just what it is. If you set it to zero, consider this:
o = order(x);
x2 and x should then be the same, but they won`t be if you set the order to 0. x2 would then be 1.
added the following to the bottom:
% If the value is zero then the order is set to zero
n(isinf(n)) = 0;
Added possibility to specify base.