2014-09-12 23 views
8

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 zaman

Conversion 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ı?

+0

İ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

cevap

3

C++ 11 22.4.2.1.2'ye göre, dönüştürme taşma için başarısız olmalı, ancak taşma yapılmamalıdır. Taşma durumunda, en büyük gösterilebilir değerin yanı sıra failbit'un ayarlanması gerekir.

Daha yeni derleyiciniz doğru modern davranışa sahip. Bununla birlikte, eski derleyicileriniz her ikisi de C++ 11'i uzun yıllar öncesine dayanmaktadır. Önceki standartlarda, dönüşüm scanf; ve hata durumunda bir değer vermemek. C standardına dönersek, scanf, strtod'a karşılık gelir ve bu da taşma üzerinde bir hata belirtir; Ancak, yetersiz akışta bir hata var mı, uygulama tanımlı.

Eski derleyiciniz tarihsel davranışlarla tutarlı.

İlgili konular