#include <iostream>
#include <iomanip>
#include <cmath>
#include <limits>
#include <future>
double f(const double& x) // valor de la función en x
{
return (pow(x,4) - 3*(pow(x,2)) + 75*x - 10000.0);
}
inline
double df(const double& x) // valor de la derivada de la función en x
{
return (4*pow(x,3) - 6*x + 75);
}
int main()
{
double x0 = 1; // primera aproximación (puede pedirse al usuario).
double x1; // intersección de la tangente con el eje de las abscisas.
double y; // valor de la función en x0.
double y_prima; // valor de la derivada de la función en x0 (pendiente de la tangente en x0).
const double epsilon = std::numeric_limits<double>::epsilon() ; // diferencia entre 1 y el siguiente
// menor double representable.
const int iteraciones_max = 500; // máxima cantidad de iteraciones (puede pedirse al usuario).
bool hallada = false; // solución aún no hallada.
int i;
for(i=0; i<iteraciones_max; ++i) {
auto h = std::async(std::launch::async, f, x0);
y_prima = df(x0);
if(fabs(y_prima) <= epsilon) // denominador prácticamente nulo
break;
y = h.get();
x1 = x0 - y/y_prima;
if(fabs(x1 - x0)/fabs(x1) <= epsilon) { // diferencia despreciable
hallada = true;
break;
}
x0 = x1;
}
if(hallada) {
std::cout << "Raiz hallada = " << std::setprecision(16) << x1 << " (en " << i << " iteraciones).\n";
}
else
std::cout << "Raiz no hallada.\n";
}