Проблемы с результатом при операции деления.Крик Души
- Войдите на сайт для отправки комментариев
Втр, 21/04/2020 - 13:54
Добрый день. с толкнулся с проблемой при операции деления. Написал простейший скетч.
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.
Подскажите, что это может быть. Куда смотреть?
Хэ1 или Хэ2 в каждой формуле умножь на 1.0 или приведи к типу float.
Вот подтянется Евгений Петрович и объяснит человеку, как надо правильно делить в целочисленной арифметике, безо всяких ваших костылей )))
TC, у тебя образование какое-нить есть? Целочисленное деление в школе уже проходил или не добрались еще?
Получить float без float? Я бы посмотрел на такое бескостылье.
Всем спасибо кто ответил по "делу", и тем кто решил просто по умничать.
Программирую уже более 35 лет, но ни когда не было проблем с результатом, если тип переменной в которое записывается значение, соответствовал этому значению. Наверно компиляторы немного другого уровня.
Наверно компиляторы немного другого уровня.
Ну вот, опять компилятор виноват.
Судя по результатам он тебе выводит X1 в виде OCT.
А вот это "типичный случай так-называемого вранья".
Целочисленное деление отбрасывает остаток в любом компиляторе, независимо от того, куда его (результат) потом присваивают.
Ну, разве что "ни когда". Если "ни когда", то да, тут всё возможно.
А вот это "типичный случай так-называемого вранья".
Целочисленное деление отбрасывает остаток в любом компиляторе, независимо от того, куда его (результат) потом присваивают.
Ну, разве что "ни когда". Если "ни когда", то да, тут всё возможно.
Целочисленное деление отбрасывает остаток в любом компиляторе, независимо от того, куда его (результат) потом присваивают.
Вашими же словами..
.А вот это "типичный случай так-называемого вранья".
Взял первое что под рукой было.
Результат выдает правильный 2 и 0.5 что и требовалось доказать...
Поэтому у меня даже в мыслях не было обратить внимание на тип данных используемых при деление.
А по поводу "вранья" ... ну до ладно...
Результат выдает правильный 2 и 0.5 что и требовалось доказать...
Поэтому у меня даже в мыслях не было обратить внимание на тип данных используемых при деление.
а что это за язык. Разве это С/С++ ?
Речь про "любые компиляторы" был исключительно про Си. Если вы "программируете 35 лет" и ни разу за это время не писали на Си - то разве это программирование? :))))))))))))
А по поводу "вранья"
Оно продолжается!
Речь шла о целочисленном делении, а Вы подсунули деление с плавающей точкой. Зачем Вы пошли на подлог? Или Вы не отличаете целочисленное деление от плавающего? Или не знаете как устроено деление в Бейсике, пример на котором привели? В таком случае враньём является Ваш 35-летний стаж программирования.
Речь шла о целочисленном делении,
В каком месте моего сообщения написано хоть слово о "целочисленном делении"?
Часто бывает, что видишь то что хочешь, а не то что написано...
В каком месте моего сообщения написано хоть слово о "целочисленном делении"?
в 10 и 11 строке кода
Как раз от того, что вы этого не понимаете - и родился ваш "крик души".
А теперь вы это узнали. И чего вы опять шумите?
Если вы "программируете 35 лет" и ни разу за это время не писали на Си - то разве это программирование? :))))))))))))
Когда я начинал писать программы считалось, что если ты не пишешь на Assembler, то ты не программист...
Думаю многие находящиеся здесь ни разу не писали на Assembler, но я не считаю, что они не программисты... Все относительно в этом мире...
в 10 и 11 строке кода
Правильно ли я вас понял, что оператором "/" вызывается "целочисленное деление"? Так, как других комментариев в тексте нет.
Тогда уточните, пожалуйста, каким оператором вызывается "не целочисленное деление"?
Что бы больше не возникало вопросов.
Когда я начинал писать программы считалось, что если ты не пишешь на Assembler, то ты не программист...
Думаю многие находящиеся здесь ни разу не писали на Assembler, но я не считаю, что они не программисты... Все относительно в этом мире...
Не стоит бросаться на этом форуме фразами про медали и ордена ;) У нас тут знатоков, которые знают 20 языков на университетском уровне - периодически ловят на простейших косяках и всей казармой по@бывают, знаете ли.
По сути вопроса: если у вас стаж 35 лет, то вы должны понимать, что то или иное поведение - применимо исключительно к инструменту (языку и компилятору с него), которым вы пользуетесь в данный момент. Зачем был приведён совершенно некорректный пример на Васике - в этом случае совершенно непонятно, и вызывает справедливые вопросы к вашей компетенции. С таким же успехом можно привести пример на любом языке с неявной типизацией, например, на том же JavaScript. Но это не будет значить, что С++ - какой-то неправильный, не находите?
Поэтому единственно правильное, что можно сделать - это прислушаться к советам и начать учить некоторые основы С++, несмотря на 35 лет стажа.
Тогда уточните, пожалуйста, каким оператором вызывается "не целочисленное деление"?
Ооооо..... Что-то про 35 лет стажа - больше похоже на просиживание штанов, уж простите за прямоту. Во многих ЯП оператор / - это оператор деления, какое оно будет - зависит от стандарта языка и типов операндов, как минимум.
Говорить после 35 лет стажа про "оператор не целочисленного деления" - это пять!
Правильно ли я вас понял, что оператором "/" вызывается "целочисленное деление"? Так, как других комментариев в тексте нет.
Тогда уточните, пожалуйста, каким оператором вызывается "не целочисленное деление"?
Что бы больше не возникало вопросов.
Если оба операнда целые - результат будет вычислен по правилам целочисленного деления(независимо от типа переменной. куда потом кладется результат), если хотя бы один из операндов имеет тип флоат - будет не целочисленное
И это не все. Вас еще ждет масса сюрпризов с типами, например если оба операнда uint16_t - результат тоже будет на uint16_t, даже если результат в этот тип уже не помещается.
Короче: https://en.cppreference.com/w/cpp/language/operator_arithmetic - раздел "Multiplicative operators".
В каком месте моего сообщения написано хоть слово о "целочисленном делении"?
В коде из стартового сообщения топика.
Тогда уточните, пожалуйста, каким оператором вызывается "не целочисленное деление"?
Что бы больше не возникало вопросов.
Чтобы больше не возникало вопросов, возьмите любую книгу уровня "C language for idiots" и прочитайте.
Спасибо всем кто очень толерантно и емко ответил на вопрос.
Не за что.
Чтобы больше не возникало вопросов, возьмите любую книгу уровня "C language for idiots" и прочитайте.
Петрович, а ссылко где? Чиста хачу для прочитать.
видимо 35 лет это не стаж, а временной промежуток между программированием давно на бейсике и начинанием сейчас на С.
не, ну ты же понял как далее пойдёт тема (я о холиваре)... )))
PS угадал жеж...ассемблер и т.д. ...изобретатель уже всё пояснил вроде как...по самой теме
Целочисленное деление отбрасывает остаток в любом компиляторе, независимо от того, куда его (результат) потом присваивают.
может не отбрасывает, а его там просто нет (если посмотреть в машинных кодах сами операции)?
может не отбрасывает, а его там просто нет (если посмотреть в машинных кодах сами операции)?
Если его нет, значит его отбросила аппаратура.
книгу уровня "C language for idiots"
Петрович, а ссылко где?
Только для Вас! даже две!
Complete Idiot's Guide to C++
C++ For Dummies
Читайте на здоровье!
Форум трололо. Что в большей степени не позволяет просто ответить человеку на вопрос, высокомерие, избыток "гениальности" или просто гнилая натура?
Форум трололо. Что в большей степени не позволяет просто ответить человеку на вопрос, высокомерие, избыток "гениальности" или просто гнилая натура?
так ответили уже
Что в большей степени не позволяет просто ответить человеку на вопрос, высокомерие, избыток "гениальности" или просто гнилая натура?
Всё вместе, и ещё общевысокий уровень говнистости, коронавирус и гнусные происки мирового империализма, большевиков и жидомасонов.
и пахмелье.
Форум трололо. Что в большей степени не позволяет просто ответить человеку на вопрос, высокомерие, избыток "гениальности" или просто гнилая натура?
да нет, человек чётко понимает типы данных выбирая для делимого и делителя BYTE и потом типо удивляется, смотрится как откровенный троллинг форума, не находите???
человек чётко понимает
Не просто человек, а человек с 35-летним стажем программирования. Который работал с компиляторами Бэйсика "немного другого уровня", не то, что мы - сопляки.
Что в большей степени не позволяет просто ответить человеку на вопрос, высокомерие, избыток "гениальности" или просто гнилая натура?
Всё вместе, и ещё общевысокий уровень говнистости, коронавирус и гнусные происки мирового империализма, большевиков и жидомасонов.
смотрится как откровенный троллинг форума, не находите???
И форум охотно откликается, и включается в процесс задействуя свой "общевысокий уровень говнистости".
И форум охотно откликается, и включается в процесс задействуя свой "общевысокий уровень говнистости".
Дак, ну ж не хочете - не ешьте.
И форум охотно откликается, и включается в процесс задействуя свой "общевысокий уровень говнистости".
так мы ж для этого сюда и ходим! А вы для чего?
И форум охотно откликается, и включается в процесс задействуя свой "общевысокий уровень говнистости".
так мы ж для этого сюда и ходим! А вы для чего?
ну не совсем, иногда знающие действительную проблему помогут разрешить, а так да, времяпрепровождения для )))
Форум трололо. Что в большей степени не позволяет просто ответить человеку на вопрос, высокомерие, избыток "гениальности" или просто гнилая натура?
Без высокомерия щас никуда - придёт такой чёткий пацанчик на форум, начинает со всеми через губу разговаривать - тут только высокомерием приходится бить. Гениальностью - мы отмахиваемся от особо назойливых, с 35-летним стажем общения с компилятором Васика, или со знанием 20 языков программирования на уровне выше университетского. Тут, сам понимаешь, одним высокомерием не обойтись, приходится гениальность подключать.
А гнилая натура - припасена как раз для тех, кто вбрасывает говно на вентилятор. Ну типа тебя, ты понял, да? Куда идти - знаешь? А то не стесняйся, спроси - мы подскажем. Без высокомерия, гениальности и гнили - просто и быстро подскажем.
Подсказать, или сам догадался?
человек просто 35 лет думал тихо себе в подушку, что он программист. успокойтесь уже))
Да все спокойны, как Самсон перед филистимлянами.
но конечно, когда "то что под рукой" - бейсик... это фиаско))
конечно, когда "то что под рукой" - бейсик... это фиаско))
А когда его приводят в качестве аргумента в разговоре о С++ - это уже даже не фиаско, а полный залёт и 35-летний стаж -:)
Стаж и Васик неразлучны, как Полиспаст и Клепсидра.
Друзья, вы разговариваете между собой, поскольку ТС обо-ся 35 лет - это срок. А мы, как положено, все в белом, а остальные...