gpt4 book ai didi

c++ - iostreams中如何处理浮点溢出

转载 作者:可可西里 更新时间:2023-11-01 17:57:41 30 4
gpt4 key购买 nike

我有一些非常简单的代码:

#include <iostream>
#include <sstream>
using namespace std;

int main()
{
stringstream is("1.0 2.0 1e-500 1e500 12.0");
double d = {17.0, 17.0, 17.0, 17.0, 17.0};

for (int i=0; i < 5; ++i)
{
if (is >> d[i])
{
cout<<"Conversion succeeded"<<endl;
}
else
{
cout<<"Conversion failed"<<endl;
is.clear();
}
}
for (int i=0; i < 5; ++i) cout<<d[i]<<endl;
}

当我用 g++ 4.1.2 编译这段代码并在 Redhat 5.10(相同的编译器)上运行它时,我得到了输出:

Conversion succeeded
Conversion succeeded
Conversion failed
Conversion failed
Conversion succeeded
1
2
0
17
17
12

当我在 Redhat Linux 6.5(编译器 4.4.7)上执行相同的二进制文件时,我得到

Conversion succeeded
Conversion succeeded
Conversion succeeded
Conversion failed
Conversion succeeded
1
2
0
1.79769e+308
12

预期的行为是什么?下溢在 4.4.7 上成功但在 4.1.2 上失败。溢出在 4.4.7 上失败(但仍然更改值),在 4.1.2 上失败但没有更改任何内容。

行为是否未定义或只是不正确?

最佳答案

根据 C++11 22.4.2.1.2,转换应该因溢出而不是下溢而失败。在溢出的情况下,它仍然应该给出最大可表示值的值以及设置failbit

因此您更新的编译器具有正确的现代行为。

然而,你们两个古老的编译器都比 C++11 早很多年。在早期的标准中,转换被指定为如果 scanf 会给出错误;并且在出现错误时不给出值。转向 C 标准,scanf 遵循 strtod,后者又指定了溢出时的错误;但是否存在下溢错误是实现定义的。

因此您的旧编译器与历史行为一致。

关于c++ - iostreams中如何处理浮点溢出,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25810723/

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