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

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

Страницы: 1 2 3 4 Следующая »
#30
21:00, 12 янв. 2018

CD
> их больше
А как по мне так их меньше.

> в остальном я бы рассчитывал на стандартное поведение
А я бы не рассчитывал. Веротяно ты заперт в пределах пары компиляторов, студийного и gcc и не очень в курсе дел на остальных.

kipar
Уже второй раз говоришь мою позицию лучше меня самого.
Предлагаю дальше слушать kipar, я свой взгляд сказал и наверное добавить нечего. Ох уж эти спорщики, все опровергнуть хотят.


#31
23:31, 12 янв. 2018

122
> А я бы не рассчитывал. Веротяно ты заперт в пределах пары компиляторов,
> студийного и gcc и не очень в курсе дел на остальных.

Ну, вот на Turbo C++ 3.2 от 92-ого года, следующий код нормально работает. Как в программной эмуляции (по-умолчанию), так и в "продвинутом режиме 8087". Если что, буду сбегать от кровавой тирании msvc на него.

#include <stdio.h>
void main()
{
  const long NUM = 1024l*1024l;
  double d = 9007199254740992.0;
  double x = 0.0;
  double b = d/(double)NUM;
  while (x != d)
    x += b;
  printf("%lf %i\n", x, (int)(x==d));
  x = d - 1000.0*1000.0;
  printf("%lf\n", x);
  while (x != d)
    x += 1.0;
  printf("%lf %i\n", x, (int)(x==d));
  float s = 0.0;
  const long MAX_INT_FLT = 16777216l;
  for (long i = 0; i < MAX_INT_FLT; ++i)
    s += 1.0;
  printf("%lf %i\n", s, (int)(s==(float)MAX_INT_FLT));
  getc(stdin);
}

#32
12:03, 13 янв. 2018

CD
> следующий код нормально работает
Как я и отметил в сообщении #24 по поводу ошибок сложения:
> Но это не точно.
Ок, пускай сложение работает стабильно.

Однако вот скрин из моей крохотной игры на конкурс который прошел тут недавно. (Можно скачать и убедиться в этом баге) На конкурсе я выложил две версии экзешника, 32-бит и 64-бит. Первый собран через gcc а второй на vstudio. Исходный код - в обоих полностью идентичный, для компиляции там и там он не менялся. Однако на скриншоте явно разный дефект положения текстуры. Причина проста: модель вместе с текстурными координатами читается из формата .obj а там по стандарту данные представлены в формате с плавающей точкой. И даже казалось бы несложный код чтения координат из .obj и записи их в целые числа - уже дает "плавающего питуха". Что-то округляется в другую сторону.

Как бы, я же не пытаюсь кого-то переубедить. Просто говорю о своем фактическом опыте: с интом проще и стабильнее а с флоатом пляски и бубны.
А ваш опыт запросто может быть другим и это нормально.

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

#33
15:07, 13 янв. 2018

std::cin

Если 5 : 0 = 5, сколько будет
5 : 0.000000000000000000000001 ?

#34
17:21, 13 янв. 2018

F320 если больше нуля, то можно считать это деление, если ровно ноль, то не вычислять.

#35
0:47, 14 янв. 2018

std::cin
Обычно в расчетах всё-таки лучше получить ( правильный результат либо исключение), а не (правильный результат либо левые числа).
Если ты попытался посчитать обратную матрицу забыв проверить ранг и получил Наны или инфы - ок, ты хотя бы знаешь что ошибка есть. А так ты получишь матрицу с левыми числами и долго будешь искать ошибку в компиляторе или гадать на каком именно шаге что-то пошло не так.

#36
0:40, 15 янв. 2018

Мысли:

0. Не на всех архитектурах целочисленное деление на 0 - это исключение.
      http://infocenter.arm.com/help/index.jsp?topic=/com.arm.doc.den00… CJAGFHED.html
