Проблемы с результатом при операции деления.Крик Души

mr_givan
Offline
Зарегистрирован: 21.04.2020

Добрый день. с толкнулся с проблемой при операции деления. Написал простейший скетч.

byte X1 = 10;
byte X2 = 5;
float Y1 = 0;
float Y2 = 0;
void setup() {
Serial.begin(9600);
}

void loop() {
Y1 = X1 / X2;
Y2 = X2 / X1; 
Serial.print ("X1 = "); Serial.print(X1,8); Serial.print ("; X2 = "); Serial.print(X2,8);Serial.print ("; Y1 = ");Serial.print(Y1,8); Serial.print ("; Y2 = ");Serial.println(Y2,8);
delay (1000);

}

Результат должен быть очевиден: 

X1 = 10; X2 = 5; Y1 = 2.00000000; Y2 = 0.50000000
 
Но результат получается совсем другой:
 
X1 = 12; X2 = 5; Y1 = 2.00000000; Y2 = 0.00000000
Значение Х1 и Y2 явно не те которые должны быть.
И если с X1 это возможно проблемы интепритации Serial, то Y2 - действительно равен 0.
Замечено, что если результат деления должен получается меньше 0, то значение получается равное 0.
Подскажите, что это может быть. Куда смотреть?
 

 

sadman41
Offline
Зарегистрирован: 19.10.2016

Хэ1 или Хэ2 в каждой формуле умножь на 1.0 или приведи к типу float.

DetSimen
DetSimen аватар
Offline
Зарегистрирован: 25.01.2017
Y1 = float(X1) / X2;
Y2 = float(X2) / X1; 

 

ua6em
ua6em аватар
Offline
Зарегистрирован: 17.08.2016

Вот подтянется Евгений Петрович и объяснит человеку, как надо правильно делить в целочисленной арифметике, безо всяких ваших костылей )))

DetSimen
DetSimen аватар
Offline
Зарегистрирован: 25.01.2017

TC, у тебя образование какое-нить есть?  Целочисленное деление в школе уже проходил или не добрались еще? 

sadman41
Offline
Зарегистрирован: 19.10.2016

Получить float без float? Я бы посмотрел на такое бескостылье.

mr_givan
Offline
Зарегистрирован: 21.04.2020

Всем спасибо кто ответил по "делу", и тем кто решил просто по умничать.

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

Jeka_M
Jeka_M аватар
Offline
Зарегистрирован: 06.07.2014

mr_givan пишет:

Наверно компиляторы немного другого уровня.

Ну вот, опять компилятор виноват.

Kakmyc
Offline
Зарегистрирован: 15.01.2018

Судя по результатам он тебе выводит X1 в виде OCT.

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

mr_givan пишет:
ни когда не было проблем с результатом, если тип переменной в которое записывается значение, соответствовал этому значению.  Наверно компиляторы немного другого уровня.

А вот это "типичный случай так-называемого вранья".

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

Ну, разве что "ни когда". Если "ни когда", то да, тут всё возможно.

mr_givan
Offline
Зарегистрирован: 21.04.2020

ЕвгенийП пишет:

А вот это "типичный случай так-называемого вранья".

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

Ну, разве что "ни когда". Если "ни когда", то да, тут всё возможно.

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

Вашими же словами..

ЕвгенийП пишет:

.А вот это "типичный случай так-называемого вранья".

Взял первое что под рукой было.

 

Dim X1 As Byte
Dim X2 As Byte
Dim Y1 As Double
Dim Y2 As Double
X1 = 10
X2 = 5
Y1 = 0
Y2 = 0

Y1 = X1 / X2
Y2 = X2 / X1

Debug.Print (Y1)

Debug.Print (Y2)

Результат выдает правильный 2 и 0.5 что и требовалось доказать...

Поэтому у меня даже в мыслях не было обратить внимание на тип данных  используемых при деление.

А по поводу "вранья" ...  ну до ладно...

 

 

b707
Offline
Зарегистрирован: 26.05.2017

