online - Resultado representable de piso() y techo()
ieee float point (1)
Esto está garantizado por la construcción de números IEEE-754. (Para ser claros: C no garantiza IEEE-754, pero el siguiente análisis se aplica a todos los demás formatos de coma flotante con los que también estoy familiarizado, la propiedad crucial es que todos los números suficientemente grandes en el formato son enteros).
Recuerde que un número IEEE-754 normal tiene la forma ±1.xxx...xxx * 2^n
, donde el ancho del campo significando (la parte xxx...xxx
) está definido por el tipo del número (23 dígitos binarios para precisión simple, 52 dígitos binarios para precisión doble). Todos los números con un exponente ( n
) dentro del rango permitido son representables.
Supongamos que WLOG v
es positivo (si v
fuera negativo, podríamos intercambiar ceil
y floor
en el siguiente análisis).
Deje v
tener k
bits significativos, y escriba v
out como un número de punto fijo binario; hay tres posibilidades:
Caso 1: Todos los bits significativos son integrales. Cuando escribimos v
, parece que esto
xxxxxxxxxxxxxxxxxxxxxxxx000000...00000.0
entonces v
es un número entero, y así ceil(v) = floor(v) = v
, y así ambos son trivialmente representables.
Caso 2: todos los bits significativos son fraccionarios. Cuando escribimos v
, parece
0.000000...00000xxxxxxxxxxxxxxxxxxxxxxxx
entonces v
está en el rango [0,1), y entonces floor(v) = 0
, que es representable, y ceil(v)
es cero o uno, ambos representables.
Caso 3: v
contiene bits significativos y fraccionarios:
xxxxxxxxxxxxxx.xxxxxxxxxx
entonces floor(v)
es solo:
xxxxxxxxxxxxxx.
porque hemos desechado al menos un bit fraccionario, floor(v)
tiene como máximo k-1
bits significativos, y el mismo exponente que v
, por lo que es representable.
Si v
es un número entero, entonces ceil(v) = floor(v) = v
, entonces ceil(v)
es representable. De lo contrario, ceil(v) = floor(v) + 1
, y también tiene como máximo k-1
bits significativos y también es representable.
Para un valor arbitrario ''v'' de un tipo de coma flotante (doble flotante / doble / largo), ¿C89 garantiza que el resultado entero matemáticamente exacto de piso (v) y ceil (v) es un valor representable del tipo de ''v ¿?
¿Alguno de los estándares posteriores de C o C ++ lo garantizan?
¿IEEE 754 lo garantiza?