fpu 라이브러리를 사용한 부동 숫자 계산의 부정확성

fpu 라이브러리를 사용한 부동 숫자 계산의 부정확성

그래서 LaTeX를 사용하여 약간 복잡한 계산을 하려고 했는데 계속 말도 안되는 대답이 나왔습니다. 특정 조건에서 공을 덮을 수 있는 레이어 수를 계산하려고 하는데 LaTeX에서 계속 부정적인 답변을 제공합니다! 몇 시간 동안 머리를 뽑은 후 아래 MWE에 표시된 오류를 추적할 수 있었습니다.

\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}

문제는

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

아마도 반올림 오류로 인해 0이 아닙니다. 위의 표현식이 0으로 평가되어야 한다는 것은 분명하지만 그렇지 않습니다. 대신에 나는 -1400.0그것이 완전한 넌센스라는 것을 알게 되었습니다. fpu 라이브러리에서 제곱근을 너무 정확하게 계산하려면 어떻게 해야 합니까?

여기에 이미지 설명을 입력하세요

내 실제 예는 조금 더 복잡하지만 결국 동일한 계산으로 귀결됩니다.

답변1

xfp를 사용하면 더 정확한 결과를 얻을 수 있습니다.

\documentclass{article}
\usepackage{xfp}

\begin{document}

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

\end{document}

여기에 이미지 설명을 입력하세요

답변2

기존 명령을 재정의하지 않도록 보장하는 변수에 대한 일부 구문 설탕과 함께 fp모듈을 사용하십시오 .expl3

그러나 그런 것을 기대할 수는 없습니다(엑스3 ) 1/3 =엑스.

\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}

여기에 이미지 설명을 입력하세요

관련 정보