昨天我提出了一个问题,我认为是错误的。我需要将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的情况下完成这项工作?
答案 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}}时发生的事情。