Войти
ФлеймФорумНаука

Кому интересно, откопал наглядное объяснение (ролик) о том, почему нельзя делить на ноль, и что будет, если всё-таки поделить

Страницы: 1 2 3 4 Следующая »
#0
17:22, 11 янв. 2018


#1
19:54, 11 янв. 2018

У меня на айпаде гугл эмбеды ютуба сломал, так что в ролик не могу. Но будет ведь именно то что я думаю, вселенная упадет в дебаггер и можно будет через GDB поставить себе бесконечно хп и золота?

#2
21:52, 11 янв. 2018

Видос не смотрел, но деление на ноль - реально большая проблема процов.
При таковом делении вылетает программа скомпилированная любым компилятором, из чего я делаю вывод о том что проблема зашита в ЦП.

В итоге перед КАЖДЫМ делением мне приходится думать: не примет ли второй аргумент ноль. И да, проверять его сраным if'ом.
Типа такого:

int res,x,y;

x=10;y=20;
if (y==0){y=1;} // div by zero avoid with (if)
res=x/y;

x=10;
y=(( 20 )|1);      //  div by zero avoid with (|1)
res=x/y;

Вопрос, однако, это не снимает: зачем? Зачем ВСЯ мать его программа вылетает при этом? Какому светлому уму пришла в голову идея лет 35-40 назад "а давайте если делим на ноль, проц будет кидать исключение (или что он там делает) и вся прога будет к херам вылетать!". Ну просто пушка.
В результате моя головная боль, приходится помнить эти кренделя. А почему бы делению на ноль просто не работать аналогично делению на единицу? Вопрос, на который никто не даст ответа.

#3
21:58, 11 янв. 2018

122
Ты посмотри сперва видос и поймешь, что тогда прога уйдет в бесконечный счет. Зависнет.

#4
22:02, 11 янв. 2018

122
> из чего я делаю вывод о том что проблема зашита в ЦП.

Иногда, полезно читать документацию, - https://dev64.wordpress.com/2012/05/14/interrupts-exceptions-refe… /#interrupt-0

#5
22:07, 11 янв. 2018

ZonoID
> > А почему бы делению на ноль просто не работать аналогично делению на единицу?
> Ты посмотри сперва видос и поймешь, что тогда прога уйдет в бесконечный счет.
> Зависнет.
Чо?

0iStalker
> Иногда, полезно читать документацию
И что это меняет?
При делении на ноль программа все равно вылетает если не применить костыли типа тех что я указал или иных.

#6
22:19, 11 янв. 2018

122
> При делении на ноль программа все равно вылетает если не применить костыли типа
> тех что я указал или иных.

Если программа вылетает по этой причине, то это знак, что что-то не так с алгоритмом или данными. И применять костыли может быть чревато, например расчёте углов поворота, во всяких инженерно-технических задачах

#7
22:23, 11 янв. 2018

122
юзай флоат, тогда не будет вылетать

+ Показать
#8
23:17, 11 янв. 2018

122
> проблема зашита в ЦП.

Для любителей нестандартных поведений предусмотрен AddVectoredExceptionHandler
Можно реализовать абсолютно любую реакцию по-умолчанию на любые исключения.

//при исключении "деление на 0" опкода 0xF7 результатом объявляем 1
LONG CALLBACK Handler(PEXCEPTION_POINTERS ExceptionInfo) noexcept
{
  if (ExceptionInfo->ExceptionRecord->ExceptionCode == EXCEPTION_INT_DIVIDE_BY_ZERO)
  {
    u8 *vIP = (u8*)ExceptionInfo->ContextRecord->Rip;
    switch (*vIP)
    {
      case 0xF7:
      {
        vIP += 2;
        break;
      }
      default:
        return EXCEPTION_CONTINUE_SEARCH;
    }
    ExceptionInfo->ContextRecord->Rip = (UINT_PTR)vIP;
    ExceptionInfo->ContextRecord->Rax = 1;
    ExceptionInfo->ContextRecord->Rdx = 0;
    return EXCEPTION_CONTINUE_EXECUTION;
  }
  else
    return EXCEPTION_CONTINUE_SEARCH;
}

