什么是精度?

时间:2012-04-23 18:41:19

标签: c++ precision mpfr

我无法在维基百科(或SO)或文档中找到这个非常简单的问题的答案。

浮点数的精度如何用整数表示?

我在MPFRC++中的任意精度浮点库MPFR上使用包装器C++。可以选择设置默认精度,它以整数作为参数。

这样的整数是什么意思?

例如:set_default_prec(128)

另外,我检查sizeof的各种默认精度,但它们似乎总是相同?为什么呢?

e.g:

set_default_prec(128); 的sizeof(MPFR :: mpreal); // 16

set_default_prec(4096); 的sizeof(MPFR :: mpreal); //还是16 ......

2 个答案:

答案 0 :(得分: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 :(得分:1)

你想要的一切都可以通过谷歌搜索找到“浮点”和“精度”。例如:

  

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

     

浮点表示在概念上与科学相似   符号。逻辑上,浮点数包括:

     

给定基数(或基数)中给定长度的有符号数字字符串。该数字字符串称为有效数字,   系数或较少的尾数(见下文)。的长度   有效数决定了数字的精确度   表示。假定小数点位置始终为   在有效数字内的某个地方 - 通常在之后或之前   最重要的数字,或最右边的数字(最少)   重要的数字。本文一般将遵循惯例   基数点位于最重要点之后(最左侧)   数字。

换句话说:

  1. 浮点数是“近似值”,不一定是完全

  2. 浮点数的“精度”决定了近似值的准确程度。更多位意味着更高的精度(您的数字更“精确”)。较少的位意味着较低的精度(数字“更圆润”)。

  3. “精度”的数量可以并且表示为整数。

  4. 来自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”开始)。