Problema con decimales (C)

Iniciado por maria16, 27 Noviembre 2016, 06:14 AM

0 Miembros y 1 Visitante están viendo este tema.

maria16

Hola, el problema es que h, en el momento que se hace menor a 1 (cuando n>10), aunque sea 0.9 lo toma como 0, como si fuera un entero. Alguien podría decirme lo que estoy haciendo mal? por favor

#include <stdio.h>
#include <stdlib.h>
#include <math.h>

#define xo 5
#define xn 15
#define n 10

double main()
{
    double h, A, xi;
    int i;
    h=(xn-xo)/n;

    printf("El paso h es: %f \n", h);

engel lex

#1
primero tienes un error garrafal... "double main()" main siempre debe ser int y unicamente int, y en general debe retornar 0 que indica "ok" a nivel de sistema...

segundo... los defines en general no son mala practica pero no están lejos, ya que son directivas de preprocesador y no estás declaradas de manera bien controlada

que tipo de variable son en tu codigo Xo, Xn y n... podrías responder eso en base a tu codigo? char, short, int, long, float, doble? sabes si es signed o unsigned?

la función main está incompleta, aunque puede ser una asunto de copiado así que no me meto allí...

tienes 2 caminos

seguir con los defines (que no lo recomiendo para nada) y entonces usar casting (conversión implicita) donde solo cambiarías una linea

h=(xn-xo)/(double)n;

o de la manera que debe ser, usando constantes de manera que están disponibles en tu código tienes controlado su tipo y no son alterables
#include <stdio.h>
#include <stdlib.h>
#include <math.h>

int main(){
const double xo = 5;
const double xn = 15;
const double n = 9;
   double h;
   h=(xn-xo)/n;

   printf("El paso h es: %f \n", h);
   return 0;
}

El problema con la sociedad actualmente radica en que todos creen que tienen el derecho de tener una opinión, y que esa opinión sea validada por todos, cuando lo correcto es que todos tengan derecho a una opinión, siempre y cuando esa opinión pueda ser ignorada, cuestionada, e incluso ser sujeta a burla, particularmente cuando no tiene sentido alguno.

maria16

#2
muchas gracias!! si estaba incompleto porque copié solo la parte del error, y lo del double main () lo puse despues de estarlo modificando por 3 horas jaja

engel lex

#3
el problema era (y para que tengas cuenta esto en el futuro) que los resultados de las operaciones en C/C++ siempre retornan el tipo de variable operado, son inconscientes de quien los recibe...

así que
float = int/int
dividirá como int (sin decimales) y lo pasará al float

si es una operación entre diferentes tipos siempre se devolverá el mayor de los tipos (esto se llama "promoción de operadores" básicamente agarra el tipo más limitado, lo convierte en el tipo más grande y luego opera)

así que
float = int/float
o
float = float/int

dividirá como float, es decir con decimales

esto pasa igualmente con números

float a,b1,b2;
a = 3/4; // int/int ya que los numeros enteros internamente son int
b1 = 3.0/4; // float/int
b2 = 3/4.0 // int/float
El problema con la sociedad actualmente radica en que todos creen que tienen el derecho de tener una opinión, y que esa opinión sea validada por todos, cuando lo correcto es que todos tengan derecho a una opinión, siempre y cuando esa opinión pueda ser ignorada, cuestionada, e incluso ser sujeta a burla, particularmente cuando no tiene sentido alguno.