mr_givan пишет:

Результат выдает правильный 2 и 0.5 что и требовалось доказать...

Поэтому у меня даже в мыслях не было обратить внимание на тип данных  используемых при деление.

а что это за язык. Разве это С/С++ ?

Речь про "любые компиляторы" был исключительно про Си. Если вы "программируете 35 лет" и ни разу за это время не писали на Си - то разве это программирование? :))))))))))))

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

mr_givan пишет:

А по поводу "вранья" 

Оно продолжается! 

Речь шла о целочисленном делении, а Вы подсунули деление с плавающей точкой. Зачем Вы пошли на подлог? Или Вы не отличаете целочисленное деление от плавающего? Или не знаете как устроено деление в Бейсике, пример на котором привели? В таком случае враньём является Ваш 35-летний стаж программирования.

mr_givan
Offline
Зарегистрирован: 21.04.2020

ЕвгенийП пишет:

Речь шла о целочисленном делении, 

В каком месте моего сообщения написано хоть слово о "целочисленном делении"?

Часто бывает,  что видишь то что хочешь, а не то что написано...

b707
Offline
Зарегистрирован: 26.05.2017

mr_givan пишет:

В каком месте моего сообщения написано хоть слово о "целочисленном делении"?

в 10 и 11 строке кода

Как раз от того, что вы этого не понимаете - и родился ваш "крик души".

А теперь вы это узнали. И чего вы опять шумите?

mr_givan
Offline
Зарегистрирован: 21.04.2020

b707 пишет:

 Если вы "программируете 35 лет" и ни разу за это время не писали на Си - то разве это программирование? :))))))))))))

Когда я начинал писать программы считалось, что если ты не пишешь на Assembler, то ты не программист...

Думаю многие находящиеся здесь ни разу не писали на Assembler, но я не считаю, что они не программисты... Все относительно в этом мире...

 

mr_givan
Offline
Зарегистрирован: 21.04.2020

b707 пишет:

в 10 и 11 строке кода

Правильно ли я вас понял, что оператором "/" вызывается "целочисленное деление"? Так, как других комментариев в тексте нет.

Тогда уточните, пожалуйста,  каким оператором вызывается "не целочисленное деление"? 

Что бы больше не возникало вопросов.

SLKH
Offline
Зарегистрирован: 17.08.2015

mr_givan пишет:

Когда я начинал писать программы считалось, что если ты не пишешь на Assembler, то ты не программист...

Думаю многие находящиеся здесь ни разу не писали на Assembler, но я не считаю, что они не программисты... Все относительно в этом мире...

Я писал на ассемблере. Я не программист.

DIYMan
DIYMan аватар
Offline
Зарегистрирован: 23.11.2015

Не стоит бросаться на этом форуме фразами про медали и ордена ;) У нас тут знатоков, которые знают 20 языков на университетском уровне - периодически ловят на простейших косяках и всей казармой по@бывают, знаете ли.

По сути вопроса: если у вас стаж 35 лет, то вы должны понимать, что то или иное поведение - применимо исключительно к инструменту (языку и компилятору с него), которым вы пользуетесь в данный момент. Зачем был приведён совершенно некорректный пример на Васике - в этом случае совершенно непонятно, и вызывает справедливые вопросы к вашей компетенции. С таким же успехом можно привести пример на любом языке с неявной типизацией, например, на том же JavaScript. Но это не будет значить, что С++ - какой-то неправильный, не находите?

Поэтому единственно правильное, что можно сделать - это прислушаться к советам и начать учить некоторые основы С++, несмотря на 35 лет стажа.

DIYMan
DIYMan аватар
Offline
Зарегистрирован: 23.11.2015

mr_givan пишет:

Тогда уточните, пожалуйста,  каким оператором вызывается "не целочисленное деление"? 

Ооооо..... Что-то про 35 лет стажа - больше похоже на просиживание штанов, уж простите за прямоту. Во многих ЯП оператор / - это оператор деления, какое оно будет - зависит от стандарта языка и типов операндов, как минимум.

