net - math.floor c#
¿Por qué Math.Ceiling devuelve el doble? (5)
En C #, el método Math.Ceiling
devuelve un valor double
. ¿Por qué no devuelve int
?
La documentación dice sobre el valor de retorno:
El número entero más pequeño mayor o igual a a. Si a es igual a NaN, NegativeInfinity o PositiveInfinity, se devuelve ese valor.
Por lo tanto, el valor de retorno debe ser el doble, ya que NaN, NegativeInfinity y PositiveInfinity son campos de Double.
Porque el double
puede contener números mayores que int
o long
. La misma razón por la cual no hay un reparto implícito de double
a int
.
Tiene que volverse doble para estar completo. Cualquier operación matemática que involucre un NaN siempre devuelve NaN. Por lo tanto, si pasa una función NaN a techo (), uno no podría devolver NaN, ya que no hay equivalente en Int. Además, dado que Double tiene un rango más amplio, ¿qué devolvería para aquellos valores enteros fuera de rango? ¿Qué devuelve uno para +/- inf?
Math.Ceiling
puede devolver un double
o un decimal
, dependiendo del tipo pasado. En otras palabras, el tipo de salida del método coincide con el tipo de entrada (con bastante sensatez).
Podrían haber agregado una tercera sobrecarga que toma un int
y devuelve un int
, pero no habría tenido mucho sentido: la función siempre devolvería su entrada.
Pareces estar asumiendo que el propósito de Math.Ceiling
es convertir un valor de punto flotante en un entero, pero generalmente no es así como se usa.
double
tiene un rango de valor mayor que int
:
El tipo de valor doble representa un número de doble precisión de 64 bits con valores que van desde 1.79769313486232e308 negativo a 1.79769313486232e308 positivo, así como cero positivo o negativo, Intensidad positiva, Negativoinfinito y No-un-número (NaN).
Doble cumple con el estándar IEC 60559: 1989 (IEEE 754) para la aritmética binaria en coma flotante.
Ese estándar dice que el double
tiene una mantisa de 52 bits, lo que significa que puede representar cualquier número entero de hasta 52 bits de largo sin pérdida de precisión.
Por lo tanto, si la entrada es lo suficientemente grande, la salida no cabe dentro de un int
(que solo tiene 32 bits).