你们猜下面的程序会有什么输出?
#include <bits/stdc++.h>
using namespace std;
typedef long long gg;
int main(){
ios::sync_with_stdio(false);
cin.tie(0);
for(double i = 0.1; i != 1.0; i+= 0.1){
cout << i << " ";
}
return 0;
}
你可能会认为输出的结果是:
1 0.1 0.2 0.3 0.4 0.5 0.6 0.7 0.8 0.9
但是实际上的输出结果是:
0.3 5660.4 5660.5 5660.6 5660.7 5660.8 5660.9 5661 5661.1 5661.2 5661.3 5661.4 5661.5 5661.6 5661.7 5661.8 5661.9 5662 5662.1
5662.2 5662.3 5662.4 5662.5 5662.6 5662.7 5662.8 5662.9 5663 5663.1 5663.2 5663.3 5663.4 5663.5 5663.6 5663.7 5663.8 5663.9 5664
5664.1 5664.2 5664.3 5664.4 5664.5 5664.6 5664.7 5664.8 5664.9 5665 5665.1 5665.2 5665.3 5665.4 5665.5 5665.6 5665.7 5665.8 5665.9
5666 5666.1 5666.2 5666.3 5666.4 5666.5 5666.6 5666.7 5666.8 5666.9 5667 5667.1 5667.2 5667.3 5667.4 5667.5 5667.6 5667.7 5667.8
5667.9 5668 5668.1 5668.2 5668.3 5668.4 5668.5 5668.6 5668.7 5668.8 5668.9 5669 5669.1 5669.2 5669.3 5669.4 5669.5 5669.6 5669.7 5
669.8 5669.9 5670 5670.1 5670.2 5670.3 5670.4 5670.5 5670.6 5670.7 5670.8 5670.9 5671 5671.1 5671.2 5671.3 5671.4 5671.5 5671.6 5
671.7 5671.8 5671.9 5672 5672.1 5672.2 5672.3 5672.4 5672.5 5672.6 5672.7 5672.8 5672.9 5673 5673.1 5673.2 5673.3 5673.4 5673.5 5
673.6 5673.7 5673.8 5673.9 5674 5674.1 5674.2 5674.3 5674.4 5674.5 5674.6 5674.7 5674.8 5674.9 5675 5675.1 5675.2 5675.3 5675.4 5
675.5 5675.6 5675.7 5675.8 5675.9 5676 5676.1 5676.2 5676.3 5676.4 5676.5 5676.6 5676.7 5676.8 5676.9 5677 5677.1 5677.2 5677.3 5
677.4 5677.5 5677.6 5677.7 5677.8 5677.9 5678 5678.1 5678.2 5678.3 5678.4 5678.5 5678.6 5678.7 5678.8 5678.9 5679 5679.1 5679.2 5
679.3 5679.4 5679.5 5679.6 5679.7 5679.8 5679.9 5680 5680.1 5680.2 5680.3 5680.4 5680.5 5680.6 5680.7 5680.8 5680.9 5681 5681.1 5
681.2 5681.3 5681.4 5681.5 5681.6 5681.7 5681.8 5681.9 5682 5682.1 5682.2 5682.3 5682.4 5682.5 5682.6 5682.7 5682.8 5682.9 5683
5683.1 5683.2
哈哈,是不是觉得很摸不着头脑? 之所会这样,是因为在计算机内部,浮点数的表示并不是特别精确,浮点数的运算很容易产生截断误差。 即使数学上相等的的小数,由于计算机内部表示的不一致,用"!=“或”"运算符比较它们依然会认为他们不等,因此,**千万不要用!=和运算符来验证两个浮点数相等。** 作为替代,可以使用两个浮点树差的绝对值小于某个阈值来判断,通常取1e-6,程序可改为:
#include <bits/stdc++.h>
using namespace std;
typedef long long gg;
int main(){
ios::sync_with_stdio(false);
cin.tie(0);
a
for(double i = 0.1; 1.0 - i > 1e-6; i+= 0.1){
cout << i << " ";
}
return 0;
}
[嘿嘿])
|