MPFR: как сделать точную копию mpfr_t? - PullRequest
0 голосов
/ 23 апреля 2020

Я просто застрял в том, как сделать точную копию mpfr_t с MPFR 3.1.4: та же точность, точно такое же значение, без округления.

void copy (mpfr_t x)
{
    mpfr_t y;
    mpfr_init2 (y, mpfr_get_prec (x));
    // Bummer: mpfr_set will round.
}

1 Ответ

1 голос
/ 24 апреля 2020

Лучше всего использовать mpfr_set после установки точности, как вы это сделали. Округления не будет, или, если вы предпочитаете, операция округления не изменит значение. Если значение равно NaN, его знаковый бит не будет скопирован, но вам, вероятно, все равно (и если вам действительно важно, вы все равно можете скопировать знаковый бит с помощью mpfr_copysign).

Не копировать mpfr_t с memcpy или что-то подобное. После этой копии вы получите то же значение, но значение и будет разделено обоими числами (так как одно поле является указателем на значение и), а изменение одного из этих чисел изменит другое, и вы получите еще более ошибочное поведение c (возможно cra sh ...) в случае, если число изменяется на специальное значение (NaN, ± Inf, ± 0) или изменяется его точность.

...