如何在c ++中处理非常小的数字?

时间:2016-07-09 10:11:18

标签: c++ floating-point

我正在用C ++编写一个包含非常小的浮点数的程序。所以,我使用double来表示数字。但是当浮点数乘以循环时,它会导致最终乘积为0.但我需要显示实际的浮点数。我该如何处理这些数字?

class myclass
{
private :
    double value;
}

double calculate(count)
{
    double  key=this->value;
    double prev_level=pow(2,level-1);
    if(key-prev_level >=0)
        key=key-prev_level;

    int index= (2* key) + table[row_num][pos];
    double num1=array_l1[index]; // array_l1 and array_l2 are of type double
    double num2=array_l2[index];

    std::pair<double,double> p = list[key].at(row_num);
    double data=p.first;
    prod1=num1 *data;

    data=p.second;
    prod2=num2 * data;

    return prod1+prod2;
}

void compute()
{

    double prod = 1;
    for (int i = 0; i < count; i++)
    {
        myclass c1(count);
        myclass c2(count+1);
        double value= c1.calculate * c2.calculate();  

    }
}

由于尺寸的原因,我无法包含所有代码,但我希望此功能可以解释我面临的问题。随着count的值增加,value的值会减少。因此,对于count的较大值,我得到0。

如何显示value的实际值?

2 个答案:

答案 0 :(得分:3)

浮点类型使用固定大小的表示。这有两个直接影响:

  1. 通常,值无法准确表示,而是使用舍入值。
  2. 价值范围有限。
  3. 如果您需要更高的精度或更宽的范围,您将需要不同的表示。您可能需要查看What Every Computer Scientist Should Know About Floating-Point Arithmetic

答案 1 :(得分:2)

首先检查您使用的是允许科学记数法的输出格式,而不仅仅是小数点后的固定位数。

如果仍然导致零输出,请考虑求和,而不是直接乘以数字。

例如,如果目标是比较产品的比率,则可以以对数完成计算,而无需进行指数化以返回非对数世界。

如果您只需要显示结果,请选择一个大常量。在进行求幂之前,将常量的对数加到总和中,并在显示中包含常量。