SORU
22 EYLÜL 2011, PERŞEMBE


İyileştirme etkinleştirilmiş farklı kayan nokta sonucu derleyici hata?

Aşağıdaki kodu en iyi duruma getirme olmadan ve Visual Studio 2008 üzerinde çalışır. Ama sadece en iyi duruma getirme (O0) olmadan g üzerinde çalışıyor.

#include <cstdlib>
#include <iostream>
#include <cmath>

double round(double v, double digit)
{
 double pow = std::pow(10.0, digit);
 double t = v * pow;
 //std::cout << "t:" << t << std::endl;
 double r = std::floor(t   0.5);
 //std::cout << "r:" << r << std::endl;
 return r / pow;
}

int main(int argc, char *argv[])
{
 std::cout << round(4.45, 1) << std::endl;
 std::cout << round(4.55, 1) << std::endl;
}

Çıkış olmalıdır: 4.5 4.6

Ama g optimizasyonu (O1 - O3) ile çıkış 4.5 4.5

ben t önce uçucu anahtar kelime eklemek için çalışıyor, bu yüzden optimizasyon bir tür virüs olabilir mi?

4.1.2 ve 4.4.4 g Test.

Düzenleme:

Burada ideone sonucu: http://ideone.com/Rz937

Ve g İ test seçeneği basit: g -O2 round.cpp

Edit2:

Daha ilginç bir sonuç, hatta /fp:Visual Studio üzerinde hızlı seçeneği açın 2008, sonuç yine doğrudur.

Sorum:

Merak ediyordum, her zaman-ffloat-mağaza seçeneği açmak gerekir?

G sürümü için test edilmediOtomotiv ile birlikte 5 Redhat/CentOS ve Redhat 6/.

Bu platformlarda birçok programlarım, benim program içinde beklenmedik hatalar neden olacak endişe duyuyorum derlenmiş. Biraz zor böyle bir sorun olup olmadığını C kodunu ve kullanılan kütüphaneleri araştırmak gibi görünüyor. Herhangi bir öneri?

Edit3:

Kimse bile /fp:hızlı açık, Visual Studio 2008 hala çalışıyor neden ilgileniyor? VS2008 g daha bu soruna daha güvenilir gibi görünüyor ?

CEVAP
22 EYLÜL 2011, PERŞEMBE


Intel x 86 işlemci double normalde 64-bit geniş ise içten 80-bit genişletilmiş hassasiyet kullanın. Farklı optimizasyon seviyeleri CPU kayan nokta değeri hafızaya kaydedilmiş nasıl etkiler ve 80-bit 64-bit hassasiyet için hassas yuvarlak böylece.

-ffloat-store gcc seçeneği farklı optimizasyon seviyeleri ile aynı kayan noktalı sonuçlar elde etmek için kullanın.

Alternatif olarak, gcc 64-bit hassasiyet 80-bit, yuvarlama önlemek için normalde 80-bit genişliğinde olan long double türünü kullanın.

man gcc her şeyi söylüyor:

   -ffloat-store
       Do not store floating point variables in registers, and inhibit
       other options that might change whether a floating point value is
       taken from a register or memory.

       This option prevents undesirable excess precision on machines such
       as the 68000 where the floating registers (of the 68881) keep more
       precision than a "double" is supposed to have.  Similarly for the
       x86 architecture.  For most programs, the excess precision does
       only good, but a few programs rely on the precise definition of
       IEEE floating point.  Use -ffloat-store for such programs, after
       modifying them to store all pertinent intermediate computations
       into variables.

Bunu Paylaş:
  • Google+
  • E-Posta
Etiketler:

YORUMLAR

SPONSOR VİDEO

Rastgele Yazarlar

  • akalyne

    akalyne

    13 Mayıs 2009
  • Blue Lightning TV

    Blue Lightni

    9 EKİM 2011
  • Eric Enge

    Eric Enge

    2 Kasım 2009