2012-06-12 8 views
0

gmp 변수에서 기계 정밀도를 얻으려고합니다. 이를 위해gmp 임의 정밀도에서 기계 정밀도를 계산하십시오

, 난 고정 정밀도와 GMP의 정확도를 계산하기 wikipedia에서 코드를 적응 그러나

int main(int argc, char **argv) 
{ 
    long int precision = 100; 

mpf_set_default_prec(precision); // in principle redundant, but who cares 

    mpf_t machEps, one, temp; // "one" is the "1" in gmp. tmp is to comparison. 
    mpf_init2(machEps, precision); 
    mpf_set_ui(machEps, 1); // eps = 1 
    mpf_init_set(one,machEps); // ensure "one" has the same precision as machEps 
    mpf_init_set(temp,machEps); // ensure "temp" has the same precision as machEps 

    do { 
     mpf_div_ui(machEps,machEps,2); // eps = eps/2 
     mpf_div_ui(temp,machEps,2); // temp = eps/2 
     mpf_add(temp,temp,one);  // temp += 1 
    } 
    while (mpf_cmp(temp,one)); // temp == 1 
    /// print the result... 
    char *t = new char[400]; 
    mp_exp_t expprt; 
    mpf_get_str(NULL, &expprt, 10, 10, machEps); 

    sprintf(t, "%se%ld", mpf_get_str(NULL, &expprt, 10, mpf_get_default_prec(), machEps), expprt); 

    printf("Calculated Machine epsilon: %s\n", t); 
    return 0; 
} 

결과는 위키의 화학식과 일치하지 않는 상기와도 변화 정밀도를 설정합니다. 내가 뭘 놓치고 있니? 나는 double과 float (C 표준)으로 시도했는데 그 결과는 정확합니다 ...

답변

2

결과는 wikipedia's formula과 일치하며 값은 정밀도에 따라 다릅니다.

그러나 값과 유효 정밀도는 사지 경계를 넘을 때만 변합니다. (1).

$ ./a.out 192 
Calculated Machine epsilon: 15930919111324522770288803977677118055911045551926187860739e-57 
$ ./a.out 193 
Calculated Machine epsilon: 8636168555094444625386351862800399571116000364436281385023703470168591803162427e-77 

비교 용 :

Prelude> 0.5^192 
1.5930919111324523e-58 
Prelude> 0.5^256 
8.636168555094445e-78 

(k-1)*64 < precision <= k*64 

대해 계산 계산기 엡실론이

0.5^(k*64) 

일부 결과 그래서 저를 위해, 즉, 64의 배수 수단 GMP 프로그램의 출력 값

0.mantissa * 10^exponent 

(1) GMP는 가수 (기지국 2) 지수가 한 쌍의 부동 소수점 수를 나타낸다 (그리고 서명) 여기서 mantissa,'e',exponent 형태이다. 가수는 부호없는 정수 배열 의 팔로 유지됩니다.. 나를 위해 팔다리는 32 비트 시스템에서 일반적으로 32 비트 (iirc) 인 64 비트입니다. 따라서 원하는 정밀도가 (k-1)*LIMB_BITS (제외)과 k*LIMB_BITS (포함) 사이 일 때 가수 배열은 k 개의 팔다리를 포함하며 모두 사용되므로 유효 정밀도는 k*LIMB_BITS 비트입니다. 그러므로 엡실론은 사지의 수가 바뀔 때만 바뀝니다.

+0

내 결과는 귀하의 동의와 일치합니다. "그러나 가치와 효과적인 정밀도는 사지 경계를 넘을 때만 변한다"는 것을 의미합니다. 대답에 대해 설명해 주시겠습니까? 분명히 그것은 내 문제 였고, 나는이 분리 된 단계가 왜 있는지 모른다. (또는 "limb-boundary"에 대한 참조) 어쨌든 덕분에 많은 도움이되었습니다! –

+0

좋아, 설명을 추가합니다. –

+0

설명이 추가되었습니다. –