Форум программистов, компьютерный форум, киберфорум
Наши страницы
С++ для начинающих
Войти
Регистрация
Восстановить пароль
 
 
Рейтинг 4.67/6: Рейтинг темы: голосов - 6, средняя оценка - 4.67
viramir
0 / 0 / 1
Регистрация: 04.05.2016
Сообщений: 185
1

Деление на 0

29.03.2018, 17:25. Просмотров 1180. Ответов 33
Метки нет (Все метки)

Все говорят на 0 делить нельзя,но я поделил,в чем тут подвох
C++
1
2
3
4
5
6
7
8
9
#include <iostream>
 
using namespace std;
 
int main()
{
int x=1/(double)0;
cout<<x<<endl;
}
и получился результат -2147483648
0
Лучшие ответы (1)
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
29.03.2018, 17:25
Ответы с готовыми решениями:

Задача про деление яблок (целочисленное деление)
Ребят,помогите с задачкой,как написать input.txt и output.txt? Помогите решить задачу. C++....

Умножение, деление и деление с остатком
Рассмотрим эти операции на примере. static void Main() { int i = 100, j = 15; double a =...

Деление знаковых чисел с выводом ошибки "Деление на ноль"
Собственно поставили передо мной задачу - написать прогу деления двух чисел, причем что бы...

Деление на 0
задача: Условие Имеется N человек и матрица А размера N´N. Элемент A матрицы равен 1, если...

деление на 0
у меня есть код задачи .. помогите пожалуйста.. надо переделать код, чтобы в 14 строчке (case '/': ...

33
axela002
69 / 56 / 48
Регистрация: 12.03.2017
Сообщений: 555
Завершенные тесты: 5
29.03.2018, 17:29 2
Цитата Сообщение от viramir Посмотреть сообщение
и получился результат -2147483648
Обычный мусоp..
0
viramir
0 / 0 / 1
Регистрация: 04.05.2016
Сообщений: 185
29.03.2018, 17:30  [ТС] 3
Цитата Сообщение от axela002 Посмотреть сообщение
Обычный мусоp..
Как это мусор,это же не строка?
0
Azazel-San
Mental handicap
801 / 427 / 125
Регистрация: 24.11.2015
Сообщений: 1,871
Завершенные тесты: 1
29.03.2018, 17:36 4
Цитата Сообщение от viramir Посмотреть сообщение
в чем тут подвох
ни вчем, нормальный компилятор такое не скомпилит, обычно будет ошибка типа divide or mod by zero
в вашем случае скорее компиялтор просто проигнорил операцию
0
29.03.2018, 17:36
viramir
0 / 0 / 1
Регистрация: 04.05.2016
Сообщений: 185
29.03.2018, 17:38  [ТС] 5
Цитата Сообщение от Azazel-San Посмотреть сообщение
ни вчем, нормальный компилятор такое не скомпилит, обычно будет ошибка типа divide or mod by zero
в вашем случае скорее компиялтор просто проигнорил операцию
Ошибка и была пока я не перевел ноль в double
0
zss
Модератор
Эксперт С++
8094 / 7232 / 4504
Регистрация: 18.12.2011
Сообщений: 19,121
Завершенные тесты: 1
29.03.2018, 17:41 6
VS такое не пропускает
Error 1 error C2124: divide or mod by zero
0
LegionK
Че,пацаны,аниме?
213 / 157 / 146
Регистрация: 02.05.2017
Сообщений: 632
Завершенные тесты: 2
29.03.2018, 17:52 7
Аналогично, MinGw спокойно запустил и выдал то же самое число, что и у тебя
0
vlisp
521 / 494 / 115
Регистрация: 10.08.2015
Сообщений: 1,793
Завершенные тесты: 1
29.03.2018, 17:55 8
Цитата Сообщение от viramir Посмотреть сообщение
в чем тут подвох
в том, что ты поделил не на ноль
0
viramir
0 / 0 / 1
Регистрация: 04.05.2016
Сообщений: 185
29.03.2018, 17:56  [ТС] 9
Цитата Сообщение от vlisp Посмотреть сообщение
в том, что ты поделил не на ноль
А на что?
0
woldemas
446 / 318 / 174
Регистрация: 06.09.2013
Сообщений: 966
29.03.2018, 17:57 10
viramir,
gcc компилит.
Вообще числа с плавающей точкой делить на ноль можно, чем вы и занимаетесь приводя к double, при этом получается одна из бесконечностей + или -, она имеет свое представление в формате вещественного числа и видимо часть этого представления потом копируется в целочисленную переменную.
А вообще делением на 0 для double иногда пользуются, например, в операциях сравнения результат может участвовать.
1
viramir
0 / 0 / 1
Регистрация: 04.05.2016
Сообщений: 185
29.03.2018, 19:17  [ТС] 11
Цитата Сообщение от LegionK Посмотреть сообщение
Аналогично, MinGw спокойно запустил и выдал то же самое число, что и у тебя
У меня и есть Migw +CodeBlocks
0
LegionK
Че,пацаны,аниме?
213 / 157 / 146
Регистрация: 02.05.2017
Сообщений: 632
Завершенные тесты: 2
29.03.2018, 19:19 12
viramir, да я так, просто добавил
0
Evg
Эксперт CАвтор FAQ
19884 / 7514 / 574
Регистрация: 30.03.2009
Сообщений: 20,967
Записей в блоге: 30
29.03.2018, 20:23 13
Лучший ответ Сообщение было отмечено ValeryS как решение

Решение

Цитата Сообщение от woldemas Посмотреть сообщение
viramir,
gcc компилит.
Вообще числа с плавающей точкой делить на ноль можно, чем вы и занимаетесь приводя к double, при этом получается одна из бесконечностей + или -, она имеет свое представление в формате вещественного числа и видимо часть этого представления потом копируется в целочисленную переменную.
А вообще делением на 0 для double иногда пользуются, например, в операциях сравнения результат может участвовать.
Немного дополню

Почему здесь возникает именно вещественное деление, а не целочисленное - можно почитать здесь: Распространенные ошибки

В итоге в результате вещественного деления мы получили значение "бесконечность". Но потом мы это значение пытаемся преобразовать в целое (поскольку "x" имеет тип int). Преобразование из вещественного в целое определено только тогда, когда значение вещественного не превышает диапазон представления целого (в нашем случае это диапазон от -2147483648 до +2147483647). Когда вещественное значение вываливается из этого диапазона (как это имеет место быть для значения "бесконечность"), то имеем undefined behavior. Конкретно в твоём случае компилятор построил код, который при исполнении выдал значение -2147483648

Для большей наглядности можно было бы посмотреть, что печатает следующий код, чтобы увидеть в чистом виде результат вещественного деления на ноль:

C++
#include <iostream>
 
using namespace std;
 
int main()
{
  // Без преобразования к int'у, которое провоцирует undefined ситуацию
  cout << 1/(double)0 << endl;
 
  // С преобразованием к int'у, которое провоцирует undefined ситуацию
  int x=1/(double)0;
  cout<<x<<endl;
}
Вот так выглядит исполнение на intel'е

Код
$ g++ t.cc
$ ./a.exe
inf
-2147483648
А вот так на sparc'е

Код
$ g++ t.cc
$ ./a.out
inf
2147483647
В одном случае преобразование из бесконечности в целое дало результат "минус дофига", а в другом - "плюс дофига". Потому что на sparc'е и на intel'е аппаратные операции преобразования из вещественного в целое выдают разные результаты. Ни один из результатов нельзя назвать правильным или неправильным, поскольку по стандарту результат не определён
2
vlisp
521 / 494 / 115
Регистрация: 10.08.2015
Сообщений: 1,793
Завершенные тесты: 1
29.03.2018, 20:23 14
Цитата Сообщение от viramir Посмотреть сообщение
А на что?
по читай про арифметику чисел с плавающей точкой, станет понятно почему числа с плавающей точкой не равны друг другу и не равны нулю
0
Evg
Эксперт CАвтор FAQ
19884 / 7514 / 574
Регистрация: 30.03.2009
Сообщений: 20,967
Записей в блоге: 30
29.03.2018, 20:30 15
Цитата Сообщение от vlisp Посмотреть сообщение
числа с плавающей точкой не равны друг другу и не равны нулю


C
#include <stdio.h>
 
float f1 = 1.2345;
float f2 = 1.2345;
 
float f3 = 0.0;
 
int main (void)
{
  if (f1 == f2)
    printf ("equal\n");
  else
    printf ("not equal\n");
 
  if (f3 == 0)
    printf ("equal\n");
  else
    printf ("not equal\n");
}
Код
$ gcc t.c
$ ./a.exe
equal
equal
2
viramir
0 / 0 / 1
Регистрация: 04.05.2016
Сообщений: 185
29.03.2018, 20:32  [ТС] 16
Evg, меня бесит что long и long long это разное
0
Evg
Эксперт CАвтор FAQ
19884 / 7514 / 574
Регистрация: 30.03.2009
Сообщений: 20,967
Записей в блоге: 30
29.03.2018, 20:35 17
Цитата Сообщение от viramir Посмотреть сообщение
меня бесит что long и long long это разное
Не понимаю, какое это имеет отношение к текущей теме. Но тем не менее: http://www.cyberforum.ru/blogs/18334/blog69.html

А если уж совсем хочется разобраться, то http://www.cyberforum.ru/blogs/18334/blog88.html
0
viramir
0 / 0 / 1
Регистрация: 04.05.2016
Сообщений: 185
29.03.2018, 20:36  [ТС] 18
Evg, а такое что какое число не ставь что длинное что длинное длинное все равно будет тот же результат
0
Evg
Эксперт CАвтор FAQ
19884 / 7514 / 574
Регистрация: 30.03.2009
Сообщений: 20,967
Записей в блоге: 30
29.03.2018, 21:05 19
Цитата Сообщение от viramir Посмотреть сообщение
А такое что какое число не ставь что длинное что длинное длинное все равно будет тот же результат
Куда "не ставь"?

Добавлено через 44 секунды

Не по теме:

Временами просто поражаюсь отдельно взятым товарищам на форуме. Людям реально впадлу внятно задать вопрос, чтобы другие ему же помогли

0
viramir
0 / 0 / 1
Регистрация: 04.05.2016
Сообщений: 185
29.03.2018, 21:06  [ТС] 20
Evg,
C++
1
2
3
4
5
6
7
8
9
#include <iostream>
 
using namespace std;
 
int main()
{
long long double x=1/(double)0;
cout<<x<<endl;
}
результат всегда INT
0
29.03.2018, 21:06
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
29.03.2018, 21:06

Деление на 0
Выдает деление на 0 хелп. ; (b1*(w1-b2)-w2*b3)/w3+d1/b4 ;1. (w1-b2)*b1 xor bx,bx mov...

деление на 0
столкнулся с проблемой деления на 0. нужно сделать так. чтобы программа не делила на 0. по...

Деление на 1
Здравствуйте! В программ есть операция которая делит числа на 1, чтобы найти частоту. Так вот,...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2019, vBulletin Solutions, Inc.
Рейтинг@Mail.ru