2012-04-23 3 views
0

Я не смог найти ответ в Википедии (или SO) или в документации по этому очень простому вопросу.какая точность?

Какова точность числа с плавающей запятой, представленного целым числом?

Я использую обертку MPFRC++ над библиотекой с плавающей запятой произвольной точности MPFR в C++. Существует опция установить значение по умолчанию, и оно принимает целое число в качестве аргумента.

Что такое такое целое число?

например .: set_default_prec(128).

Кроме того, я проверяю sizeof на различную точность по умолчанию, но они всегда кажутся одинаковыми? Зачем?

.: например

set_default_prec (128); sizeof (mpfr :: mpreal); // 16

set_default_prec (4096); sizeof (mpfr :: mpreal); // еще 16 ...

ответ

5

set_default_prec, без сомнения, изменяет объем хранения (количество бит), выделенный для хранения данных. Для хранения десятичной цифры требуется около 3,5 бит, поэтому оттуда вы просто используете простую математику, чтобы выяснить, сколько байтов требуется для заданного количества цифр.

Насколько sizeof остается постоянной, вы, несомненно, имеют-структуру (или класс), который просто содержит указатель на фактических данных, то на этом общем порядке:

namespace mpfr { 
    struct real { 
     char *data; 
     size_t size_allocated; 
     size_t size_inuse; 
     size_t num_digits; 
    }; 
} 

При изменении точности, то изменяет значение, хранящееся в num_digits, и, возможно, размер блока, на который указывает data, но размер структуры остается постоянным.

1

Все, что вам нужно, можно найти в Google для «плавающей точки» и «точности». Например:

http://en.wikipedia.org/wiki/Floating_point

с плавающей точкой представление аналогична концепции к научной нотации. Логически число с плавающей запятой состоит из:

Подписанная цифра строки заданной длины в заданной базе (или радиусе). Эта цифровая строка называется значимым, или, реже, мантиссой (см. Ниже). Длина Значение определяет точность, которой могут быть цифры . Предполагается, что позиция точки счисления всегда равна где-то в значении - часто после или непосредственно перед самой значащей цифрой или справа от самой правой (наименьшей цифры ). Эта статья, как правило, следует за соглашением о том, что точка счисления находится сразу после самой значимой (самой левой) цифры .

Другими словами:

  1. число с плавающей точкой является «приближение», не обязательно является значением точным

  2. «точность» из числа с плавающей точкой определяет, как точная аппроксимация может быть. Больше бит означает большую точность (ваш номер «более точный»). Меньше бит означает меньшую точность (число «более округлое»).

  3. Количество «точность» может и представлено как целое число.

С MPFR веб-сайта:

http://www.mpfr.org/mpfr-current/mpfr.html#MPFR-Basics

число с плавающей точкой, или поплавок для краткости, является произвольной точности мантисса (также называемый мантиссы) с ограниченной точностью показатель. ...

Точность - это количество бит, используемых для представления значения числа с плавающей запятой; соответствующий тип данных C равен mpfr_prec_t. Точность может быть любым целым числом между MPFR_PREC_MIN и MPFR_PREC_MAX. В текущей реализации MPFR_PREC_MIN является равным 2. ...

"set_default_prec()", конечно, является механизмом для изменения точности (от "2").

+0

Но это именно несогласованность, к которой я попытался обратиться в этом вопросе. Википедия говорит «точность» = количество цифр в значении. Но MPFR говорит «точность» = количество BITS значимости. Это разные. – cmo