Делим на 0

Тема в разделе "Arduino & Shields", создана пользователем Рязанский_Ардуинщик, 9 дек 2016.

  1. Asper Daffy

    Asper Daffy Иксперд

    Тады хрен тибе, а не "какой алгоритм деления". Хочишь знаний, плати. Ни хочишь платить - ни знай!
     
    DetSimen и Andrey12 нравится это.
  2. parovoZZ

    parovoZZ Гуру

    наивный, прям как старый дед. Там -1 вернется
    . Т.е. микра сама в себя всосет. Ещё и должен будешь. Минус адин же.
     
  3. erinaceto

    erinaceto Нуб

    Мешало то, что под рукой не было.
    Докладаю. Проверил на Arduino IDE 1.8.9
    Платы arduino uno и pro mini (ну, мало ли...)

    При делении на 0 типа int или long int -1
    Типа unsigned int 65535
    unsigned long int или bool 4294967295
    float inf
    при делении на целый ноль с присвоением результата типу float возвращается сцециальное значение ovf.
    При приведении этих ovf или inf к int получается, как ни странно, 0.

    Вроде, все интересные случаи разобрал
    Маленькое пояснение, мне нужно было для оптимизации (в т.ч. избавления от плавающей запятой) написания программы работы люстры. Если в какой-то момент яркость=-1, то понятно, что было деление на ноль, что и требуется.
     
  4. DIYMan

    DIYMan Guest

    Говорят, некоторые мировые религии прямо запрещают программистам делать проверки перед делением:
    Код (C++):
    if(divider != 0)  result = dividend/divider;
     
  5. カオナシ

    カオナシ Нерд

    Подумал об этом же, но опередил!
    А вообще, проверка входных данных, перед обработкой - бОльшая часть кода, но зато этот код работает стабильно.
     
  6. erinaceto

    erinaceto Нуб

    Да, изначально так и было. Но это получается двойная работа (один раз проверяю я и один — компилятор). Поэтому я и стараюсь пользоваться логикой работы конкретной системы.
     
  7. カオナシ

    カオナシ Нерд

    А какая разница, проверять результат или входные данные ;).
     
  8. erinaceto

    erinaceto Нуб

    Результат я проверяю в любом случае, а входные данные — только если этого не сделать на выходе. Я же не доказываю, что так нужно делать всегда. Но в отдельных случаях стабильность достигается экономией нескольких байтов ОЗУ, а не доп. проверками.
     
  9. Asper Daffy

    Asper Daffy Иксперд

    Ну-ну, старайся. Дели на ноль, распахивай память. Кот и не то делает, когда ему заняться нечем :)
     
    Andrey12 нравится это.
  10. カオナシ

    カオナシ Нерд

    Это изначально неправильно.
    Нужно проверять обрабатываемые данные на входе, и решать, что делать дальше.
    Компилятор может измениться/обновиться - результат будет другой.
    Как потом искать баг? ;)
     
  11. Asper Daffy

    Asper Daffy Иксперд

    Да, нет, ты ошибся. Никогда ещё стабильность делением на ноль не достигалась. Ни в отдельных случаях, ни в серийных.

    Стабильность достигается аккуратным и правильным проектированием и программированием. Во всех случаях, без исключения.
     
    Andrey12 и parovoZZ нравится это.
  12. parovoZZ

    parovoZZ Гуру

    неужели библиотека этого не делает? Вот прям не верю.
     
  13. カオナシ

    カオナシ Нерд

    Какая библиотека? :):):)
    ПаровоЗЗ стал думать понятиями Ардуино. Библиотека, вот! :)
     
  14. erinaceto

    erinaceto Нуб

    Вот знаете, ощущение такое, что обсуждается не вопрос деления на ноль (что вынесено в заголовок темы) а вопросы построения устойчивых алгоритмов. Я понимаю Вашу позицию, даже согласен с нею, но не в рамках этой темы (некорректно на вопрос «что будет, если…» отвечать «а не нужно так делать». Может, и не нужно, но вопрос не в этом).
     
  15. カオナシ

    カオナシ Нерд

    Так а результат, в этом случае, очень плотно связан с причиной проблемы. :(
    Вы знаете почему ракета у французов на старте завалилась?
     
  16. parovoZZ

    parovoZZ Гуру

    нет никакого деления на ноль. Оно в принципе невозможно.

    которая вот
     
  17. erinaceto

    erinaceto Нуб

    Точно. Значит, вместо деления на ноль происходит что-то ещё, вопрос, что именно.
     
  18. erinaceto

    erinaceto Нуб

    Какой результат? В каком случае? Ещё раз, человек задал вопрос — что происходит, если качестве делителя в определённой вычислительной машине поставить 0. У меня несколько другой вопрос был, о практическом применении, что уже несколько офтопик.
     
  19. parovoZZ

    parovoZZ Гуру

    возврат ошибки.
     
  20. erinaceto

    erinaceto Нуб

    Угу. Следующий вопрос — как именно эта ошибка передаётся в вызывающую функцию? Кстати, нужно будет ещё глянуть, как кодируются infи ovf (подозреваю, что что-то вроде 0Е1), но это (мне лично) уже не столь интересно, для общего развития.