Próbuję przenieść kod Javy do C++. Natknąłem się na dziwne zachowanie. Nie mogę uzyskać podwójnego dodatku do pracy (nawet jeśli opcja kompilacji/fp: strict oznacza, że "poprawna" zmiennoprzecinkowa matematyka jest ustawiona w Visual Studio 2008).Dlaczego liczby podwójne są niepoprawnie dodane w konkretnym projekcie programu Visual Studio 2008?
double a = 0.4;
/* a: 0.40000000000000002, correct */
double b = 0.0 + 0.4;
/* b: 0.40000000596046448, incorrect
(0 + 0.4 is the same). It's not even close to correct. */
double c = 0;
float f = 0.4f;
c += f;
/* c: 0.40000000596046448 too */
W innym projekcie testowym, który skonfigurowałem, działa poprawnie (/ fp: strict zachowuje się zgodnie z IEEE754).
Korzystanie z Visual Studio 2008 (standard) bez opcji Optymalizacja i FP: ścisły.
Wszelkie pomysły? Czy naprawdę przycina się do pływaków? Ten projekt naprawdę wymaga takiego samego zachowania zarówno po stronie java, jak i C++. Mam wszystkie wartości, czytając z okna debugowania w VC++.
Rozwiązanie: _fpreset(); // Pomysł Barry Kelly rozwiązał to. Biblioteka ustawiła precyzję FP na niską.
Czy możesz zamieścić mały kompletny program testowy wraz z wiersza polecenia używanego do kompilacji (patrz okno wyjściowe itp.), Który pokazuje problem? Jedyny sposób, w jaki mogę się rozmnażać, to użycie zamiast tego 0,0f + 0,4f. –
Czy możemy przyjąć, że wiesz o niedokładności typów zmiennoprzecinkowych? Dokładność z dokładnością do 7 miejsc po przecinku jest zwykle uważana za prawidłową, ponieważ domyślna precyzja drukowania wynosi 6. –
@Evan, jego przykład jest wyłączony o więcej, niż wynikałoby to z niedokładności zmiennoprzecinkowej. – Kevin