Я пытаюсь получить точность машины на 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 standard), и результат правильный ...
Хорошо, мои результаты согласуются с вашими. Что означает «Однако значение и эффективная точность - только изменяются при пересечении границы конечности». Можете ли вы объяснить ответ? по-видимому, это была моя проблема, я не знаю, почему существуют эти дискретные шаги. (или любая ссылка на «граница конечности») Спасибо, в любом случае, многое помогло! –
Хорошо, добавит объяснение. –
Пояснение добавлено. –