İ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
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.
Neden yok't üstel bir artış içine...
Neden kayan nokta sayıları sıfır imzal...
Nasıl CSS ile kayan nokta üst yapabili...
Güvenli C 0 için eşitlik için kayan no...
Sütun kullanarak MySQL sorgu tümcesi b...