Un nombre à virgule flottante IEEE-754 <1 (c'est-à-dire généré avec un générateur de nombres aléatoires qui génère un nombre> = 0,0 et <1,0) peut-il être multiplié par un entier (sous forme de virgule flottante) pour obtenir un nombre égal ou supérieur à cet entier en raison de l'arrondi?
c'est à dire
double r = random() ; // generates a floating point number in [0, 1)
double n = some_int ;
if (n * r >= n) {
print 'Rounding Happened' ;
}
Cela pourrait être équivalent à dire qu'il existe un N et R tels que si R est le plus grand nombre inférieur à 1 qui peut être représenté dans IEEE-754 alors N * R> = N (où * et> = sont appropriés IEEE- 754 opérateurs)
Cela vient de cette question basée sur cette documentation et la fonction aléatoire postgresql
numerical-analysis
floating-point
rounding
Cade Roux
la source
la source
Réponses:
En supposant arrondir au plus proche et que , alors toujours. (Veillez à ne pas convertir un entier trop grand.)N ∗ R < NN>0 N∗R<N
Soit , où est la signification et est l'exposant entier. Soit et dériver la bornec ∈ [ 1 , 2 ) q 1 - 2 - s = Rc2−q=N c∈[1,2) q 1−2−s=R
avec égalité si et seulement si . Le côté droit est inférieur à et, puisque est exactement unité à la dernière place de , soit et est exactement représentable (puisque est normal et non la plus petite normale), ou , et l'arrondi le plus proche est vers le bas. Dans les deux cas, est inférieur à .c=1 N 2−q−s 0.5 N c=1 2−q−2−q−s N c>1 N∗R N
L'arrondi à la hausse peut poser un problème, non qu'il doive jamais être sélectionné en présence d'utilisateurs sans méfiance. Voici du C99 qui imprime
"0\n1\n"
sur ma machine.la source