He verificado experimentalmente que en Java la igualdad
Math.sqrt(x*x) = x
tiene para todos los long x
tal que x*x
no se desborde. Aquí, Java long
$64$ bits con signo tipo y double
es un binario IEEE de punto flotante tipo con al menos $53$ bits de mantisa y lo suficientemente largo como exponente.
Matemáticamente, hay dos imprecisa funciones:
- La conversión de
long
adouble
que pierde precisión debido a la mantisa ser sólo $53$ bits donde $63$ bits sería necesario. Esta operación está garantizada para devolver el representable más cercano resultado. - La informática de la raíz cuadrada, que también es una garantía para devolver el representable más cercano resultado.
Matemáticamente, esto puede ser expresado como
$$ \mathop\forall_{x \in {\mathbb N} \cima de x \le 3037000499} \mathrm{ronda}\left(\sqrt{\mathrm{ronda}(x^2)}\right) = x $$
donde $\mathrm{ronda}$ es la función de redondeo de $\mathbb R$ en el conjunto de todos los números representables como double
.
Estoy buscando una prueba ya que ningún experimento puede asegurar que funciona a través de todas las máquinas.