You can use xfp, that works expandably and allows a neater syntax for the operations. The number of decimal digits is not the same as provided by fp, but it shouldn't matter for most applications (including this one).
\documentclass{article}
\usepackage{pict2e}
\usepackage{fp} % for the old method
\usepackage{xfp} % for the new method
\newcommand\ScaleLength{25.5}
\newcommand\ScaleFactor{0.1}
\newcommand\FretDist[1]{\FPmul\resulta{-1}{#1}%
\FPdiv\resulta{\resulta}{12}%
\FPpow\resulta{2}{\resulta}%
\FPsub\resulta{1}{\resulta}%
\FPmul\resulta{\ScaleLength}{\resulta}
\FPmul\resulta{\resulta}{\ScaleFactor}
\resulta
}
\newcommand{\xFretDist}[1]{%
\fpeval{
\ScaleLength\ScaleFactor(1-exp(-(#1/12)*ln(2)))
}
}
\begin{document}
\FretDist{9}
\xFretDist{9}
\FretDist{3} % now \resulta contains the value
\xFretDist{3}
\bigskip
\fbox{\begin{picture}(10,10)
\put(3,\resulta){\circle{3}}
\end{picture}}
\fbox{\begin{picture}(10,10)
\put(3,\xFretDist{3}){\circle{3}}
\end{picture}}
\end{document}
As you can see, the pictures are the same.

Old answer
You can't use \FretDist{3} as argument to \put, because this commands expects a number and not a whole set of instructions to print it. Change the definition of \FretDist as follows
\def\FretDist#1{\FPmul\resulta{-1}{#1}%
\FPdiv\resulta{\resulta}{12}%
\FPpow\resulta{2}{\resulta}%
\FPsub\resulta{1}{\resulta}%
\FPmul\resulta{25.5}{\resulta}
\FPmul\resulta{\resulta}{\ScaleFactor}
}
so that, after calling it, you'll have \resulta available for usage as a number:
\FretDist{3} % store the number in \resulta
\put(3,\resulta){\circle{3}}