2011-12-10 6 views
6

estoy tratando de producir un flotador dividiendo dos int s en mi programa. Esto es lo que cabe esperar:división c Objetivo de dos enteros

1/120 = 0,00833

aquí es el código que estoy usando:

float a = 1/120; 

Sin embargo, no me da el resultado yo esperaría . Al imprimir a cabo consigo el siguiente:

inf 
+3

¿Cómo se imprime un valor flotante a la consola? A menos que esté imprimiendo NSLog (@ "inf"); o printf ("inf"); no puede obtener inf impreso en la consola. – 0x8badf00d

+0

@ 0x8badf00d: Sí, usted (probablemente) puede: 'printf ("% g \ n", 1.0/0.0);' –

Respuesta

11

Haz lo siguiente

float a = 1./120. 
+1

Personalmente, encuentro '1.0/120.0' más claro que' 1./120.' –

7

Es necesario especificar que desea utilizar aritmética de punto flotante.

Hay algunas maneras de hacer esto:

  • Si realmente está interesado en dividir dos constantes, se puede especificar que desea aritmética de punto flotante, haciendo que el primera un flotador constante (o doble) Todo lo que necesita es un punto decimal.

    float a = 1./120; 
    

    No es necesario para hacer la segunda constante de un flotador, aunque no se pierde nada de nada.

  • Francamente, esto es bastante fácil pasar por alto así que te sugiero añadir un cero al final y un poco de distancia.

    float a = 1.0/120; 
    
  • Si realmente quiere hacer los cálculos con una variable entera, puede escribir echarlo:

    float a = (float)i/120; 
    
5
float a = 1/120; 
float b = 1.0/120; 
float c = 1.0/120.0; 
float d = 1.0f/120.0f; 

NSLog(@"Value of A:%f B:%f C:%f D:%f",a,b,c,d); 

Output: Value of A:0.000000 B:0.008333 C:0.008333 D:0.008333 

Por variable float a: INT/int rendimientos número entero el cual está asignando a flotar e imprimirla de manera 0.0000000

Por variable float b: los rendimientos del flotador/int flotan, asignando a fl avena e imprimirla 0,008333

Para variable float c: rendimientos flotador/flotador flotan, por lo 0,008333

último es flotador más precisa. Los anteriores son de tipo doble: todos los valores de coma flotante se almacenan como tipos de datos dobles, a menos que el valor vaya seguido de una 'f' para especificar específicamente un flotante en lugar de un doble.

3

En C (y por lo tanto también en Objective-C), las expresiones casi siempre se evalúan sin tener en cuenta el contexto en el que aparecen.

La expresión 1/120 es una división de dos operandos int, por lo que arroja un resultado de int. La división entera trunca, por lo 1/120 produce 0. Se evalúa el hecho de que el resultado se utiliza para inicializar un objeto float no cambia la forma en 1/120.

Esto puede ser contrario a la intuición, a veces, sobre todo si estás acostumbrado a la forma general calculadoras trabajar (que suelen almacenar todos los resultados en coma flotante).

Como han dicho las otras respuestas, para obtener un resultado cercano a 0.00833 (que no puede representarse exactamente, BTW), necesita hacer una división de coma flotante en lugar de una división entera, haciendo una o ambas de los operandos punto flotante. Si un operando es flotante y el otro es un entero, el operando entero se convierte primero a punto flotante; no hay punto flotante directo por operación de división entera.

Tenga en cuenta que, como dice @ 0x8badf00d de comentario, el resultado debería ser 0. Otra cosa que debe estar pasando mal para el resultado impreso para ser inf. Si puede mostrarnos más código, preferiblemente un pequeño programa completo, podemos ayudarlo a resolverlo.

(Hay idiomas en los que la división entera produce un resultado de coma flotante. Incluso en esos idiomas, la evaluación no se ve necesariamente afectada por su contexto. Python versión 3 es uno de esos idiomas; C, Objective-C, y Python versión 2 no lo son.)