そこで、私は 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
おそらく丸め誤差が原因で、ゼロにはなりません。上記の式はゼロに評価されるべきであることは明らかですが、そうではありません。代わりに、まったく意味のない が得られます。fpu-1400.0
ライブラリで平方根を正確に計算するにはどうすればよいでしょうか。
実際の例はもう少し複雑ですが、結局は同じことを計算します。
答え1
答え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}