4

Es un programa muy sencilo pero me da un resultado que no entiendo.

El programa:

#include "stdafx.h"
#include <iostream>
#include <vector>
#include <cmath>

using std::cout;
using std::cin;
using std::sqrt;


int main()
{
    double x1, x2, a, b, c;
    cout << "Introduce a: \n";
    cin >> a;
    cout << "Introduce b: \n";
    cin >> b;
    cout << "Introduce c: \n";
    cin >> c;

    x1 = (-b + sqrt((b*b) - (4 * a*c)))/(2*a);
    x2 = (-b - sqrt((b*b) - (4 * a*c))) / (2 * a);

    cout << "Para " << a << "x^2+" << b << "x+" << c << " = 0.\n";
    cout << "X1= " << x1 << '\n';
    cout << "X2= " << x2 << '\n';

    cin.ignore();
    cin.get();
    return 0;
}

El resultado:

introducir la descripción de la imagen aquí

Por cierto, ¿existe diferencia entre usar #include <cmath> y #include <math.h>?¿es lo mismo o distintas versiones?

Wyrncael
  • 1,130
  • 1
  • 7
  • 18
Gojira
  • 365
  • 3
  • 12

2 Answers2

7

No se puede hacer la raíz cuadrada de un número negativo, eso es un valor indeterminado. Este es tu código:

x1 = (-b + sqrt((b*b) - (4 * a*c)))/(2*a);
x2 = (-b - sqrt((b*b) - (4 * a*c))) / (2 * a);

Éstos tus datos de entrada:

a = 2;
b = 2;
c = 5;

Substituyendo:

  1.  x1 = (-b + sqrt((b*b) - (4 * a*c)))/(2*a);
     x2 = (-b - sqrt((b*b) - (4 * a*c))) / (2 * a);
    
  2.  x1 = (-2 + sqrt((2*2) - (4 * 2*5)))/(2*2);
     x2 = (-2 - sqrt((2*2) - (4 * 2*5))) / (2 * 2);
    
  3.  x1 = (-2 + sqrt(( 4 ) - (4 * 10 )))/( 4 );
     x2 = (-2 - sqrt(( 4 ) - (4 * 10 ))) / (  4  );
    
  4.  x1 = (-2 + sqrt(( 4 ) - (  40   )))/  4  ;
     x2 = (-2 - sqrt(( 4 ) - (  40   ))) /    4   ;
    
  5.  x1 = (-2 + sqrt(      -36        ))/  4  ;
     x2 = (-2 - sqrt(      -36        )) /    4   ;
    
  6.  x1 = (-2 +      indeterminado     )/  4  ;
     x2 = (-2 -      indeterminado     ) /    4   ;
    
  7.  x1 =            indeterminado      /  4  ;
     x2 =            indeterminado       /    4   ;
    
  8.  x1 =            indeterminado            ;
     x2 =            indeterminado                ;
    

Ésto significa que la ecuación no tiene solución real para los valores facilitados. Sin embargo tiene solución imaginaria, utilizando números complejos (disponible en <complex>) puedes resolver tu problema:

double a, b, c;
cout << "Introduce a: \n";
cin >> a;
cout << "Introduce b: \n";
cin >> b;
cout << "Introduce c: \n";
cin >> c;

auto x1 = (-b + sqrt(complex((b*b) - (4 * a*c))))/(2*a);
auto x2 = (-b - sqrt(complex((b*b) - (4 * a*c)))) / (2 * a);

Esto resulta en la siguiente salida:

X1= (-0.5,1.5)
X2= (-0.5,-1.5)

Que es efectivamente la solución imaginaria a los datos de entrada. Puedes ver el código funcionando en Wandbox 三へ( へ՞ਊ ՞)へ ハッハッ.


El texto que te aparece -nan(ind) es un texto que depende de implementación. Está indicando que es un valor que no es un número (not a number) y que en concreto es una indeterminación de la ecuación.


Por cierto, ¿existe diferencia entre usar #include <cmath> y #include <math.h>? ¿es lo mismo o distintas versiones?

Esa pregunta ya ha sido respondida en este hilo.

PaperBirdMaster
  • 44,474
  • 6
  • 44
  • 82
1

Estas haciendo la raiz de un número negativo, por eso te da como resultado Not a number.

Al estar resolviendo una raíz de segundo grado, esos casos no tienen solución, por lo que deberías revisar tu código para ver como tratarlos.

En otra situación, en la que quieras asegurarte que se hace la raíz, puedes hacer el valor absoluto para que siempre sea un número positivo:

sqrt(abs(numero));

Respecto a tu otra pregunta, la ciferencia entre cmath y math.h es que la primera es de c++ y la seguna de c, por lo que deberías utilizar siempre las que empiezan por c... en c++.

Wyrncael
  • 1,130
  • 1
  • 7
  • 18
  • 3
    Hacer el valor absoluto resuelve la indeterminación, pero falsea el resultado de la ecuación cuadrática. – PaperBirdMaster Mar 29 '18 at 13:27
  • Quizás me expresé mal, era una solución para otros casos, por ello aviso después que en este caso no tiene solución. Debería cambiar el orden al explicarlo. Voy a editarlo. – Wyrncael Mar 29 '18 at 13:31