浮点舍入


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>0N∗R<N

让,其中Ç ∈ [ 1 ,2 )是有效数和q是整数指数。令1 − 2 − s = R并推导界c2−q=Nc∈[1,2)q1−2−s=R

NR=c2−q(1−2−s)≤c2−q−2−q−s,

c=1N2−q−s0.5Nc=12−q−2−q−sNc>1N∗RN。


向上舍入可能会引起问题,而不是在没有怀疑用户的情况下应该选择它。这是一些"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));
}

−c2−q2−s≤−2−qs

2−q−s

谢谢,我不确定是否还缺少下一步。
— 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.