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

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 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
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