void Test()
{
  OSCheck(AddVectoredExceptionHandler(1, Handler) != 0);
  volatile u32 z = 0;
  u32 x = 5 / z;
  OutputDebugStringA(std::to_string(x).c_str());
}
#9
0:26, 12 янв. 2018

CD
> Для любителей нестандартных поведений предусмотрен AddVectoredExceptionHandler
Ну во первых почему "нестандартных"? Не скажешь же ты что вылет программы теперь считается стандартным?
Это что-то новое.

А твой костыль плох тем что требует спец-опций для компилятора: чтобы включить эксепшены. Да и размер проги заметно вырастает. И кажется зависит ко всему прочему от сторонних библиотек, откуда иначе эти константы заглавными буквами. Нет, мой костыль короче, изящнее, не зависит от настроек компилятора и сторонних либ.

0iStalker
> Если программа вылетает по этой причине, то это знак, что что-то не так с
> алгоритмом или данными.
В общем случае это не так. Деление на ноль - не всегда признак ошибки данных или алгоритма, а только иногда.

Например вот я считаю физику с 3д полигонами. Предположим что модель была отмасштабирована непосредственно перед рассчетом физики, уменьшена. И один из полигонов вследствие ограниченной точности целых чисел выродился в точку: все его вершины содержат одну и ту же позицию. И вот я считаю физику, делю что-то на длину ребра такого полигона. А длина ребра - ноль. Вылет программы.
Алгоритм - верный. (Пруф тому что моя физика работает) Данные - верны. Модель сделана аккуратно. Но получим вылет при некоторых условиях.

#10
0:26, 12 янв. 2018

122
> Вопрос, однако, это не снимает: зачем? Зачем ВСЯ мать его программа вылетает
> при этом? Какому светлому уму пришла в голову идея лет 35-40 назад "а давайте
> если делим на ноль, проц будет кидать исключение (или что он там делает) и вся
> прога будет к херам вылетать!". Ну просто пушка.
> В результате моя головная боль, приходится помнить эти кренделя. А почему бы
> делению на ноль просто не работать аналогично делению на единицу? Вопрос, на
> который никто не даст ответа
Потому что, это только скроет проблему , а не решыт её , видь число разделеное на ноль,  больше не являеться числом , и, дальнейшые вычисления с ним не возможны, видь такое число можно записать больше чем одной комбинацией бит .
Короче говоря стек(область памяти) числа умноженого на ноль , больше не прегоден для инструкций  процессора ( булевой алгебры  ) .
Можно сказать дальнейшые вычисления в этом стеке невозможны!
P.S: Проблема не в процессоре , а в булевой алгебры
(Логики прцессора) , в булевой алгебры не существует деления на ноль ! 

#11
1:06, 12 янв. 2018

122
Ты же троллишь, да? Ну скажи, что ты троллишь.
А все остальные тебе подыгрывают.
И это игра такая, по типу "а почему небо синее".

#12
1:48, 12 янв. 2018

122
>Ну во первых почему "нестандартных"?

Потому что для целых чисел результат деления на ноль не определен и в разных ситуациях доопределяется по разному.
Отсутствие явной проверки означает логическую ошибку, а в случае ошибки исключение должно возникать как можно раньше, чтобы её было проще найти.
Можно было бы требовать такую проверку на уровне языка, но с философией C/C++ это не совместимо.

>не всегда признак ошибки данных или алгоритма, а только иногда.
Общепринятое мнение, что почти всегда. Если ты пишешь числодробилки и у тебя другие тенденции, значит не повезло.

> А твой костыль плох тем что требует
Windows XP

>спец-опций для компилятора: чтобы включить эксепшены.
Языковые исключения не взаимодействуют с этим кодом, только исключения ОС.

#13
4:28, 12 янв. 2018

В JavaScript, кстати о птичках, на ноль делить можно, получится infinity. Математически корректный язык.

#14
7:40, 12 янв. 2018

122
> Зачем ВСЯ мать его программа вылетает при этом?
  Я бы задава вопрос иначе: на хрена в 2k18-м кто-то ещё пишет на языке, где деление на ноль приводит к вылетанию?

Страницы: 1 2 3 4 Следующая »
ФлеймФорумНаука

Тема в архиве.