浮点舍入


13

是否可以将IEEE-754浮点数<1(即由随机数生成器生成,该随机数生成器生成大于等于0.0且小于1.0的数字)乘以某个整数(以浮点形式)是否等于或大于一个整数舍入该整数?

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

这可能等同于说是否存在N和R,使得如果R是小于1的最大数字(可以在IEEE-754中表示),则N * R> = N(其中*和> =是合适的IEEE- 754个运营商)

这来自于这个问题,基于此文档和PostgreSQL的随机函数


您能否说出N的范围,即它足够小以至于可以在IEEE-754双精度中精确表示吗?
2012年

@Pedro在这种特殊情况下,是的,这将是一个小整数-即10。我假设您是在说,如果N是一个非常大的整数,并且有很多有效数字,则可能无法准确表示吗?
Cade Roux 2012年

确切地说,如果,然后˚F - [R × ˚F Ñ 可以大于ř Ñfl(N)>Nfl(R×fl(N))RN
2012年

Answers:


8

假设取整为最近且,则始终N R < N。(请注意不要转换太大的整数。)N>0NR<N

,其中Ç [ 1 2 是有效数和q是整数指数。令1 2 s = R并推导界c2q=Nc[1,2)q12s=R

NR=c2q(12s)c2q2qs,

c=1N2qs0.5Nc=12q2qsNc>1NRN


向上舍入可能会引起问题,而不是在没有怀疑用户的情况下应该选择它。这是一些"0\n1\n"在我的机器上打印的C99 。

#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));
}

c2q2s2qs

2qs

谢谢,我不确定是否还缺少下一步。
Cade Roux 2012年
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.