Програмування на C: виправлення циклів та точності чисел з плаваючою точкою в таблицях конвертації

1

Написання простого конвертера температури здається тривіальним завданням, доки ви не усвідомите, наскільки легко може зламатися базова логіка. Ви починаєте з циклу while, виводьте таблицю перекладу Фаренгейта до Цельсія, і все здається правильним. Але потім вам потрібна конкретна точка даних – наприклад, температура людського тіла – і раптово ваш чистий код перетворюється на жах налагодження.

Тут ми розглянемо реальні аспекти роботи циклів у C, чому важлива точність і як запобігти зависанню ваших програм.

Основи: Цілочисленні цикли

Розглянемо найпростішу версію. Ви хочете вивести таблицю від 0 до 100 градусів Фаренгейта з кроком в 10. Ви використовуєте цілий лічильник int з ім’ям a.

`

Запустіть цей код, і ви отримаєте акуратну сітку:

`

Код функціональний. Він швидкий. Але він негарний. Чому? Тому що цілий поділ зсікає дробову частину. Вираз (a - 32)*5/9 відкидає дробову частину перед виведенням. Якщо вам потрібна точність, вам потрібні числа з точкою, що плаває.

Точність чисел з плаваючою точкою

Перемикання на ‘float’ змінює математику. Вам також потрібно замінити специфікатор формату з ‘%d’ на ‘%f’. Наведений нижче код використовує %6.2f, що вказує висновку зарезервувати шість позицій, зберігаючи дві цифри після десяткової точки.

`

Тепер висновок має реальні десяткові розряди. Це виглядає професійно. Але що, якщо вам потрібне конкретне значення, яке не вписується в патерн?

Помилка з температурою тіла

Уявіть, що потрібно вставити значення 98.6°F (нормальна температура людського тіла) в цю таблицю. Воно не потрапляє на кратне значення 10. Тому ви додаєте умову if.

`

Це працює для межі 100. Але змініть межу циклу на 200, і логіка впаде. Умова if (a> 98.6) залишиться істинною для кожної наступної ітерації. Ви будете безкінечно виводити 98.6°F.

Чому це відбувається? Тому що умова перевіряє, чи є поточне число більшим, ніж 98.6. Як тільки a досягає 100, воно завжди буде більшим за 98.6. Ви не перевіряєте, лише що перейшли ви це значення. Ви перевіряєте, чи перебуваєте ви за ним.

Виправлення: Відстеження стану

Щоб виправити це, потрібно запам’ятати попереднє значення. Ви вводите другу змінну b, ініціалізовану значенням -1.

`

Тепер логіка коректна. Додатковий рядок виводиться тільки в тому випадку, якщо a зараз більше 98.6, І b раніше було менше 98

попередня статтяЧому технологічна сингулярність може статися до 2030 року
наступна статтяЯк вибрати найзахищеніший смартфон: баланс між апаратним забезпеченням, програмним забезпеченням та підтримкою