2011-03-28 19 views
19

¿Por qué m siempre es = 0? Los miembros xey de someClass son enteros.C++ int fundición flotante

float getSlope(someClass a, someClass b) 
{   
    float m = (a.y - b.y)/(a.x - b.x); 
    cout << " m = " << m << "\n"; 
    return m; 
} 

Respuesta

37

división de enteros se produce, entonces el resultado, que es un entero, se asigna como un flotador. Si el resultado es menor que 1, entonces termina como 0.

Querrá convertir primero las expresiones en flotantes antes de dividir, p. Ej.

float m = (float)(a.y - b.y)/(float)(a.x - b.x); 
+4

.. ¡Y tenga cuidado con la división por cero! – GrahamS

+0

@GrahamS - No es tan peligroso dividir por 0, cuando hablamos de números flotantes. Puede dividir con seguridad cualquier número de flotación por 0.0 o -0.0, le dará 'inf'. Pero sí, si es inesperado, causará problemas. –

+0

@Kiril Kirov: Sí, no causará una excepción/falla como el entero división por cero, pero te deja con '+ INF',' -INF' o 'NaN' lo que probablemente causará más el OP problemas cuando intenta usar 'm'. – GrahamS

0

que hace una división entera, lo que significa 3/4 = 0. echados uno de los soportes para flotar

(float)(a.y - b.y)/(a.x - b.x); 
0

si (ay - by) es menor que (ax - bx), m siempre es cero.

así que cállalo así.

float m = ((float)(a.y - b.y))/((float)(a.x - b.x)); 
0

Porque (ay - por) es probablemente menos (ax - bx) y en el código de la fundición se realiza después de la operación de división por lo que el resultado es un número entero de modo 0.

ha entregado flotar antes de la operación/

41

Debe usar el molde. Veo las otras respuestas, y que realmente a trabajar, pero a medida que la etiqueta es C++ me gustaría sugerir que use static_cast:

float m = static_cast< float >(a.y - b.y)/static_cast< float >(a.x - b.x);
+0

No estoy necesariamente en desacuerdo, pero los contrapuntos: (1) esto es mucho menos legible, y (2) menos portátil – notlesh

+0

@notlesh -" menos portátil "de qué manera ? –

+0

A saber, no podría ser portado directamente a C ...nuevamente, solo un contrapunto :) – notlesh

1

Debe tener en cuenta que en la evaluación de una expresión que contiene números enteros, los resultados provisionales de cada etapa de evaluación también se redondea para ser enteros. En su asignación a float m, el valor solo se convierte al tipo float capaz de números reales después de la aritmética de números enteros. Esto significa que, por ejemplo, 3/4 ya sería un valor "0" antes de convertirse en 0.0. Debe forzar la conversión para que flote antes. Usted puede hacer esto mediante el uso de la sintaxis float(value) en cualquiera de a.y, b.y, a.x, b.x, a.y - b.y, o a.x - b.x: no importa cuando se hace tanto tiempo como uno de los términos es un flotador antes de que ocurra la división, por ejemplo,

float m = float(a.y - b.y)/(a.x - b.x); 
float m = (float(a.y) - b.y)/(a.x - b.x); 
...etc... 
0

Está realizando cálculos en enteros y asignando su resultado a flotación. Así que el compilador está convirtiendo implícitamente su resultado entero en float