Programowanie w C: Napraw pętle i precyzję zmiennoprzecinkową w tabelach konwersji

7

Napisanie prostego konwertera temperatury wydaje się trywialnym zadaniem, dopóki nie uświadomisz sobie, jak łatwo może złamać leżącą u jego podstaw logikę. Zaczynasz od pętli „while”, drukujesz tabelę konwersji Fahrenheita na Celsjusza i wszystko wydaje się prawidłowe. Ale wtedy potrzebujesz konkretnego punktu danych – na przykład temperatury ludzkiego ciała – i nagle czysty kod zamienia się w koszmar debugowania.

Tutaj przyjrzymy się realiom działania pętli w C, dlaczego precyzja jest ważna i jak zapobiec zawieszaniu się programów.

Podstawy: pętle całkowite

Spójrzmy na najprostszą wersję. Chcesz wyprowadzić tabelę od 0 do 100 stopni Fahrenheita z przyrostem co 10. Używasz licznika całkowitego typu „int” o nazwie „a”.

Uruchom ten kod, a otrzymasz schludną siatkę:

Kod jest funkcjonalny. Jest szybki. Ale on jest brzydki. Dlaczego? Ponieważ dzielenie liczb całkowitych obcina część ułamkową. Wyrażenie (a - 32) * 5 / 9 odrzuca część ułamkową przed wyjściem. Jeśli potrzebujesz precyzji, potrzebujesz liczb zmiennoprzecinkowych.

Precyzja zmiennoprzecinkowa

Przełączenie na „float” zmienia matematykę. Należy także zmienić specyfikator formatu z %d na %f. Poniższy kod wykorzystuje %6.2f, które nakazuje wyjściu zarezerwować sześć pozycji, zachowując dwie cyfry po przecinku.

Dane wyjściowe zawierają teraz rzeczywiste miejsca po przecinku. Wygląda profesjonalnie. Ale co, jeśli potrzebujesz konkretnej wartości, która nie pasuje do wzorca?

Błąd temperatury ciała

Wyobraź sobie, że chcesz wstawić do tej tabeli wartość 98,6°F (normalna temperatura ludzkiego ciała). Nie mieści się w wielokrotności 10. Dlatego dodajesz warunek „jeśli”.

Działa to w przypadku limitu 100. Ale zmień limit pętli na 200, a logika się załamie. Warunek „jeśli (a > 98,6)” pozostanie spełniony w każdej kolejnej iteracji. Będziesz wyprowadzać 98,6°F w nieskończoność.

Dlaczego tak się dzieje? Ponieważ warunek sprawdza, czy bieżąca liczba jest większa niż 98,6. Gdy „a” osiągnie 100, zawsze będzie większe niż 98,6. Nie sprawdzasz, czy właśnie przekazałeś tę wartość. Sprawdzasz, czy jesteś za nim.

Poprawka: śledzenie stanu

Aby to naprawić, musisz zapamiętać poprzednią wartość. Wprowadzasz drugą zmienną „b”, zainicjowaną na -1.

Teraz logika jest poprawna. Dodatkowa linia jest drukowana tylko wtedy, gdy „a” jest teraz większe niż 98,6 ORAZ „b” było wcześniej mniejsze niż 98

Poprzedni artykułDlaczego osobliwość technologiczna może nastąpić do 2030 r
Następny artykułJak wybrać najbezpieczniejszy smartfon: równowaga pomiędzy sprzętem, oprogramowaniem i wsparciem