Tôi có một số mã rất đơn giản:như thế nào dấu chấm động tràn xử lý iostreams
#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;
}
Khi tôi biên dịch mã này với g ++ 4.1.2 và chạy nó trên Redhat 5.10 (cùng biên dịch), tôi nhận được đầu ra :
Conversion succeeded
Conversion succeeded
Conversion failed
Conversion failed
Conversion succeeded
1
2
0
17
17
12
Khi tôi thực hiện nhị phân cùng trên Redhat Linux 6.5 (trình biên dịch 4.4.7), tôi nhận được
Conversion succeeded
Conversion succeeded
Conversion succeeded
Conversion failed
Conversion succeeded
1
2
0
1.79769e+308
12
e là gì hành vi xpected? Đáy là succeeeding trên 4.4.7 nhưng thất bại trên 4.1.2. Lỗi tràn (nhưng vẫn thay đổi giá trị) trên 4.4.7 và không thành công mà không thay đổi bất kỳ thứ gì trên 4.1.2.
Hành vi không xác định hoặc chỉ đơn giản là không chính xác trên một hay khác?
Câu hỏi hay. '>>' là gián tiếp (thông qua 'num_get') được định nghĩa theo các quy tắc của' strtold', và đối với cái thứ hai, rõ ràng là không xác định liệu dòng dưới được coi là một điều kiện lỗi hay không. Tuy nhiên, underflow là * not * được coi là một trong các điều kiện lỗi cho 'num_get'. Tôi không chắc chắn điều đó có nghĩa là nó không xác định, hoặc được xác định là trả về 0 thành công. – hvd