¿Se puede multiplicar un número de punto flotante IEEE-754 <1 (es decir, generado con un generador de números aleatorios que genera un número> = 0.0 y <1.0) por algún número entero (en forma de punto flotante) para obtener un número igual o mayor que ese entero debido al redondeo?
es decir
double r = random() ; // generates a floating point number in [0, 1)
double n = some_int ;
if (n * r >= n) {
print 'Rounding Happened' ;
}
Esto podría ser equivalente a decir que existe un N y R tales que si R es el número más grande menor que 1 que puede representarse en IEEE-754, entonces N * R> = N (donde * y> = son IEEE- apropiados 754 operadores)
Esto viene de esta pregunta basada en esta documentación y la función aleatoria postgresql
numerical-analysis
floating-point
rounding
Cade Roux
fuente
fuente
Respuestas:
Suponiendo redondear al más cercano y que , entonces N ∗ R < N siempre. (Tenga cuidado de no convertir un número entero que sea demasiado grande).N>0 N∗R<N
Sea , donde c ∈ [ 1 , 2 ) es el significado y q es el exponente entero. Deje 1 - 2 - s = R y derive el límitec2−q=N c∈[1,2) q 1−2−s=R
con igualdad si y solo si . El lado derecho es menor que N y, dado que 2 - q - s es exactamente 0.5 unidades en el último lugar de N , c = 1 y 2 - q - 2 - q - s es exactamente representable (ya que N es normal y no el más pequeño normal), o c > 1 , y el redondeo más cercano está abajo. En ambos casos, N ∗ R es menor que Nc=1 N 2−q−s 0.5 N c=1 2−q−2−q−s N c>1 N∗R N .
El redondeo ascendente puede causar un problema, no siempre que deba seleccionarse en presencia de usuarios desprevenidos. Aquí hay algunos C99 que se imprimen
"0\n1\n"
en mi máquina.fuente