Czy liczba zmiennoprzecinkowa IEEE-754 <1 (tj. Generowana za pomocą generatora liczb losowych, który generuje liczbę> = 0,0 i <1,0) może być kiedykolwiek pomnożona przez jakąś liczbę całkowitą (w postaci zmiennoprzecinkowej), aby uzyskać liczbę równą lub większą niż ta liczba całkowita z powodu zaokrąglenia?
to znaczy
double r = random() ; // generates a floating point number in [0, 1)
double n = some_int ;
if (n * r >= n) {
print 'Rounding Happened' ;
}
Może to być równoważne stwierdzeniu, że istnieje N i R, tak że jeśli R jest największą liczbą mniejszą niż 1, która może być reprezentowana w IEEE-754, to N * R> = N (gdzie * i> = są odpowiednie IEEE- 754 operatorów)
Wynika to z tego pytania opartego na tej dokumentacji i losowej funkcji postgresql
numerical-analysis
floating-point
rounding
Cade Roux
źródło
źródło
Odpowiedzi:
Zakładając, że zaokrąglenie do najbliższego i że , to zawsze N ∗ R < N zawsze. (Uważaj, aby nie przekonwertować liczby całkowitej, która jest zbyt duża).N>0 N∗R<N
Niech , gdzie c ∈ [ 1 , 2 ) jest znaczeniem, a q jest wykładnikiem liczby całkowitej. Niech 1 - 2 - s = R i wyprowadź granicęc2−q=N c∈[1,2) q 1−2−s=R
Zaokrąglanie w górę może powodować problem, nie dlatego, że należy go zawsze wybierać w obecności niczego niepodejrzewających użytkowników. Oto niektóre C99, które drukuje
"0\n1\n"
na moim komputerze.źródło