Але мені цікаво, чи комп’ютер навіть намагається розділити на нуль, чи просто "вбудований захист", і коли він "бачить" 0/0, він повертає помилку ще до спроби її обчислити?
Оскільки x/0
немає сенсу, період, комп'ютери повинні завжди перевіряти на поділ на нуль. Тут є проблема: програмісти хочуть проводити обчислення (a+b)/c
без необхідності перевіряти, чи має такий розрахунок навіть сенс. Відповідь під капотом на поділ на нуль процесором + тип типу + операційна система + мова - це або зробити щось досить драстичне (наприклад, збій програми), або зробити щось надмірно доброякісне (наприклад, створити значення, яке не робить такий сенс, як IEEE з плаваючою точкою NaN
, число, яке є "Не числом").
У звичайній обстановці від програміста очікується знати, чи (a+b)/c
є сенс. У цьому контексті немає підстав перевіряти ділення на нуль. Якщо поділ на нуль трапляється, і якщо машинна мова + мова реалізації + тип даних + відповідь операційної системи на це - зробити програму збоєм, це добре. Якщо відповідь полягає у створенні значення, яке може врешті забруднити кожне число програми, це теж нормально.
Ні "щось драстичне", ні "надмірно доброякісне" не є правильним ділом у світі з обчисленнями з високою надійністю. Ці відповіді за замовчуванням можуть вбити пацієнта, розбити авіалайнер або змусити вибухнути бомбу в неправильному місці. У середовищі з високою надійністю програміст, який пише, (a+b)/c
буде підбитий до смерті під час перегляду коду, або в сучасний час, можливо, автоматично підбирається до смерті інструментом, який перевіряє конструктивність верболетів. У цьому середовищі цей програміст повинен замість цього щось написати div(add(a,b),c)
(та, можливо, перевірити стан помилок). Під кришкою div
(/ а також add
) функції / макроси захищають від поділу на нуль (або переповнення у випадку add
). Те, що передбачає цей захист, є специфічним для здійснення.