Dos respuestas diferentes para la misma expresión en C

Tengo una expresión que hace el mismo cálculo. Cuando trato de hacer todo el cálculo en una sola expresión y almacenarla en la variable "a", la expresión calcula la respuesta como 0. Cuando divido las ecuaciones en dos partes diferentes y luego las calculo, da la respuesta -0.332087. Obviamente, -0.332087 es la respuesta correcta. ¿Alguien puede explicar por qué este programa se comporta mal de esta manera?

#include<stdio.h>

void main(){
    double a, b, c;
    int n=0, sumY=0, sumX=0, sumX2=0, sumY2=0, sumXY=0;
    n = 85;
    sumX = 4276;
    sumY = 15907;
    sumX2 = 288130;
    sumY2 = 3379721;
    sumXY = 775966;
    a = ((n*sumXY) - (sumX*sumY)) / ((n*sumX2)-(sumX*sumX));
    b = ((n*sumXY) - (sumX*sumY));
    c = ((n*sumX2) - (sumX*sumX));
    printf("%lf\n", a);
    printf("%lf\n", b/c);
}

Output:
0.000000
-0.332097
Answer

en tu programa

a = ((n*sumXY) - (sumX*sumY)) / ((n*sumX2)-(sumX*sumX));

todas las variables en el lado derecho son de tipo int, por lo que producirá un resultado de tipo int. La respuesta verdadera -0,332097 no es un valor int, por lo que se convertirá en un valor int válido, es decir, 0. Y este 0 se asigna a la variable a.

pero cuando lo haces

b = ((n*sumXY) - (sumX*sumY));
c = ((n*sumX2) - (sumX*sumX));
printf("%lf\n", b/c);

La variable by cson de tipo double, por lo que la expresión b/cproduce un valor de tipo doble y la respuesta verdadera -0.332097 es un valor doble válido. Por lo tanto, esta parte de su código da un resultado correcto.

En la primera ecuación, es decir, a = ((n*sumXY) - (sumX*sumY)) / ((n*sumX2)-(sumX*sumX))tanto el numerador como el denominador darán resultados enteros y el valor almacenado en a también será entero, ya que entero/entero es entero. En la segunda y tercera expresión, a medida que las resuelve individualmente, tanto b como c se almacenarán en doble y doble/doble dará como resultado un doble, es decir, un valor decimal.

Este problema se puede resolver utilizando la conversión de tipos, o mejor aún, utilizando floatpara las variables.

Agregue doble antes de su cálculo, de modo que después de hacer su cálculo entero en "a", lo convertirá en doble .

a = (double)((n*sumXY) - (sumX*sumY)) / ((n*sumX2)-(sumX*sumX));

En primer lugar (INTEGER)/(INTEGER), siempre es un INTEGER. Entonces, puedes encasillarlo comoa = (double)(((n*sumXY) - (sumX*sumY)) / ((n*sumX2)-(sumX*sumX)));

O

Sabemos que cualquier número (n ∈ ℂ), multiplicado por 1,0 siempre da el mismo número (n). Entonces, su código será como:

a = ((n*sumXY*1.0L) - (sumX*sumY)) / ((n*sumX2)-(sumX*sumX));

Multiplicar por 1.0Lo 1.0fconvertir toda la operación aritmética a long doubletipo de datos. Ahora puede imprimir el número (-0.332097) en stdout.

Código no estándar

Tu código es:
void main()
{
     //// YOUR CODE
}

Que no es estándar C. En su lugar, su código debería ser como:

int main(int argc, char const **argv)
{
     //// YOUR CODE
     return 0;
}
Nuevo colaborador
Darth-CodeX is a new contributor to this site. Take care in asking for clarification, commenting, and answering. Check out our Code of Conduct.

Cambia todos tus ENTEROS a DOBLES. Eso debería resolver el problema

El tipo de la primera expresión es int mientras que en la segunda expresión es doble.