%!TEX lualatex

\documentclass[french,a4paper,11pt]{article}
\usepackage[margin=1.5cm]{geometry}
\usepackage[T1]{fontenc}
\usepackage[utf8]{inputenc}
\usepackage{amsmath,amssymb,amstext}
\usepackage{mathtools}
\usepackage{ifthen}
\usepackage{xintexpr}
\usepackage{xinttools}
\usepackage{xstring}
\usepackage{simplekv}
\usepackage{babel}

\begin{document}

\section{Test de résolution d'une équation par balayage}

\defKV[SolBalay]{%
	Precision=\def\BALAYstep{#1},%
	ValeurInit=\def\BALAYxinit{#1}
}

\setKVdefault[SolBalay]{%
	Precision=2,%
	ValeurInit=0
}

\NewDocumentCommand\SolutionBalayage{ O{} m O{masolution} }{%1=options,2=equation,3=macro
	\useKVdefault[SolBalay]%
	\setKV[SolBalay]{#1}%
	%extraction fonction + valeur
	\StrCut{#2}{=}{\SolBalFCT}{\SolBalVal}%
	%création des variables temporaires
	\xintdeffloatfunc varfct(x) := \SolBalFCT ;%
	\xdef\vartmp{\fpeval{\BALAYxinit}}%
	\xdef\varstep{\fpeval{1e-\BALAYstep}}%
	\whiledo{ \xintGt{\xintfloateval{(varfct(\vartmp)-\SolBalVal)*(varfct(\vartmp+\varstep)-\SolBalVal)}}{0} = 1}%
		{%
			\xdef\vartmp{\xintfloateval{\vartmp+\varstep}}%
		}%
	%création des variables
	\expandafter\def\csname #3d\endcsname{\fpeval{\vartmp}}%
	\expandafter\def\csname #3e\endcsname{\fpeval{\vartmp+\varstep}}%
	\xintifboolexpr{\xintGt{\xintfloateval{abs(varfct(\vartmp)-\SolBalVal)}}{\xintfloateval{abs(varfct(\vartmp+\varstep)-\SolBalVal)}}{0}==1}%écardéfaut > écartexcès
		{\expandafter\def\csname #3a\endcsname{\fpeval{\vartmp+\varstep}}}%
		{\expandafter\def\csname #3a\endcsname{\fpeval{\vartmp}}}%
}

\SolutionBalayage[Precision=2]{x**3-2*x**2-x-1=2}
Une valeur approchée, à $10^{-2}$ près, d'une solution de $x^3-2x^2-x-1=2$ est $x_0$ avec :
\begin{itemize}
	\item $x_0 \approx \masolutiond$ par défaut ;
	\item $x_0 \approx \masolutione$ par excès ;
	\item $x_0 \approx \masolutiona$.
\end{itemize}

\end{document}