On Sun, 1 Aug 2021 at 11:02, Paul Royik <distantjob...@gmail.com> wrote:
>
> For a given number, I want to approximate it to 5 decimal points.
> If a number of digits in the integer part is greater than 7, then round to 7 
> significant figures.

What does "round" mean here? Do you want to round to nearest, or round
towards zero, round towards minus infinity? How should ties be
handled?

Maybe this does what you want:

In [12]: f = sqrt(101010101010101)

In [13]: f5 = round(f, 5)

In [14]: f5
Out[14]: 10050378.15259

In [15]: floor(f5) > 10**7
Out[15]: True

In [16]: numdigits = len(str(floor(f5)))

In [17]: numdigits
Out[17]: 8

In [18]: f7 = round(f, 7 - numdigits)

In [19]: f7
Out[19]: 10050380.0000000

> What I noticed is that evalf doesn't approximate to decimal points, it 
> evaluates to significant figures.

More precisely it rounds to a given number of binary (not decimal) digits.

> What should I apply to get the desired result? It appears that round is a 
> buggy.

It's not clear exactly what you want but maybe the code I showed above
works. What do you mean that round is buggy?

> Also, I noticed, that Integer(sqrt(101010101).evalf(3)) gives 10050, while 
> (sqrt(101010101).evalf(3) gives 10100.
>
> Is it expected behaviour?

When you ask for sqrt(101010101).evalf(3) the result is supposed to be
precise to 3 decimal digits but in the face of rounding it is always
possible that the last digit may not be the correct digit for the true
answer since in some cases an arbitrarily large precision is needed to
get a correct answer for the nth digit. The exact value returned is:

In [27]: f = sqrt(101010101).evalf(3)

In [28]: f._mpf_
Out[28]: (0, mpz(5025), 1, 13)

In [29]: f._prec
Out[29]: 13

In [30]: 5025*2**1
Out[30]: 10050

The exact value of the Float is 10050 but it has a (binary) precision
of 13 digits which is what is used for a decimal precision of ~3
digits. When printing the result is rounded to 3 decimal digits and
the 50 rounds up to 100. When you call Integer(f) that returns the
integer 10050 which displays as that exact value.

-- 
Oscar

-- 
You received this message because you are subscribed to the Google Groups 
"sympy" group.
To unsubscribe from this group and stop receiving emails from it, send an email 
to sympy+unsubscr...@googlegroups.com.
To view this discussion on the web visit 
https://groups.google.com/d/msgid/sympy/CAHVvXxR9XUNs2Jj-0vumwPf6LC0-SVT2qZfjCXZH6gyFiZ_CRA%40mail.gmail.com.

Reply via email to