C++ static_cast不正确

C++ static_cast Incorrect

提问人:juco 提问时间:12/14/2022 更新时间:12/15/2022 访问量:217

问:

我是 C++ 的新手,有以下简单的代码片段探索 C++ 的限制:

int main() {
  
  float x = 2147483000;
  int y = static_cast<int>(x);
  cout << "x: " << x << ", y: " << y;
}

为什么输出显示 x 和 y 的不同值,即使浮点值在 int 限制内,即2147483647

代码结果

x: 2.14748e+09, y: 2147483008

为什么它对 x 和 y 显示不同的值?

C++ 变量 转换 floating-accuracy static-cast

评论

2赞 sweenish 12/14/2022
它们不是不同的值,它们是(大部分)相同值的不同表示形式。
0赞 Wyck 12/14/2022
float 只给你大约 7 位十进制数字的精度。在最高有效数字和最不有效数字之间大约有 10 位小数位。float 不是那么精确。
0赞 sweenish 12/14/2022
如果它处理的是十进制数字,那将是有道理的。虽然,我认为它在为什么选择科学方面发挥了作用。一点点 iomanip,你可以得到同样的值。
1赞 Wyck 12/14/2022
有用的参考 IEEE 754 浮点数无法准确表示的第一个整数是哪个?
0赞 sweenish 12/14/2022
好的链接,让我仔细检查我的测试代码。我的打印输出确实有不同的最后一位数字。我通常讨厌这种类型的另一个原因,以及新学习者仍然坚持使用它的事实。所以,不要理会我的评论。我会把它们放在一边,因为讨论值得其他人看到。float

答:

1赞 Asjid Ali 12/14/2022 #1

我已经仔细阅读了你的问题。有一种误解,而不是错误。

发生这种情况是因为浮点数具有一定的存储能力,如果数字超过第 7 位,则最多可以存储其精度,最多 7 位小数,它将在第 7 位数字之后失去其精度。由于这个原因,输出不准确或相同。

评论

0赞 Eric Postpischil 12/15/2022
通常用于的格式不会“将其精度存储到小数点后 7 位”,因为它根本不存储小数点。此外,有些十进制数字具有七位有效数字,这些数字在从十进制到七位小数的“往返”转换中将无法生存。六是格式可以保证的最多。floatfloat
1赞 Eric Postpischil 12/15/2022 #2

为什么它对 x 和 y 显示不同的值?

用于显示指数的范围内的显示的默认转换是显示六位有效数字。float

在通常用于 IEEE-754 二进制32 的格式中,最接近 2,147,483,000 的两个可表示值是 2,147,482,880 和 2,147,483,008。因此,对于 ,一个好的 C++ 实现会将 2,147,483,000 转换为最接近的值 2,147,483,008。floatfloat x = 2147483000;float

然后设置为相同的值 2,147,483,008。int y = static_cast<int>(x);y

当 以默认格式插入到流中时,将使用六位有效数字,产生 2.14748•109floatxcout

当 插入到流中时,将显示其完整值 2,147,483,008。inty

您可以通过请求更高的精度来查看完整值。 生成“x:2147483008,y:2147483008”。std::cout << std::setprecision(99) << "x: " << x << ", y: " << y << '\n';