Hola
a ver si yo entiendo lo que quieres decir.
En primer lugar, una simple struct con un real y un imaginario no vas a poder usarlo, puesto que la solucion de la ecuacion de segundo grado es doble, a no ser que descompongas la solucion.
Si el resultado de (b^2-4ac) es positivo, esta claro que el valor de su raiz cuadrada la metes en el float normal.
Si el resultado de (b^2-4ac) es negativo, entonces no puedes hacer la raiz cuadrada. Por eso, lo que se hace es coger y descomponer la raiz en dos raices. Una la que lleva el (-1) y la otra la que lleva el valor absoluto de (b^2-4ac). A la raiz cuadrada de (-1) se la llama "i". Y el resultado de la ecuacion es el mismo (en valor absoluto) que con el signo cambiado, pero anyadiendo la "i" al final.
Ejemplo:
b = 2, a = 1, c = -2
la ecuacion quedaria:
x = (-2 +/- sqr(2^2 - 4*2*-2)) / 2*1. --> x = -2 +/- (sqr(20)/4)
sqr (20) / 4 = 1.118 que se guardaria en el float real porque es un numero "normal y corriente"
b = 2, a = 1, c = 2
la ecuacion quedaria:
x = (-2 +/- sqr(2^2 - 4*1*2)) / 2*1. --> x = -2 +/- (sqr(-4)/2)
sqr (-4) / 2 = sqr (4) / 2 * sqr(-1) = 2/2 * sqr (-1) = 1*i donde el "1" se guardaria en el float imaginario. Y asi sabrías que tienes un numero imaginario como solucion de la ecuacion, pero el valor numerico es exactamente el mismo que resolver la raiz cuadrada con el valor absoluto.
Una vez guardado asi... haces lo que debas
para guardarlo:
if ((b^2 - 4ac) >= 0)
{
real = sqr(b^2 - 4ac)) / 2a;
solucion1 = -b/2a + real;
solucion2 = -b/2a - real;
printf ("Las soluciones de la ecuacion son: Solucion1 = %f , Solucion 2 = %f", solucion1, solucion2);
}
else // Es decir ((b^2 - 4ac) < 0)
{
real = -b/2a;
imaginario = sqr(-1(b^2 - 4ac))) / 2a
printf ("Las soluciones de la ecuacion son: Solucion1 = %f + %f i, Solucion 2 = %f - %f i", real, imaginario, real, imaginario);
}
Espero haber contestado lo que preguntabas
}