1. На x86 - это исключение (#DE) не только для деления на 0, но и если результат не помещается в приёмник. Это исключение fault-типа (возврат на ту же инструкцию). Его можно обрабатывать (в т. ч. подставлять 0->1), его можно маскировать (насколько я понимаю). В некоторых языках (отличных от ассемблера) это harder than it needs to be.
      http://www.felixcloutier.com/x86/DIV.html
      http://www.felixcloutier.com/x86/IDIV.html
2. В C++ деление на 0 и результат не помещающийся в тип (напр. INT_MIN/-1) - это undefined behavior. И имеет право на то, что умеет undefined behavior.
      http://en.cppreference.com/w/cpp/language/operator_arithmetic
      https://godbolt.org/g/i1DS9y
3. То, что при исключении деления взводится SIGFPE - исторический артефакт POSIX.
      https://stackoverflow.com/questions/37262572/on-which-platforms-d… oint-exceptio
4. Меня лично поведение x86 не особо напрягает. Crash early, crash hard - лучше ряда альтернатив.
5. Если хочется другого поведения - можно написать свою обёртку. По-хорошему - всё-равно неплохо бы, т. к. деление в C++ - не евклидовское. Накладные расходы вряд ли существенны (они маленькие (по сравнению с делением), всё-равно есть (в коде, генерируемом компилятором), деления обычно редки).
      https://en.wikipedia.org/wiki/Euclidean_division
      https://godbolt.org/g/kFcvpL
      https://github.com/llvm-mirror/compiler-rt/blob/master/lib/builtins/divdi3.c
6. Что считать "разумным" значением по-умолчанию для N/0 - зависит от контекста.
7. Мнение, что плавучка "в основном" повторяема - оптимистично. Например: x87 double rounding/spilling, и GCC игнорирующий pragma FP_CONTRACT. Ну и упоминавшееся "floating-point число <-> текстовая строка", конечно же (можно страсти на exploringbinary.com почитать).
      https://gcc.gnu.org/wiki/FloatingPointMath
      https://gcc.gnu.org/onlinedocs/gcc/Floating-point-implementation.html
      http://www.exploringbinary.com
      https://stackoverflow.com/questions/34436233/fused-multiply-add-a… ounding-modes (ответ от Stephen Canon)

#37
21:58, 15 янв. 2018

kipar
> Если ты попытался посчитать обратную матрицу забыв проверить ранг и получил
> Наны или инфы - ок, ты хотя бы знаешь что ошибка есть. А так ты получишь
> матрицу с левыми числами и долго будешь искать ошибку в компиляторе или гадать
> на каком именно шаге что-то пошло не так.
Как вариант, через директивы можно сделать переключение между отладочным кодом со всем проверками и его релизной более шустрой версией (без проверок в некритичных местах).

И вообще, ролик в 0-посте был про наглядное объяснение математического значения деления на ноль, а понабежали прогеры со своими тараканами насчёт отлова мат.исключений.
#38
22:28, 15 янв. 2018

Psilen
в коде да, но тут же уровень архитектуры процессора, и выигрыша по скорости тоже от 5/0 = 5 никакого не будет.

#39
23:52, 19 фев. 2018

А что вообще даст переопрдиления деления на ноль, какие плюсы?
P.S: гааааааа ?

#40
12:32, 26 мар. 2018

Господа!
Можно я прерву Вашу столь увлекательную беседу, и спрошу. А почему можно умножать на ноль? Кто нибудь может мне это объяснить, не прибегая к делению на ноль?
Очень простой вопрос:
почему можно умножать на ноль
При объяснении крайне запрещается упоминать деление на ноль.
Знатоки - время пошло )))

#41
13:02, 26 мар. 2018

0*x = y
0*x = (0+0)*x = 0*x + 0*x = y + y
откуда
y = y + y => y = 0

#42
13:06, 26 мар. 2018

563

Ты понимаешь, почему можно умножать на х=0.000000000001? Например, х это расход лепездричества за 1 секунду при игре в Майнкрафт, чтобы узнать сколько денег просрано за t секунд нужно t умножить на х. А теперь приходит папа и говорит: «Сыночка, я тут подшаманил со счётчиком — для нас теперь лепездричество бесплатное!» Чему теперь равно х? Правильно, нулю. Чему равен расход? t*x = t*0 = 0.

#43
13:10, 26 мар. 2018

Zegalur

Последний переход можно сделать более очевидным:

y = 2y
2y-y = 0
y = 0

#44
13:12, 26 мар. 2018

F320
> расход лепездричества за 1 секунду
так ведь можно придраться к размерности этой величины (типа сказать что там деление и все такое :)
--
хотя 563 только деление на ноль запрещал

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

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