Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
 
 
Рейтинг 4.53/15: Рейтинг темы: голосов - 15, средняя оценка - 4.53
1 / 1 / 1
Регистрация: 04.05.2016
Сообщений: 266
1

Деление на 0

29.03.2018, 17:25. Просмотров 2888. Ответов 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)
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
29.03.2018, 17:25
Ответы с готовыми решениями:

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

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

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

Деление на 3
35. Деление на 3. Как известно, число делится на 3 тогда и только тогда, когда сумма его цифр...

33
70 / 57 / 48
Регистрация: 12.03.2017
Сообщений: 566
29.03.2018, 17:29 2
Цитата Сообщение от viramir Посмотреть сообщение
и получился результат -2147483648
Обычный мусоp..
0
1 / 1 / 1
Регистрация: 04.05.2016
Сообщений: 266
29.03.2018, 17:30  [ТС] 3
Цитата Сообщение от axela002 Посмотреть сообщение
Обычный мусоp..
Как это мусор,это же не строка?
0
Mental handicap
1238 / 616 / 168
Регистрация: 24.11.2015
Сообщений: 2,416
29.03.2018, 17:36 4
Цитата Сообщение от viramir Посмотреть сообщение
в чем тут подвох
ни вчем, нормальный компилятор такое не скомпилит, обычно будет ошибка типа divide or mod by zero
в вашем случае скорее компиялтор просто проигнорил операцию
0
1 / 1 / 1
Регистрация: 04.05.2016
Сообщений: 266
29.03.2018, 17:38  [ТС] 5
Цитата Сообщение от Azazel-San Посмотреть сообщение
ни вчем, нормальный компилятор такое не скомпилит, обычно будет ошибка типа divide or mod by zero
в вашем случае скорее компиялтор просто проигнорил операцию
Ошибка и была пока я не перевел ноль в double
0
Модератор
Эксперт С++
9505 / 8165 / 4989
Регистрация: 18.12.2011
Сообщений: 21,785
29.03.2018, 17:41 6
VS такое не пропускает
Error 1 error C2124: divide or mod by zero
0
Че,пацаны,аниме?
225 / 168 / 147
Регистрация: 02.05.2017
Сообщений: 674
29.03.2018, 17:52 7
Аналогично, MinGw спокойно запустил и выдал то же самое число, что и у тебя
0
607 / 647 / 122
Регистрация: 10.08.2015
Сообщений: 2,822
29.03.2018, 17:55 8
Цитата Сообщение от viramir Посмотреть сообщение
в чем тут подвох
в том, что ты поделил не на ноль
0
1 / 1 / 1
Регистрация: 04.05.2016
Сообщений: 266
29.03.2018, 17:56  [ТС] 9
Цитата Сообщение от vlisp Посмотреть сообщение
в том, что ты поделил не на ноль
А на что?
0
572 / 388 / 198
Регистрация: 06.09.2013
Сообщений: 1,136
29.03.2018, 17:57 10
viramir,
gcc компилит.
Вообще числа с плавающей точкой делить на ноль можно, чем вы и занимаетесь приводя к double, при этом получается одна из бесконечностей + или -, она имеет свое представление в формате вещественного числа и видимо часть этого представления потом копируется в целочисленную переменную.
А вообще делением на 0 для double иногда пользуются, например, в операциях сравнения результат может участвовать.
1
1 / 1 / 1
Регистрация: 04.05.2016
Сообщений: 266
29.03.2018, 19:17  [ТС] 11
Цитата Сообщение от LegionK Посмотреть сообщение
Аналогично, MinGw спокойно запустил и выдал то же самое число, что и у тебя
У меня и есть Migw +CodeBlocks
0
Че,пацаны,аниме?
225 / 168 / 147
Регистрация: 02.05.2017
Сообщений: 674
29.03.2018, 19:19 12
viramir, да я так, просто добавил
0
Evg
Эксперт CАвтор FAQ
21098 / 8115 / 628
Регистрация: 30.03.2009
Сообщений: 22,440
Записей в блоге: 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
607 / 647 / 122
Регистрация: 10.08.2015
Сообщений: 2,822
29.03.2018, 20:23 14
Цитата Сообщение от viramir Посмотреть сообщение
А на что?
по читай про арифметику чисел с плавающей точкой, станет понятно почему числа с плавающей точкой не равны друг другу и не равны нулю
0
Evg
Эксперт CАвтор FAQ
21098 / 8115 / 628
Регистрация: 30.03.2009
Сообщений: 22,440
Записей в блоге: 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
1 / 1 / 1
Регистрация: 04.05.2016
Сообщений: 266
29.03.2018, 20:32  [ТС] 16
Evg, меня бесит что long и long long это разное
0
Evg
Эксперт CАвтор FAQ
21098 / 8115 / 628
Регистрация: 30.03.2009
Сообщений: 22,440
Записей в блоге: 30
29.03.2018, 20:35 17
Цитата Сообщение от viramir Посмотреть сообщение
меня бесит что long и long long это разное
Не понимаю, какое это имеет отношение к текущей теме. Но тем не менее: https://www.cyberforum.ru/blogs/18334/blog69.html

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

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

Не по теме:

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

0
1 / 1 / 1
Регистрация: 04.05.2016
Сообщений: 266
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
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
29.03.2018, 21:06

Заказываю контрольные, курсовые, дипломные и любые другие студенческие работы здесь.

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

Деление
Оригинальное задание звучит так: Вот, что я наваял: //The program divides the first number by...

Деление
Деление знаковых чисел, в результате почему-то 0 выскакивает( не могли бы вы найти ошибку? ...

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


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

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

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