Um número de ponto flutuante IEEE-754 <1 (ou seja, gerado com um gerador de números aleatórios que gera um número> = 0,0 e <1,0) pode ser multiplicado por algum número inteiro (na forma de ponto flutuante) para obter um número igual ou maior que esse número inteiro devido ao arredondamento?
ie
double r = random() ; // generates a floating point number in [0, 1)
double n = some_int ;
if (n * r >= n) {
print 'Rounding Happened' ;
}
Isso pode ser equivalente a dizer que existe um N e R tal que, se R for o maior número menor que 1, que pode ser representado no IEEE-754, então N * R> = N (onde * e> = são apropriados IEEE- 754 operadores)
Isso vem desta pergunta com base nesta documentação e na função aleatória postgresql
numerical-analysis
floating-point
rounding
Cade Roux
fonte
fonte
Respostas:
Supondo que o arredondamento é o mais próximo e que , então N ∗ R < N sempre. (Cuidado para não converter um número inteiro muito grande.)N> 0 N∗ R < N
Seja , onde c ∈ [ 1 , 2 ) é o significando e q é o expoente inteiro. Seja 1 - 2 - s = R e derivar o limitec 2- q= N c ∈ [ 1 , 2 ) q 1 - 2- s= R
com igualdade se e somente se . O lado direito é menor que N e, como 2 - q - s é exatamente 0,5 unidades no último lugar de N , c = 1 e 2 - q - 2 - q - s é exatamente representável (uma vez que N é normal e não o menor normal), ou c > 1 , e o arredondamento mais próximo é baixo. Nos dois casos, N ∗ R é menor que Nc = 1 N 2- q- s 0,5 N c = 1 2- q- 2- q- s N c > 1 N∗ R N .
O arredondamento para cima pode causar um problema, mas nunca deve ser selecionado na presença de usuários inocentes. Aqui está uma C99 impressa
"0\n1\n"
na minha máquina.fonte