Dapatkah nomor floating point IEEE-754 <1 (yaitu dihasilkan dengan generator angka acak yang menghasilkan angka> = 0,0 dan <1.0) pernah dikalikan dengan beberapa bilangan bulat (dalam bentuk floating point) untuk mendapatkan angka yang sama atau lebih besar dari integer itu karena pembulatan?
yaitu
double r = random() ; // generates a floating point number in [0, 1)
double n = some_int ;
if (n * r >= n) {
print 'Rounding Happened' ;
}
Ini mungkin sama dengan mengatakan bahwa apakah ada N dan R sedemikian rupa sehingga jika R adalah angka terbesar kurang dari 1 yang dapat direpresentasikan dalam IEEE-754 maka N * R> = N (di mana * dan> = sesuai IEEE- 754 operator)
Ini berasal dari pertanyaan ini berdasarkan pada dokumentasi ini dan fungsi acak postgresql
numerical-analysis
floating-point
rounding
Cade Roux
sumber
sumber
Jawaban:
Dengan asumsi bulat ke terdekat dan bahwa , maka N ∗ R < N selalu. (Hati-hati untuk tidak mengonversi bilangan bulat yang terlalu besar.)N>0 N∗R<N
Misalkan , dengan c ∈ [ 1 , 2 ) adalah signifikan dan q adalah eksponen bilangan bulat. Biarkan 1 - 2 - s = R dan turunkan batasnyac2−q=N c∈[1,2) q 1−2−s=R
dengan persamaan jika dan hanya jika . Sisi kanan kurang dari N dan, karena 2 - q - s adalah tepat 0,5 unit di tempat terakhir N , baik c = 1 dan 2 - q - 2 - q - s persis dapat direpresentasikan (karena N adalah normal dan bukan yang terkecil normal), atau c > 1 , dan pembulatan terdekat turun. Dalam kedua kasus, N ∗ R kurang dari Nc=1 N 2−q−s 0.5 N c=1 2−q−2−q−s N c>1 N∗R N .
Pembulatan ke atas dapat menyebabkan masalah, bukan karena itu harus dipilih di hadapan pengguna yang tidak curiga. Inilah beberapa C99 yang dicetak
"0\n1\n"
pada mesin saya.sumber