부동 소수점 반올림


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' ;
}

이는 R이 1보다 작은 가장 큰 숫자 인 경우 IEEE-754로 표현 될 수있는 N * R> = N (여기서 * 및> =은 적절한 IEEE- 754 연산자)

이것은 이 문서 와 postgresql 랜덤 함수를 기반으로 한이 질문 에서 나옵니다.


N의 범위에 대해 말할 수 있습니까? 즉, IEEE-754 배정 밀도로 정확하게 표현하기에 충분히 작습니까?
페드로

@Pedro이 특별한 경우에, 그것은 작은 정수일 것입니다. 즉, 10입니다. N이 매우 큰 수의 유효 자릿수를 가진 매우 큰 정수라면 정확하게 표현할 수 없을 것이라고 말하고 있다고 가정합니다.
Cade Roux

정확하게, , f l ( R × f l ( N ) )R N 보다 클 수있다 . fl(N)>Nfl(R×fl(N))RN
페드로

답변:


8

가정 라운드 - 가까운 그 N * R < N 항상. (너무 큰 정수는 변환하지 않도록주의하십시오.)N>0NR<N

이라고하자 . 여기서 c [ 1 , 2 ) 는 의미가 있고 q 는 정수 지수입니다. 하자 (1) - 2 - S = R 과 결합을 유도c2q=Nc[1,2)q12s=R

NR=c2q(12s)c2q2qs,

경우에만 동등합니다 . 우변 미만이고 N 및 이후 2 - Q - S가 정확히 0.5 의 최종 위치에있는 단위 N , 어느 C = 12 - Q - 2 - Q - 때문에 (정확하게 표현할 수있다 N은 정상 가장 작은 법선이 아님) 또는 c > 1 이고 가장 가까운 반올림이 내려갑니다. 두 경우 모두 N * RN 보다 작습니다.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));
}

죄송합니다, 요즘 조금 느립니다-불평등의 일부를 얻는 데 어려움을 겪고 있습니다
22에스2에스
Cade Roux

@Cade 분명히 나는 ​​오늘 대수를 할 수 없다. 내말은2에스.
Tyrone

감사합니다. 누락 된 다른 단계가 있는지 확실하지 않았습니다.
Cade Roux
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.