¿Por qué al dividir dos números enteros no se obtiene un valor flotante? [duplicar]

Resuelto mushroom asked hace 11 años • 7 respuestas

¿Alguien puede explicar por qué b se redondea aquí cuando lo divido por un número entero aunque es un flotante?

#include <stdio.h>

void main() {
    int a;
    float b, c, d;
    a = 750;
    b = a / 350;
    c = 750;
    d = c / 350;
    printf("%.2f %.2f", b, d);
    // output: 2.00 2.14
}

http://codepad.org/j1pckw0y

mushroom avatar Apr 26 '13 01:04 mushroom
Aceptado

Esto se debe a la conversión implícita. Las variables b, c, dson de floattipo. Pero el /operador ve dos números enteros que tiene que dividir y, por lo tanto, devuelve un número entero en el resultado que se convierte implícitamente en a floatmediante la adición de un punto decimal. Si desea divisiones flotantes, intente realizar dos operandos para los /flotantes. Como sigue.

#include <stdio.h>

int main() {
    int a;
    float b, c, d;
    a = 750;
    b = a / 350.0f;
    c = 750;
    d = c / 350;
    printf("%.2f %.2f", b, d);
    // output: 2.14 2.14
    return 0;
}
Sukrit Kalra avatar Apr 25 '2013 18:04 Sukrit Kalra

Utilice la conversión de tipos:

int main() {
    int a;
    float b, c, d;
    a = 750;
    b = a / (float)350;
    c = 750;
    d = c / (float)350;
    printf("%.2f %.2f", b, d);
    // output: 2.14 2.14
}

Esta es otra forma de solucionarlo:

 int main() {
        int a;
        float b, c, d;
        a = 750;
        b = a / 350.0; //if you use 'a / 350' here, 
                       //then it is a division of integers, 
                       //so the result will be an integer
        c = 750;
        d = c / 350;
        printf("%.2f %.2f", b, d);
        // output: 2.14 2.14
    }

Sin embargo, en ambos casos le está diciendo al compilador que 350 es un flotante y no un número entero. En consecuencia, el resultado de la división será un número flotante y no un número entero.

Cacho Santa avatar Apr 25 '2013 18:04 Cacho Santa

"a" es un número entero, cuando se divide con un número entero da un número entero. Luego se asigna a "b" como un número entero y se convierte en flotante.

deberías hacerlo así

b = a / 350.0;
Goran Belfinger avatar Apr 25 '2013 18:04 Goran Belfinger

Específicamente, esto no es redondear el resultado, sino truncarlo hacia cero. Entonces, si divides -3/2, obtendrás -1 y no -2. ¡Bienvenidos a las matemáticas integrales! Antes de que las CPU pudieran realizar operaciones de punto flotante o la llegada de los coprocesadores matemáticos, hacíamos todo con matemáticas integrales. Aunque había bibliotecas para matemáticas de punto flotante, eran demasiado caras (en instrucciones de CPU) para fines generales, por lo que utilizamos un valor de 16 bits para la porción entera de un número y otro valor de 16 para la fracción.

EDITAR: mi respuesta me hace pensar en el clásico anciano que dice "cuando tenía tu edad..."

Daniel Santos avatar Apr 25 '2013 19:04 Daniel Santos