VS C++ 2010 kompilator

0

Dlaczego program w C++ z VS po dzieleniu przez zero jedzie zwyczajnie jakby nic się stało?
I co to znaczy: fast, precise i strict, w ustawieniach dla obliczeń na rzeczywistch?

Czy to fast optymalizuje jakoś niebezpiecznie, przesadnie?
Np. wyrażenie:
x = a + (b-a);

zostanie zredukowane do x = b; ?

0

Dlaczego program w C++ z VS po dzieleniu przez zero jedzie zwyczajnie jakby nic się stało?
Pics or it didn't happen.

I co to znaczy: fast, precise i strict, w ustawieniach dla obliczeń na rzeczywistch?

Nie ma żadnych „przesadnych” czy „niebezpiecznych” optymalizacji. Generalnie jeśli w programie ważna jest wydajność, ustaw na fast. Jeśli nie, to nie zawracaj sobie tym głowy.

Przykładowo, przy "fast" wywołanie funkcji sqrt() może zostać zastąpione jedną instrukcją procesora (sqrtsd albo fsqrt) a przy "precise" będzie to wywołanie rzeczywistej funkcji, która implementuje algorytm obliczania pierwiastka niejako „software'owo”. Niby to dokładniej - ale na pewno wolniej.

Ustawienie "fast" jest bezpieczne na tyle, że na pewno nie dostaniesz że 2+2=5. A potrafi być znacząco szybsze.

0
Azarien napisał(a):

Dlaczego program w C++ z VS po dzieleniu przez zero jedzie zwyczajnie jakby nic się stało?
Pics or it didn't happen.

Co znaczy ten gryps?

Normalizowałem wektory i tam trafił się zerowy: v = (0,0,0);
i potem głupoty program produkował, bo mnożyłem tam potem przez jakieś te 'nieliczby' z podzielenia przez zero,
i się nie zatrzymywał, w ogóle nic się nie działo, po prostu wykonywał operacje na tych nieliczbach:

chyba wg takich reguł:
nieliczba * liczba = nieliczba
fun(nieliczba) = nieliczba, itd.

Zatem gdzie i jak ustawić żeby się wywalał tradycyjnie na błędnych operacjach, typu 7.0/0, arcsin(5), sqrt(-56), ... ?

0

Pokaż przykład kodu (cały program, konsolowy, do skompilowania i uruchomienia), który powinien się wywalić a się nie wywala.

Dodaj na początku:

_clearfp();
_controlfp(_EM_ZERODIVIDE, _MCW_EM);

ale nie lepiej po prostu sprawdzać

if (dzielnik == 0.0)
   błąd("nie da się");

zamiast bawić się w wyjątki?

0

A nie da rady ustawić tego w kompilacji?

W dowolnym kompilatorze, np. C++ Borlanda program się wywala,
a jeśli chcę to złapać wtedy definiujemy matherr i tam obsługujemy błędy, przynajmniej te z funkcji sin, arc, sqrt...
a te z dzielenia, to chyba signal obsługuje, te catch w c++ chyba tego nie łapie.

1 użytkowników online, w tym zalogowanych: 0, gości: 1