Говорить после 35 лет стажа про "оператор не целочисленного деления" - это пять!

b707
Offline
Зарегистрирован: 26.05.2017

mr_givan пишет:

Правильно ли я вас понял, что оператором "/" вызывается "целочисленное деление"? Так, как других комментариев в тексте нет.

Тогда уточните, пожалуйста,  каким оператором вызывается "не целочисленное деление"? 

Что бы больше не возникало вопросов.

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

И это не все.  Вас еще ждет масса сюрпризов с типами, например если оба операнда uint16_t  - результат тоже будет на uint16_t, даже если результат в этот тип уже не помещается.

DIYMan
DIYMan аватар
Offline
Зарегистрирован: 23.11.2015

Короче: https://en.cppreference.com/w/cpp/language/operator_arithmetic - раздел "Multiplicative operators".

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

mr_givan пишет:

В каком месте моего сообщения написано хоть слово о "целочисленном делении"?

В коде из стартового сообщения топика.

 

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

mr_givan пишет:

Тогда уточните, пожалуйста,  каким оператором вызывается "не целочисленное деление"? 

Что бы больше не возникало вопросов.

Чтобы больше не возникало вопросов, возьмите любую книгу уровня "C language for idiots" и прочитайте. 

mr_givan
Offline
Зарегистрирован: 21.04.2020

Спасибо всем кто очень толерантно и емко ответил на вопрос.

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

Не за что.

-NMi-
Offline
Зарегистрирован: 20.08.2018

ЕвгенийП пишет:

Чтобы больше не возникало вопросов, возьмите любую книгу уровня "C language for idiots" и прочитайте. 

Петрович, а ссылко где? Чиста хачу для прочитать.

MaksVV
Offline
Зарегистрирован: 06.08.2015

видимо 35 лет это не стаж, а временной промежуток между программированием давно на бейсике и начинанием сейчас на С. 

ua6em
ua6em аватар
Offline
Зарегистрирован: 17.08.2016

sadman41 пишет:
Получить float без float? Я бы посмотрел на такое бескостылье.

не, ну ты же понял как далее пойдёт тема (я о холиваре)... )))
PS угадал жеж...ассемблер и т.д. ...изобретатель уже всё пояснил вроде как...по самой теме

ua6em
ua6em аватар
Offline
Зарегистрирован: 17.08.2016

ЕвгенийП пишет:

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

может не отбрасывает, а его там просто нет (если посмотреть в машинных кодах сами операции)?

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

ua6em пишет:

может не отбрасывает, а его там просто нет (если посмотреть в машинных кодах сами операции)?

Если его нет, значит его отбросила аппаратура.

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

-NMi- пишет:

ЕвгенийП пишет:

книгу уровня "C language for idiots"

Петрович, а ссылко где?

Только для Вас! даже две!

Complete Idiot's Guide to C++

C++ For Dummies

Читайте на здоровье!

vlad072
Offline
Зарегистрирован: 01.08.2017

Форум трололо. Что в большей степени не позволяет просто ответить человеку на вопрос, высокомерие, избыток "гениальности" или просто гнилая натура?

b707
Offline
Зарегистрирован: 26.05.2017

vlad072 пишет:

Форум трололо. Что в большей степени не позволяет просто ответить человеку на вопрос, высокомерие, избыток "гениальности" или просто гнилая натура?

так ответили уже

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

vlad072 пишет:

Что в большей степени не позволяет просто ответить человеку на вопрос, высокомерие, избыток "гениальности" или просто гнилая натура?

Всё вместе, и ещё общевысокий уровень говнистости, коронавирус и гнусные происки мирового империализма, большевиков и жидомасонов.

DetSimen
DetSimen аватар
Offline
Зарегистрирован: 25.01.2017

и пахмелье. 

ua6em
ua6em аватар
Offline
Зарегистрирован: 17.08.2016

vlad072 пишет:

Форум трололо. Что в большей степени не позволяет просто ответить человеку на вопрос, высокомерие, избыток "гениальности" или просто гнилая натура?

