Jak upewnić się, że nie masz problemów: Dowiedz się o problemach arytmetycznych zmiennoprzecinkowych lub zatrudnij kogoś, kto je ma, lub zachowaj zdrowy rozsądek.
Pierwszym problemem jest precyzja. W wielu językach masz „zmiennoprzecinkowe” i „podwójne” (podwójna pozycja oznacza „podwójną precyzję”), aw wielu przypadkach „zmiennoprzecinkowa” daje około 7 cyfr precyzji, a podwójna daje 15. Zdrowy rozsądek jest taki, że jeśli masz W sytuacji, gdy dokładność może być problemem, 15 cyfr jest o wiele lepszym rozwiązaniem niż 7 cyfr. W wielu nieco problematycznych sytuacjach użycie „podwójnego” oznacza, że ci się to udaje, a „float” oznacza, że nie. Załóżmy, że kapitalizacja rynkowa firmy wynosi 700 miliardów dolarów. Przedstaw to w liczbach zmiennoprzecinkowych, a najniższy bit to 65536 USD. Reprezentuj to używając podwójnego, a najniższy bit to około 0,012 centów. Więc jeśli naprawdę nie wiesz, co robisz, używasz podwójnego, a nie zmiennoprzecinkowego.
Drugi problem jest bardziej kwestią zasad. Jeśli wykonasz dwa różne obliczenia, które powinny dać ten sam wynik, często nie robią tego z powodu błędów zaokrąglania. Dwa wyniki, które powinny być równe, będą „prawie równe”. Jeśli dwa wyniki są blisko siebie, rzeczywiste wartości mogą być równe. A może nie. Musisz o tym pamiętać i powinieneś pisać i używać funkcji, które mówią, że „x jest zdecydowanie większy niż y” lub „x jest zdecydowanie mniejszy niż y” lub „x i y mogą być równe”.
Ten problem staje się znacznie poważniejszy, jeśli użyjesz zaokrąglania, na przykład „zaokrąglaj x w dół do najbliższej liczby całkowitej”. Jeśli pomnożymy 120 * 0,05, wynik powinien wynosić 6, ale otrzymamy „pewną liczbę bardzo zbliżoną do 6”. Jeśli następnie „zaokrąglisz w dół do najbliższej liczby całkowitej”, ta „liczba bardzo bliska 6” może być „nieco mniejsza niż 6” i zostać zaokrąglona do 5. Zauważ, że nie ma znaczenia, ile precyzji masz. Nie ma znaczenia, jak blisko 6 jest twój wynik, o ile jest on mniejszy niż 6.
Po trzecie, niektóre problemy są trudne . Oznacza to, że nie ma szybkiej i łatwej reguły. Jeśli twój kompilator obsługuje „długi podwójny” z większą precyzją, możesz użyć „długiego podwójnego” i zobaczyć, czy to robi różnicę. Jeśli to nie robi różnicy, oznacza to, że jesteś w porządku lub masz naprawdę trudny problem. Jeśli robi to taką różnicę, jakiej byś się spodziewał (jak zmiana na 12 miejsc po przecinku), prawdopodobnie nic ci nie jest. Jeśli to naprawdę zmienia wyniki, masz problem. Zapytaj o pomoc.