在双C ++中存储大的十进制数

时间:2014-11-27 20:52:09

标签: c++

昨天我提出了一个问题,我认为是错误的。我需要将10e-16存储在变量中。仅此一项有效,但只要我需要从另一个double值中减去它,该数字就不会发生变化。它只有在我将10e-16的值更改为10e-4之类的内容时才会开始工作。任何较低的数字似乎都不起作用。我尝试过使用long double,但无济于事。我不需要cout.precision(),因为我还不需要打印这个号码,我需要它循环播放。

long double x1 = -400, epsilon = 0.000000000000001;
long double x2 = -400 + epsilon;
vector <vector <double> > intervals;
vector <double> interval;


while(x1<=650){
    interval.clear();
    if(f1(x1)<0){
        while(f1(x2) <= 0){
            x2 += epsilon;
        }
        while(f1(x1)<0){
            x1 += epsilon;
        }
        x1 -= epsilon;
        interval.push_back(x1);
        interval.push_back(x2);
        intervals.push_back(interval);
        x1=x2;
        x2=x1 + epsilon;
    }

这就是循环的样子。函数f1返回非线性方程的值。我尝试过使用GMP,但我在安装时遇到了问题,我在另一个问题上提到了这个问题。有没有办法在不使用GMP的情况下完成这项工作?

1 个答案:

答案 0 :(得分:1)

假设你代表一个大整数,比如123,456,123,456,代表六位有效数字。你得到:

123,456,000,000

然后你加1,得到结果123,456,000,001。如果您将此表示为六位有效数字,则会得到:

123,456,000,000

如果再次添加1到123,456,000,000,则结果为六位有效数字:

123,456,000,000

等永远。

如果您要添加的号码低于您认为重要的号码的阈值,您可以看到您可以根据需要多次添加该号码,结果将永远不会改变。这实际上是您尝试从非常大的double中减去非常小的{{1}}时发生的事情。