да нет, человек чётко понимает типы данных выбирая для делимого и делителя BYTE и потом типо удивляется, смотрится как откровенный троллинг форума, не находите???

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

ua6em пишет:

 человек чётко понимает 

Не просто человек, а человек с 35-летним стажем программирования. Который работал с компиляторами Бэйсика "немного другого уровня", не то, что мы - сопляки.

SLKH
Offline
Зарегистрирован: 17.08.2015

ЕвгенийП пишет:

vlad072 пишет:

Что в большей степени не позволяет просто ответить человеку на вопрос, высокомерие, избыток "гениальности" или просто гнилая натура?

Всё вместе, и ещё общевысокий уровень говнистости, коронавирус и гнусные происки мирового империализма, большевиков и жидомасонов.

печенегов забыл.

Bruzzer
Offline
Зарегистрирован: 17.03.2020

ua6em пишет:

смотрится как откровенный троллинг форума, не находите???

И форум охотно откликается, и включается в процесс задействуя свой "общевысокий уровень говнистости".

DetSimen
DetSimen аватар
Offline
Зарегистрирован: 25.01.2017

Bruzzer пишет:

И форум охотно откликается, и включается в процесс задействуя свой "общевысокий уровень говнистости".

Дак, ну ж не хочете - не ешьте. 

b707
Offline
Зарегистрирован: 26.05.2017

Bruzzer пишет:

И форум охотно откликается, и включается в процесс задействуя свой "общевысокий уровень говнистости".

так мы ж для этого сюда и ходим! А вы для чего?

ua6em
ua6em аватар
Offline
Зарегистрирован: 17.08.2016

b707 пишет:

Bruzzer пишет:

И форум охотно откликается, и включается в процесс задействуя свой "общевысокий уровень говнистости".

так мы ж для этого сюда и ходим! А вы для чего?

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

DIYMan
DIYMan аватар
Offline
Зарегистрирован: 23.11.2015

vlad072 пишет:

Форум трололо. Что в большей степени не позволяет просто ответить человеку на вопрос, высокомерие, избыток "гениальности" или просто гнилая натура?

Без высокомерия щас никуда - придёт такой чёткий пацанчик на форум, начинает со всеми через губу разговаривать - тут только высокомерием приходится бить. Гениальностью - мы отмахиваемся от особо назойливых, с 35-летним стажем общения с компилятором Васика, или со знанием 20 языков программирования на уровне выше университетского. Тут, сам понимаешь, одним высокомерием не обойтись, приходится гениальность подключать.

А гнилая натура - припасена как раз для тех, кто вбрасывает говно на вентилятор. Ну типа тебя, ты понял, да? Куда идти - знаешь? А то не стесняйся, спроси - мы подскажем. Без высокомерия, гениальности и гнили - просто и быстро подскажем.

Подсказать, или сам догадался?

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

DIYMan пишет:
с 35-летним стажем общения с компилятором Васика
Не просто компилятором, а компилятором "немного другого уровня" - это две большие разницы.

progrik
Offline
Зарегистрирован: 30.12.2018

человек просто 35 лет думал тихо себе в подушку, что он программист. успокойтесь уже))

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

Да все спокойны, как Самсон перед филистимлянами.

progrik
Offline
Зарегистрирован: 30.12.2018

но конечно, когда "то что под рукой" - бейсик... это фиаско))

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

progrik пишет:

конечно, когда "то что под рукой" - бейсик... это фиаско))

А когда его приводят в качестве аргумента в разговоре о С++ - это уже даже не фиаско, а полный залёт и 35-летний стаж -:)

DetSimen
DetSimen аватар
Offline
Зарегистрирован: 25.01.2017

Стаж и Васик неразлучны, как Полиспаст и Клепсидра. 

mykaida
mykaida аватар
Offline
Зарегистрирован: 12.07.2018

Друзья, вы разговариваете между собой, поскольку ТС обо-ся 35 лет - это срок. А мы, как положено, все в белом, а остальные...