循环中的 C++ 浮点错误与单个表达式中的错误
C++ Floating point errors in a loop vs in a single expression
(免责声明:我知道浮点数不能精确表示十分之一。)
我在 C++ 中使用单精度浮点数(以测试舍入错误),我遇到了这种奇怪的行为。
#include <iostream>
#include <iomanip>
using namespace std;
int main(){
// set number of sigdigs in output
cout << setprecision(9);
float singleA = 0.1 * 7.;
float singleB = 0.1 + 0.1 + 0.1 + 0.1 + 0.1 + 0.1 + 0.1;
float singleC = 0.0;
for (int i = 0; i < 7; i++){
singleC += 0.1;
}
// ^ i expected that to be the same as
// 0.1 + 0.1 + 0.1 + 0.1 + 0.1 + 0.1 + 0.1
cout << "multiplied: " << singleA << endl;
cout << "added in one go: " << singleB << endl;
cout << "added in a loop: " << singleC << endl;
return 0;
}
输出:
multiplied: 0.699999988
added in one go: 0.699999988
added in a loop: 0.700000048
我想知道为什么在表达式中添加 0.1 7 次会导致与在循环中添加 0.1 7 次不同的结果。我都加了 0.1 7 次,那为什么会这样呢? singleB
是否使用 浮点数算法进行了优化?
0.1
是 double
,而不是 float
。因此,当您在表达式中添加其中的七个时,将使用双精度算法执行运算,然后将最终结果转换为单精度。在循环中,每次添加后都会丢弃额外的精度。用 0.1f
试试,你会得到相同的结果。
(免责声明:我知道浮点数不能精确表示十分之一。)
我在 C++ 中使用单精度浮点数(以测试舍入错误),我遇到了这种奇怪的行为。
#include <iostream>
#include <iomanip>
using namespace std;
int main(){
// set number of sigdigs in output
cout << setprecision(9);
float singleA = 0.1 * 7.;
float singleB = 0.1 + 0.1 + 0.1 + 0.1 + 0.1 + 0.1 + 0.1;
float singleC = 0.0;
for (int i = 0; i < 7; i++){
singleC += 0.1;
}
// ^ i expected that to be the same as
// 0.1 + 0.1 + 0.1 + 0.1 + 0.1 + 0.1 + 0.1
cout << "multiplied: " << singleA << endl;
cout << "added in one go: " << singleB << endl;
cout << "added in a loop: " << singleC << endl;
return 0;
}
输出:
multiplied: 0.699999988
added in one go: 0.699999988
added in a loop: 0.700000048
我想知道为什么在表达式中添加 0.1 7 次会导致与在循环中添加 0.1 7 次不同的结果。我都加了 0.1 7 次,那为什么会这样呢? singleB
是否使用 浮点数算法进行了优化?
0.1
是 double
,而不是 float
。因此,当您在表达式中添加其中的七个时,将使用双精度算法执行运算,然后将最终结果转换为单精度。在循环中,每次添加后都会丢弃额外的精度。用 0.1f
试试,你会得到相同的结果。