Discover MakerZone

MATLAB and Simulink resources for Arduino, LEGO, and Raspberry Pi

Learn more

Discover what MATLAB® can do for your career.

Opportunities for recent engineering grads.

Apply Today

To resolve issues starting MATLAB on Mac OS X 10.10 (Yosemite) visit: http://www.mathworks.com/matlabcentral/answers/159016

Sum digits after vpa(N,100) ?

Asked by Per on 16 Jan 2013

Hi MatLab!

I've stumbled across a problem. I wish to take all the first hundred digits in the square root of 2 ---> sqrt(2) and sum them up.

I first use

N=sym('sqrt(2)'); vpa(N,100)

which gives me alot of digits. But when I try to num2str the answer it cant be done. How can I achieve this?

0 Comments

Per

Products

No products are associated with this question.

2 Answers

Answer by Shashank Prasanna on 16 Jan 2013
Accepted answer

Here you go:

clear all

digits(100);

N=vpa(sym('sqrt(2)'));

sumA = 0;

for i = 1:100

    sumA = sumA + (floor(N*(10^(i-1))) - 10*floor(N*10^(i-2)));

end

disp(sumA)

0 Comments

Shashank Prasanna
Answer by Jan Simon on 16 Jan 2013
Edited by Jan Simon on 16 Jan 2013

Could you operate on the VPA number instead of converting it to a string? I do not have the Symbolic Toolbox, but I guess:

s = 0;
x = vpa(N, 100);
for ii = 1:100
  s = s + floor(x);
  x = rem(x, 1) * 10;
end

Does this work?

[EDITED]

N = sym('sqrt(2)'); 
x = vpa(N, 100);
s = 0;
for ii = 1:100
  f = floor(x);
  s = s + f;
  x = (x - f) * 10;
end

If rounding error appear, try it with 200 digits in the VPA command. Please use this as inspiration - as I said already, I do not have the corresponding toolboxes.

5 Comments

Per on 16 Jan 2013

I've written it like this and it yields the answer 465. The correct answer is 475. So the code seems to be working but I dont know where my 10 little digits went :O

Jan Simon on 16 Jan 2013

Then let's debug your algorithm:

x = 1.414213562373095...
-> iteration starts
  x = x*10-floor(x)*10
    = 14.14213... - 1 * 10
    = 4.14...;
  s = s + 4;

Does the 1 not matter? And why do the loop stop at 99, when you need 100 elements?

Another test:

S = ['1.41421356237309504880168872420969807856967187537694807', ...
     '3176679737990732478462107038850387534327641572735013846', ...
     '230912297024924836055850737212644121497099935831'];
D = S - '0';
sum(D(3:102))
Jan Simon on 16 Jan 2013

Now I can run Matlab again. The [EDITED] version works and gives the correct result.

Jan Simon

Contact us