I definitely wouldn't expect nontrivial polynomial arithmetic to work 
reliably over RR without special measures. There are definitely methods for 
algebraic geometry with floats, but it needs very special attention to 
numerical stability. That is already true for linear algebra over RR and 
for polynomial algebra it is even worse.

I am pretty sure sage does NOT have facilities for this at the moment. Even 
for linear algebra, I wouldn't trust that sage would select a numerically 
stable approach over RR. There is a good chance it will hit just generic 
implementations that are written for exact linear algebra.

However, the computations you are doing would trigger no polynomial 
arithmetic at all, so the "loss of precision" is  very suspect. It's also 
very suspect that it ends up with a number that has a very precise number 
of decimal digits. Indeed, replacing "pi" with something else, such as 
RR(1/3) or sqrt(2) gives the exact same rounding.

I suspect you're hitting code that somehow tries to call the Singular 
library and, since that doesn't support floats, it looks like it takes a 
very naive approximation
Integers()(a*1000)/1000. That DOES look like a bug. An error would be more 
informative here.

It makes sense this would only happen in a multivariate polynomial ring 
(regardless of what ideal you're actually using): univariate polynomial 
rings would just use euclidean division and not rely on the singular 
library. That would still be numerically unstable in many cases, but in a 
trivial case such as this one, that would not be an issue.

On Wednesday, 5 March 2025 at 10:51:29 UTC-8 Seth Chaiken wrote:

> In Sage 10.4, we tried to inject a RR number into a RR polynomial ring 
> quotient.  It
> works fine when the ideal had one (monomial) generator but precision is 
> lost when
> it had two generators.  
>
> One generator example (works):
>
> eps = var("eps")
> edBaseRing=PolynomialRing(RR,[eps])
> edIdeal=ideal(edBaseRing, [eps])
> edRing=edBaseRing.quotient_ring(edIdeal)
> print(RR(pi))
> print(edBaseRing(pi))
> print(edRing(pi))
>
> yields:
> 3.14159265358979 
> 3.14159265358979 
> 3.14159265358979
>
> But with 2 generators, injecting RR(pi) into the quotient loses precision.
> The analogous output is:
> 3.14159265358979 
> 3.14159265358979 
> 3.14200000000000
>
> Here's the full code:
>
> eps, dlt = var("eps,dlt")
> edBaseRing=PolynomialRing(RR,[eps, dlt])
> edIdeal=ideal(edBaseRing, [eps, dlt])
> edRing=edBaseRing.quotient_ring(edIdeal)
>
> print(RR(pi))
> print(edBaseRing(pi))
> print(edRing(pi))
>
> Looks like a bug! I isolated it from more complex code where the ideal was 
> simply all multiples of the two variables, and a RealField with non-default 
> bit precision was used.
>
>
>
>
>
>

-- 
You received this message because you are subscribed to the Google Groups 
"sage-support" group.
To unsubscribe from this group and stop receiving emails from it, send an email 
to sage-support+unsubscr...@googlegroups.com.
To view this discussion visit 
https://groups.google.com/d/msgid/sage-support/4f5b168e-bc62-423d-8da8-bf45ae3b9744n%40googlegroups.com.

Reply via email to