# Precise conversions from double to symbolic

7 views (last 30 days)

Show older comments

I have the following number

r = 1.78503

I want to obtain the exact symbolic representation of 1/r, and I applied

p = 1/sym(r);

which gives me 1125899906842624/2009765110711289.

However, if I apply the form sym(1/r) then I got 2522982598259131/4503599627370496 which is different from the previous one. I understand this is due to the floating point numeric 1/r so the later form may not be accurate. Based on this observation, what measures should be taken in order to have exact values in a situation like this ? Is the form 1/sym(r) fully able to extract the exact symbolic representation here ? Thanks.

##### 3 Comments

Walter Roberson
on 20 Dec 2016

### Accepted Answer

Walter Roberson
on 20 Dec 2016

Edited: Walter Roberson
on 20 Dec 2016

Compare:

r = 2.1234

sym(1/r)

1/sym(r)

1/sym(r,'d')

1/sym(r,'e')

1/sym(r,'f')

1/sym(r,'r')

s = sym(sprintf('%.16g', r));

feval(symengine,'numeric::rationalize',1/s,'Exact')

1/feval(symengine,'numeric::rationalize',s,'Exact')

##### 9 Comments

Walter Roberson
on 5 Jan 2017

### More Answers (2)

John D'Errico
on 21 Dec 2016

Too late of course. But the point is that when you create r as a double:

r = 1.78503;

Then it is NOT stored exactly, as 1.78503. Nothing you do will then allow MATLAB to know that you really intended 1.78503, and not the number actually stored, which is...

sprintf('%0.55f',1.78503)

ans =

1.7850299999999998945554580132011324167251586914062500000

Even if you try to pass that number into sym, MATLAB will get it wrong, because you passed in a double precision number as far as sym was concerned.

vpa(sym(1.78503),55)

ans =

1.78502999999999989455545801320113241672515869140625

A simple solution is to go directly to symbolic form, but even there one must be careful.

r = sym('1.78503')

r =

1.78503

vpa(r,55)

ans =

1.785029999999999999999999999999999999999842248658119649

So it looks like r only had about 40 decimal digits stored. (As a guess, roughly 128 bits in the mantissa.) Still better than 16 digits though.

You can do better, by avoiding decimals completely. Integers work best.

r = sym('178503/100000')

r =

178503/100000

vpa(r,300)

ans =

1.78503

Or, you can use my HPF toolbox.

hpf('1.78503',100)

ans =

1.78503

##### 1 Comment

James Tursa
on 21 Dec 2016

Karan Gill
on 9 Jan 2017

Use quotes to keep your input exactly as it.

r = sym('1.78503')

But you don't get the fractional representation since you asked to keep it exactly as the decimal.

>> p = 1/r

p =

0.56021467426317764967535559626449

##### 0 Comments

### See Also

### Community Treasure Hunt

Find the treasures in MATLAB Central and discover how the community can help you!

Start Hunting!