我们可以使用这些(主要是纯 TeX)宏简单地计算数字平方根的近似值。
\documentclass{article}
\begin{document}
\newcount\liczba
\newcount\kwadrat
\def\sqroot#1{\liczba=0\kwadrat=0
\loop
\ifnum\kwadrat<#1 \advance\liczba by1 \kwadrat\liczba \multiply \kwadrat by \liczba
\repeat$\sqrt{#1}\approx\the\liczba$}
\sqroot{121}
\sqroot{300}
\sqroot{626}
\end{document}
有没有更好的方法?特别是如果我们想在 TikZ 中使用这些值。
答案1
\documentclass{article}
\usepackage{xfp}
\begin{document}
\newcount\liczba
\newcount\kwadrat
\def\sqroot#1{\liczba=0\kwadrat=0
\loop
\ifnum\kwadrat<#1 \advance\liczba by1 \kwadrat\liczba \multiply \kwadrat by \liczba
\repeat$\sqrt{#1}\approx\the\liczba$}
\NewExpandableDocumentCommand{\bettersquareroot}{O{16}m}{%
\fpeval{round(sqrt(#2),#1)}%
}
\sqroot{121} and \bettersquareroot{121}
\sqroot{300} and \bettersquareroot[5]{300}
\sqroot{626} and \bettersquareroot{626}
\end{document}
好多了,不是吗?
如果想要整数近似值:
\documentclass{article}
\usepackage{xfp}
\begin{document}
\newcount\liczba
\newcount\kwadrat
\def\sqroot#1{\liczba=0\kwadrat=0
\loop
\ifnum\kwadrat<#1 \advance\liczba by1 \kwadrat\liczba \multiply \kwadrat by \liczba
\repeat$\sqrt{#1}\approx\the\liczba$}
\NewExpandableDocumentCommand{\bettersquareroot}{m}{%
\fpeval{round(sqrt(#1),0)}%
}
\sqroot{121} and \bettersquareroot{121}
\sqroot{300} and \bettersquareroot{300}
\sqroot{626} and \bettersquareroot{626}
\sqroot{652} and \bettersquareroot{652}
\end{document}
不过,你也可以使用前面更通用的代码
\bettersquareroot[0]{652}
请注意,这是完全可扩展的,因此您可以在任何需要整数的上下文中使用。
答案2
如果你已经在使用 TikZ,你也可以使用\pgfmathparse
:
\documentclass{article}
\usepackage{tikz}
\begin{document}
\newcount\liczba
\newcount\kwadrat
\def\sqroot#1{\liczba=0\kwadrat=0
\loop
\ifnum\kwadrat<#1 \advance\liczba by1 \kwadrat\liczba \multiply \kwadrat by \liczba
\repeat$\sqrt{#1}\approx\the\liczba$}
\newcommand\pgfsqrt[1]{\pgfmathparse{int((sqrt(#1)))}\pgfmathresult}
\sqroot{121} and \pgfsqrt{121}
\sqroot{300} and \pgfsqrt{300}
\sqroot{626} and \pgfsqrt{626}
\end{document}
答案3
这是一个基于 LuaLaTeX 的解决方案。它使用 Lua 库函数math.sqrt
和math.ceil
。(后一个函数返回不小于其参数的最小整数;因此\math.ceil(11.0)
返回11
,而math.ceil(11.01)
返回12
。)
\documentclass{article}
\newcommand\sqroot[1]{\directlua{tex.sprint(math.sqrt(#1))}}
\newcommand\approxsqroot[1]{\directlua{tex.sprint(math.ceil(math.sqrt(#1)))}}
\begin{document}
\obeylines % just for this example
$\sqrt{121}=\sqroot{121}=\approxsqroot{121}$
$\sqrt{300}\approx\sqroot{300}\le\approxsqroot{300}$
$\sqrt{626}\approx\sqroot{626}\le\approxsqroot{626}$
\end{document}
答案4
我无法理解您的代码(对不起)。我建议您使用calculator
包,使用\TRUNCATE[0]
,获取整数。图片取自手册。
\documentclass[a4paper,12pt]{article}
\usepackage{amsmath,amssymb}
\usepackage{calculator}
\begin{document}
\SQUAREROOT{121}{\sola}
$\sqrt{121}=\sola$
$\approx$ \TRUNCATE[0]{\sola}{\solA}
\solA
\SQUAREROOT{300}{\solb}
$\sqrt{300}=\solb$
$\approx$
\TRUNCATE[0]{\solb}{\solB}
\solB
\SQUAREROOT{626}{\solc}
$\sqrt{626}=\solc$
$\approx$
\TRUNCATE[0]{\solc}{\solC}
\solC
\end{document}
输出为: