Все мы знаем 0/0
это не определено
и возвращает ошибку, если я помещу его в калькулятор, и если бы мне пришлось создать программу (в C, по крайней мере) ОС прекратит его, когда я пытаюсь делить на ноль.
Но то, что я'вэ было это интересно, если на компьютере даже попытки деления на ноль, или это просто "по причине в защиту" Ну, так что, когда ее "видит" и 0/0
он возвращает ошибку, даже прежде чем пытаться вычислить его?
Процессор имеет встроенный обнаружения. Большинство команд архитектур указать, что КПУ ловушку в обработчик исключений для целочисленного деления на ноль (я не'т думаю, что это волнует, если делимое равно нулю).
Вполне возможно, что проверка на ноль делитель происходит параллельно в железе наряду с попыткой сделать разделение, тем не менее, обнаружение нарушителя состоянии эффективно отменяет разделение и ловушки, поэтому мы можем'т действительно сказать, если какая-то часть его попытался подразделение или нет.
(Оборудование часто работает так, что делать несколько вещей параллельно, а затем выбрав соответствующий результат, потому что после каждой операции все может сразу приступить к работе вместо сериализации на выбор правильного действия.)
Те же грабли, чтобы механизм исключения также будут использованы для обнаружения переполнения включается, что вы просите обычно с помощью разных добавить/суб инструкции/ООО (или флаг на эти инструкции).
Делением с плавающей запятой также имеет встроенный в обнаружение деления на ноль, но возвращает другое значение (IEEE 754 с указывает Нана) вместо захвата в обработчик исключений.
Гипотетически говоря, если процессор не обнаружения попытка деления на ноль, проблемы могут включать:
Это зависит от языка, компилятора, от того, используете ли вы целых чисел или чисел с плавающей запятой, и так далее.
Для числа с плавающей запятой, большинство реализаций используют IEEE 754 с стандарт, где деление на 0-это хорошо определены. 0 / 0 дает определенный результат Нана (не-число), и x / 0 для x ≠ 0 дает либо +бесконечность или -бесконечность, в зависимости от знака х.
В таких языках, как C, С++ и т. д. деление на ноль вызывает неопределенное поведение. Так, согласно определению языка, ничего может произойти. Особенно вещи, которые вы не'т хотите, чтобы произошло. Вроде все прекрасно работает, когда вы пишете код и уничтожения данных, когда ваш клиент использует его. Так что с точки зрения языка, don'т сделать this. Некоторые языки guarantee, что ваше приложение рухнет; это's до них, как это реализуется. Для этих языков, деление на ноль приведет к краху.
Многие процессоры имеют какой-то встроенный в "разрыв" и инструкции, которые будут вести себя по-разному в зависимости от процессора. Intel для 32-и 64-разрядных процессоров, в "разрыв" по инструкции, это приведет к зависанию приложения при попытке деления на ноль. Другие процессоры могут вести себя по-разному.
Если компилятор обнаруживает, что деление на ноль происходит, когда выполняется какой-то код, и компилятор приятно своим пользователям, он, вероятно, даст вам предупреждение, и генерировать встроенный-в "разделить" в инструкции, так что поведение такое же.
Похоже, вы'вновь интересно, что будет, если кто-то сделал процессор, который не'т явно проверять на ноль перед делением. Что будет, полностью зависит от реализации отдела. Не вдаваясь в подробности, один вид реализации будет производить результат, который имеет все биты установлены, например, 65535 в 16-битный процессор. Другой может повесить.
но то, что я'вэ было интересно, если компьютер даже попытки деления на ноль, или это просто "по причине в защиту" Ну, так что, когда ее "видит" по-0/0 возвращает ошибку даже перед попыткой вычислить это?
Начиная с х/0не имеет смысла, период, компьютеры должны всегда выполнять проверку деления на ноль. Там'проблема здесь: программисты хотят вычислить
(А+B)/Cбез того, чтобы беспокоиться, чтобы проверить, если это расчет даже смысл. Под капотом реакция на деление на нуль ЦПУ + число тип + ОС + язык либо сделать что-нибудь радикальное (например, сбой программы) или сделать что-то чрезмерно доброкачественные (например, создать значение нет смысла, таких как IEEE с плавающей точкой
Нана`, ряд, который "не количество и").
В обычной обстановке, программист должен знать, является ли (А+Б)/С
имеет смысл. В этом контексте, там's нет причин, чтобы проверить деление на ноль. Если деление на ноль произойдет, а если машина язык + язык + тип данных + операционная система реагирования на это сделать сбой программы, что'ы в порядке. Для того чтобы создать значение, которое в конечном итоге может загрязнять каждый номер в программе, что'ы хорошо, слишком.
Ни "и что-то решительное" или "чрезмерно щадящих" это правильно делать в мире высокой надежности вычислений. Эти ответы по умолчанию может убить пациента, крушение авиалайнера, или заставить бомбу взорваться не в том месте. В высокой надежности среду, программист, который пишет (А+Б)/С
будут выбраны до смерти в ходе анализа кода, или в современные времена, возможно, выбрал до смерти автоматически с помощью инструмента, который проверяет запрещено конструкций. В этой среде, что программист вместо этого надо было написать что-то вдоль линий див(добавить(А,Б),В)
(и, возможно, некоторые проверки состояния ошибки). Под капотом, див
(а также добавить
) функции/макросы защищает от деления на ноль (или переполнения в случае "добавить"). Что эта защита предусматривает очень конкретные реализации.
Мы знаем теперь, что Х/0
и 0/0
не имеют четко очерченные ответы. Что произойдет, если вы попытаетесь вычислить 0/0
в любом случае?
На современные системы, Расчет передается в ЦПУ процессора и помечается как недопустимую операцию, вернув Нана
.
На гораздо более старые системы, такие как 'домашние компьютеры 80-х годов, которые не имели на чипе отдела, расчет был сделан по какой программе работает. Есть несколько возможных вариантов:
1
.0
и E<суп>0</суп> = 1, дает результат 1
Другими словами, это будет реализация зависит что и как будет, можно было бы написать программу, которая производит правильный и предсказуемый результат для каждого значения, но, казалось бы, странного значения 0/0
, что, тем не менее, до сих пор внутренне непротиворечивыми.