Kayan nokta yuvarlama


13

Bir IEEE-754 kayan nokta sayısı <1 (yani, = = 0,0 ve <1,0 olan bir sayı üreten rasgele sayı üreteci ile üretilir), eşit veya daha büyük bir sayı elde etmek için bir tamsayı (kayan nokta biçiminde) ile çarpılabilir mi? yuvarlama nedeniyle tamsayı?

yani

double r = random() ; // generates a floating point number in [0, 1)
double n = some_int ;
if (n * r >= n) {
    print 'Rounding Happened' ;
}

Bu, R'nin IEEE-754'te temsil edilebilen 1'den küçük en büyük sayı olması durumunda N * R> = N (burada * ve> = uygun IEEE- 754 operatör)

Bu , bu belgeye ve postgresql rastgele işlevine dayanan bu sorudan gelir.


N aralığı hakkında bir şey söyleyebilir misiniz, yani tam olarak IEEE-754 çift kesinlikte temsil edilecek kadar küçük mü?
Pedro

@Pedro Bu özel durumda, evet, bu küçük bir tamsayı olacaktır - yani 10. N'nin çok fazla sayıda anlamlı basamağa sahip çok büyük bir tamsayı olduğunu ve tam olarak temsil edilemeyeceğini söylüyorsunuz?
Cade Roux

Tam olarak, , daha büyük olabilir . fl(N)>Nfl(R×fl(N))RN
Pedro

Yanıtlar:


8

En yakın yuvarlama ve , o zaman daima. (Çok büyük bir tamsayıyı dönüştürmemeye dikkat edin.)N>0NR<N

Let , significand ve tam sayı üssüdür. Let ve bağlı türetmekc2q=Nc[1,2)q12s=R

NR=c2q(12s)c2q2qs,

ancak ise eşitlikle . Sağ taraf küçüktür ve son yerinde tam olarak birim olduğundan , ve tam olarak temsil edilebilir ( normal olduğundan ve en küçük normal olmadığından) veya ve en yakın yuvarlama aşağı doğrudur. Her iki durumda da, daha az .c=1N2qs0.5Nc=12q2qsNc>1NRN


Yukarı doğru yuvarlama, soruna neden olmayan kullanıcıların varlığında seçilmesi gerektiği için bir soruna neden olabilir. İşte makineme yazdırılan bazı C99 "0\n1\n".

#include <fenv.h>
#include <math.h>
#include <stdio.h>

int main(void) {
    double n = 10;
    double r = nextafter(1, 0);
    printf("%d\n", n == (n * r));
    fesetround(FE_UPWARD);
    printf("%d\n", n == (n * r));
}

Üzgünüm, bu günlerde biraz yavaşım Eşitsizliğin bir kısmını elde etmekte sorun yaşıyorum
c2q2s2qs
Cade Roux

@ Görünüşe göre bugün cebir yapamıyorum. demek istedim . 2qs
Tyrone

Teşekkürler, kaçırdığım başka bir adım olup olmadığından emin değildim.
Cade Roux
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.