## How to extract leading non-zero digit?

Asked by John Booker

### John Booker (view profile)

on 4 Jan 2011
Latest activity Commented on by Asif Newaz

### Asif Newaz (view profile)

on 22 Nov 2019 at 14:25
Accepted Answer by Walter Roberson

### Walter Roberson (view profile)

I'm working on a research problem related to Benford's Law which states that the distribution of leading digits is not random. This is probably because many things grow logarithmically. I am trying to extract the leading digit from these vectors below:
10 --> 1
13 --> 1
0.3 --> 3
-4 --> 4
-5 --> 5
-0.006 --> 6
Input will be a vector
x = [1 0.3 -2 0.001 -0.0006, 582398, 3020];
Output should be
y = [1 3 2 1 6 5 3];
Any help?

### Walter Roberson (view profile)

Answer by Walter Roberson

### Walter Roberson (view profile)

on 20 Jan 2011

The answer is complicated because numbers such as 0.0006 have no exact representation in binary floating point number, and the closest number that can be represented might not have the same leading binary digit.
If one does NOT take that factor in to account, then:
y = floor(abs(x) ./ 10.^floor(log10(abs(x))));

Jan

### Jan (view profile)

on 28 Jun 2012
I suggest to accept this one.
John Booker

### John Booker (view profile)

on 1 Aug 2013
Sorry it took me so long to accept. I stole this question from Ned before Answers launched and forgot about it =).

### Ned Gulley (view profile)

Answer by Ned Gulley

### Ned Gulley (view profile)

on 11 Jan 2011

You'll probably need to do some kind of textual manipulation. Here's one way to do it.
function y = leadingDigit(x)
s = sprintf('%1.2e\n',abs(x));
y = s(1:(length(s)/length(x)):end)-48;
end

### Daniel Shub (view profile)

Answer by Daniel Shub

### Daniel Shub (view profile)

on 28 Jun 2012

Is this really the first question on Answers? I was going to use our new magic power and start accepting answers. The only problem is I think there is now a better answer to this question on Loren's blog.

Jan

### Jan (view profile)

on 28 Jun 2012
I thought of accepting this answer, because it contains a link to good solutions. But actually the method shown by Walter hits the point (and is found in this blog also). Ned's method is more efficient than STR2DOUBLE, but a clean numerical approach is moire direct for a numerical question.

### Oleg Komarov (view profile)

Answer by Oleg Komarov

### Oleg Komarov (view profile)

on 5 Sep 2012

Another solution based on regexp (from this question):
regexp(num2str(x), '(?<=(^|\s+)[\-\.0]*)[1-9](?=[\d\.]*)', 'match')

Asif Newaz

### Asif Newaz (view profile)

on 22 Nov 2019 at 14:25
can u explain the 'expression'... i've found regexp quite complicated but very useful