Inexactitud en el cálculo de números flotantes con la biblioteca fpu

Inexactitud en el cálculo de números flotantes con la biblioteca fpu

Así que estoy tratando de hacer algunos cálculos un poco complicados con LaTeX, y seguía escupiendo una respuesta sin sentido. Estoy tratando de calcular la cantidad de capas con las que podrías cubrir una pelota, dadas algunas condiciones, ¡y LaTeX sigue dándome una respuesta negativa! Después de arrancarme el cabello durante horas, pude localizar el error, que se muestra en el MWE a continuación.

\documentclass[border=1mm]{article}
\usepackage[utf8]{inputenc}

\usepackage{mathtools}
\usepackage{pgfplots}

\begin{document}

\pgfmathsetmacro{\earthRadiusKm}{6371} 
\pgfmathsetmacro{\coinRadiusM}{1.05 / 1000} 
\pgfmathsetmacro{\coinHeightM}{1.7 / 1000} 

\pgfkeys{/pgf/fpu, /pgf/fpu/output format=fixed}

\pgfmathsetmacro{\coinsTotalHeight}{3.27*10^17} 

\pgfmathsetmacro{\earthRadiusM}{6371*1000} 

\pgfmathsetmacro{\radiusCoinsLayerCubedMtest}{%
(\earthRadiusM^3)^(1/3) - \earthRadiusM}

\pgfmathsetmacro{\R}{
((\earthRadiusM)^3 + 1.5 * (\coinRadiusM) * (\coinsTotalHeight))^(1/3)
}

\pgfmathsetmacro{\layers}{
(\R - \earthRadiusM)/(\coinHeightM)
}

\pgfkeys{/pgf/fpu=false}

$\sqrt{(R_\oplus^3)^{1/3} - R_\oplus}$ equals $0$ not \radiusCoinsLayerCubedMtest !

The radius is
\begin{align*}
    R = \sqrt[3]{R_\oplus^3 + \frac{3}{2}r_m h_c}
    \approx
    \R
\end{align*}
%
Which means that the total number of layers are
%
\begin{align*}
    n &= \frac{R - R_\oplus}{h_m} \\
      &\approx \frac{\R - \earthRadiusM}{\coinHeightM}
      \approx \layers
\end{align*}
\end{document}

El problema es ese

(something^3)^(1/3) - something

no es igual a cero, presumiblemente debido a errores de redondeo. Está claro que la expresión anterior debería evaluarse como cero, pero no es así. En cambio, entiendo -1400.0lo cual es una completa tontería. ¿Cómo puedo hacer que la biblioteca fpu calcule las raíces cuadradas con demasiada precisión?

ingrese la descripción de la imagen aquí

Mi ejemplo real es un poco más complicado, pero se reduce a calcular lo mismo.

Respuesta1

Con xfp obtengo un resultado más preciso:

\documentclass{article}
\usepackage{xfp}

\begin{document}

\fpeval{((6371*1000)^(1/3))^3 - 6371*1000}

\end{document}

ingrese la descripción de la imagen aquí

Respuesta2

Utilice el fpmódulo de expl3junto con algo de azúcar sintáctico para las variables que también garantiza que no estemos redefiniendo los comandos existentes.

Sin embargo, no puedes esperar que (X3 ) 1/3 =X.

\documentclass{article}

\usepackage{mathtools,xfp}

\ExplSyntaxOn

\NewDocumentCommand{\setfpvar}{mm}
 {
  \fp_zero_new:c { nebu_var_#1_fp }
  \fp_set:cn { nebu_var_#1_fp } { #2 }
 }
\NewExpandableDocumentCommand{\fpvar}{m}
 {
  \fp_use:c { nebu_var_#1_fp }
 }

\ExplSyntaxOff

\begin{document}

\setfpvar{earthRadiusKm}{6371} 
\setfpvar{coinRadiusM}{1.05 / 1000} 
\setfpvar{coinHeightM}{1.7 / 1000} 
\setfpvar{coinsTotalHeight}{3.27*10^17} 

\setfpvar{earthRadiusM}{6371*1000} 
\setfpvar{radiusCoinsLayerCubedMtest}{
  (\fpvar{earthRadiusM}^3)^(1/3) - \fpvar{earthRadiusM}
}

\setfpvar{R}{
  ((\fpvar{earthRadiusM})^3 + 1.5 * (\fpvar{coinRadiusM}) * (\fpvar{coinsTotalHeight}))^(1/3)
}

\setfpvar{layers}{
  (\fpvar{R} - \fpvar{earthRadiusM})/(\fpvar{coinHeightM})
}

$\sqrt{(R_\oplus^3)^{1/3} - R_\oplus}$ equals
$\fpvar{radiusCoinsLayerCubedMtest}$

\bigskip

The radius is
\begin{align*}
    R = \sqrt[3]{R_\oplus^3 + \frac{3}{2}r_m h_c}
    \approx
    \fpvar{R}
\end{align*}
which means that the total number of layers is
\begin{align*}
    n &= \frac{R - R_\oplus}{h_m} \\
      &\approx \frac{\fpvar{R} - \fpvar{earthRadiusM}}{\fpvar{coinHeightM}}
      \approx \fpvar{layers}
\end{align*}

\end{document}

ingrese la descripción de la imagen aquí

información relacionada