gpt4 book ai didi

循环中的 C++ 浮点错误与单个表达式中的错误

转载 作者:行者123 更新时间:2023-12-04 02:25:20 29 4
gpt4 key购买 nike

(免责声明:我知道 float 不能精确表示十分之一。)

我在 C++ 中使用单精度 float (以测试舍入错误),我遇到了这种奇怪的行为。

#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。因此,当您在表达式中添加其中的七个时,将使用 double 算法执行运算,然后将最终结果转换为单精度。在循环中,每次添加后都会丢弃额外的精度。用 0.1f 试试,你会得到相同的结果。

关于循环中的 C++ 浮点错误与单个表达式中的错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/68140195/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com