iostreams içinde nasıl kullanılacağı: kayan nokta taşması Bazı çok basit koduna sahip
#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;
}
Ben 4.1.2 ++ g ile bu kodu derlemek ve Redhat 5.10 (aynı derleyici) çalıştırın
ben Çıktı almak : Ben Redhat Linux üzerinde aynı ikili çalıştırmak zamanConversion succeeded
Conversion succeeded
Conversion failed
Conversion failed
Conversion succeeded
1
2
0
17
17
12
6,5 (derleyici 4.4.7), ben
Conversion succeeded
Conversion succeeded
Conversion succeeded
Conversion failed
Conversion succeeded
1
2
0
1.79769e+308
12
e nedir olsun xpected davranış? Düşük akış 4.4.7'de başarılı olmakla birlikte 4.1.2'de başarısız oluyor. Taşma, 4.4.7'de başarısızlığa uğrar (fakat yine de değeri değiştirir) ve 4.1.2'de herhangi bir şeyi değiştirmeden başarısız olur.
Davranış tanımsız mı, yoksa bir tanesinde yanlış mı?
İyi soru. '>>' dolaylı olarak ('num_get' aracılığıyla) 'strtold' kurallarına göre tanımlanmıştır ve ikincisi için, alt akışın bir hata koşulu olarak ele alıp almadığı açıkça belirtilmemiş. Ancak, alt akış * değil * * num_get' için hata koşullarından biri olarak ele alınır. Bunun ne anlama geldiğinden emin değilim, ya da başarılı bir şekilde 0 geri dönüşü olarak iyi tanımlanmış. – hvd