2009-09-19 12 views
13

Me estoy poniendo la pendiente de una línea delimitada por dos puntos¿Por qué no se cuelga? ¿No estoy dividiendo por cero aquí?

float slopeXY(CGPoint p1, CGPoint p2) 
{ 
    return ((p2.y - p1.y)/(p2.x - p1.x)); 
} 

Si le doy una línea de tamaño cero,

CGPoint p1 = CGPointMake(0, 10); 
CGPoint p2 = CGPointMake(0, 10); 

float sxy = slopeXY(p1, p2); 

no consigo un error de división por cero.

+14

pareces haber encontrado la forma de dividir por cero. Use esto con cuidado, o puede abrir un agujero en el espacio-tiempo y nuestro mundo será absorbido por el infinito. –

Respuesta

28

Con el entorno de coma flotante predeterminado en OS X, la división de coma flotante por cero no causa una trampa o excepción. 0.0/0.0 en su lugar devolverá un NaN y elevará el indicador de estado de punto flotante no válido en el fpscr. Dividir un valor distinto de cero en 0.0 devolverá un infinito y elevará el indicador de dividir por cero.

Puede comprobar estas condiciones, si es necesario, mediante el isnan() y isinf() Las funciones definidas en math.h

4

división por cero error sólo ocurre por división entera. Para flotar, normalmente obtienes infinito, a menos que el dividendo sea cero.

1

Los errores de punto flotante generalmente no generan una excepción.

1

Porque es un comportamiento indefinido. Su programa tiene permitido comportarse de cualquier manera, lo que puede incluir chocar o mostrarnos el último atisbo del universo que tan inconsideradamente destruyó dividiendo por cero.

Desde el C [99] Estándar, §6.5.5.5:

El resultado de la/operador es el cociente de la división del operando primer por el segundo; el resultado de el operador% es el resto. En ambas operaciones, si el valor del segundo operando es cero, el comportamiento está indefinido.

+4

El comportamiento * no * no está definido, porque los compiladores de OS X cumplen con el anexo F del mismo estándar. La sección F.3.1 de C [99] dice "los operadores +, -, * y/proporcionan las operaciones de agregar, restar, multiplicar y dividir de IEC 60559," y IEC60559/IEEE-754 especifica el resultado de la división por cero. –

+0

Oh. ¿Eso es solo para carrozas, entonces? – aib

Cuestiones relacionadas