Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск  
 
 
Рейтинг 4.73/15: Рейтинг темы: голосов - 15, средняя оценка - 4.73
-41 / 49 / 5
Регистрация: 10.01.2017
Сообщений: 1,915

Почему битовые операции нельзя применять к переменной с плавающей точкой?

12.05.2023, 17:36. Показов 3460. Ответов 52
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Здравствуйте,

Собственно сам вопрос: почему битовые операции нельзя применять к переменной с плавающей точкой типа float и double ?

То есть я понимаю, что double и float - это не целые числа и изменение бит не отображается "прямолинейно" на самом интерпретируемом значении хранящемся в double и float, но тут вопрос, не в этом, а в том, что за это отвечает программист и если он что то не так сдвинул и тому подобное, то это проблемы программиста.

Ведь в С и С++ никто не запрещает писать за пределы своей выделенной памяти, почему же тут на запрет битовый операций ?

Или есть какой то "технический" момент ну там "труднореализуемый" ?
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
12.05.2023, 17:36
Ответы с готовыми решениями:

Ошибка операции с плавающей точкой
Program qqq; Uses crt; var i,n:byte; s:real; begin clrscr; Writeln('Vvedite n'); Readln(n); s:=0;

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

Арифметические операции с числами с плавающей точкой
Почему 360-0.1!=359.90000000.. а ерунде? и как это исправить? (вложен рисунок) int main() { double min=0; double step=0.10; ...

52
Эксперт .NET
 Аватар для Rius
13353 / 7808 / 1695
Регистрация: 25.05.2015
Сообщений: 23,790
Записей в блоге: 14
13.05.2023, 09:23
Студворк — интернет-сервис помощи студентам
А давайте ещё в российских законах пропишем правила поведения путешественников во времени при их нахождении в прошлом?
Не важно, то это никому не нужно, смысл люди сами найдут!
0
фрилансер
 Аватар для Алексей1153
6495 / 5724 / 1133
Регистрация: 11.10.2019
Сообщений: 15,286
13.05.2023, 09:30
Цитата Сообщение от Optimus11 Посмотреть сообщение
То есть писать за пределы выделенной памяти - тоже смысла нет, однако С и С++ предоставляют такую возможность.
они это не запрещают, так как не делают таких проверок (иначе бы это был удар по производительности).
Они надеются на грамотность программиста - что он уже обеспечил этот невыход за край
0
-41 / 49 / 5
Регистрация: 10.01.2017
Сообщений: 1,915
13.05.2023, 09:35  [ТС]
Цитата Сообщение от Алексей1153 Посмотреть сообщение
они это не запрещают, так как не делают таких проверок (иначе бы это был удар по производительности).
Они надеются на грамотность программиста - что он уже обеспечил этот невыход за край
Ну так программист сам делает проверки, которые в итоге также снижают в итоге производительность.
Почему в одном случае "надеются на грамотность программиста", а в другом это не нужно, потому что программист не справится с форматом значения с плавающей точкой ?
0
фрилансер
 Аватар для Алексей1153
6495 / 5724 / 1133
Регистрация: 11.10.2019
Сообщений: 15,286
13.05.2023, 09:43
Цитата Сообщение от Optimus11 Посмотреть сообщение
Ну так программист сам делает проверки
программист сделает одну проверку, а затем запустит длиннющий цикл, где обращений к массиву будет миллиард. Но при этом будет обеспечено, что индекс не выходит за край. Сравни с миллиардом проверок, если бы язык это сам контролировал. Кстати, в дебажной конфигурации это таки делается, отчего дебажный процесс намного более тормознутый, чем релизный

Добавлено через 1 минуту
Цитата Сообщение от Optimus11 Посмотреть сообщение
с форматом значения с плавающей точкой
скопируй переменную в массив нужного размера функцией memcpy, затем спокойно ковыряй биты После этого можешь скопировать обратно при помощи опять же memcpy.

Добавлено через 1 минуту
кстати, в итоговом коде (после оптимизации) не будет вызова функции memcpy, будет обычное копирование, как это происходит в выражении навроде a=b.
Только при этом не будет UB, как при реинтерпретации через указатели или union
0
-41 / 49 / 5
Регистрация: 10.01.2017
Сообщений: 1,915
13.05.2023, 10:22  [ТС]
Цитата Сообщение от Алексей1153 Посмотреть сообщение
скопируй переменную в массив нужного размера функцией memcpy, затем спокойно ковыряй биты После этого можешь скопировать обратно при помощи опять же memcpy.
Это немного нивелирует смысл битовых операций, ну как я это понимаю по крайней мере - а именно скорость.
То есть придется по сути бессмысленно два раза копировать память.
0
Комп_Оратор)
Эксперт по математике/физике
 Аватар для IGPIGP
9007 / 4708 / 630
Регистрация: 04.12.2011
Сообщений: 14,003
Записей в блоге: 16
13.05.2023, 11:05
Цитата Сообщение от Optimus11 Посмотреть сообщение
Я об этом в самом первом сообщении написал, возможно несовсем корректно, но писал так:
То есть я понимаю, что double и float - это не целые числа и изменение бит не отображается "прямолинейно" на самом интерпретируемом значении хранящемся в double и float, но тут вопрос, не в этом, а в том, что за это отвечает программист и если он что то не так сдвинул и тому подобное, то это проблемы программиста.
Я не поверил тогда, да и сейчас не верю что вы действительно понимаете
что double и float - это не целые числа и изменение бит не отображается
на целое число. Не на "интерпретируемом значении хранящемся в double и float" . На целое. В вашей фразе вы говорите о том что представление double не отображается на значение double "прямолинейно". Это легче было бы сказать говоря о формате чисел с плавающей точкой. Вот я вас и спросил о том, как вы представляете отображение double в целое той же длины. Я не имел ввиду, как-то вас унизить, а хотел дать вам возможность подумать и аргументированно ответить. Однако, вы не отвечаете на вопрос, а отписываетесь в виде, "да знаю я, - знаю". Нет смысла продолжать такой диалог.
Всего доброго.
0
фрилансер
 Аватар для Алексей1153
6495 / 5724 / 1133
Регистрация: 11.10.2019
Сообщений: 15,286
13.05.2023, 11:12
Цитата Сообщение от Optimus11 Посмотреть сообщение
бессмысленно два раза копировать память.
почему бессмысленно? Тебе же зачем-то нужен этот сдвиг. Так что, смысл для тебя, вроде, есть
0
-41 / 49 / 5
Регистрация: 10.01.2017
Сообщений: 1,915
13.05.2023, 11:17  [ТС]
Цитата Сообщение от IGPIGP Посмотреть сообщение
. Вот я вас и спросил о том, как вы представляете отображение double в целое той же длины. Нет смысла продолжать такой диалог.
Всего доброго.
В том, что диалог в данном случае нет смысла продолжать - с этим я согласен. Потому что Вы задаете один и тот же не относящийся к теме вопрос, про форматы, а по сути вопроса так и не можете ответить.

Добавлено через 1 минуту
Цитата Сообщение от Алексей1153 Посмотреть сообщение
почему бессмысленно? Тебе же зачем-то нужен этот сдвиг. Так что, смысл для тебя, вроде, есть
Бессмысленно в том плане, что, если бы стандартом был предусмотрена прямая операция сдвига на переменными с плавающей точкой.
Вам же когда нужен сдвиг в int - вы же не делаете это бессмысленное копирование.
0
фрилансер
 Аватар для Алексей1153
6495 / 5724 / 1133
Регистрация: 11.10.2019
Сообщений: 15,286
13.05.2023, 11:36
Цитата Сообщение от Optimus11 Посмотреть сообщение
если бы стандартом был предусмотрена прямая операция сдвига на переменными с плавающей точкой
а до кучи - побитовое не, или, и, исключающее или (~, |, & ^). Вот бы зажили Но, не судьба.
Попробуй отправить предложение в комитет стандартизации

Цитата Сообщение от Optimus11 Посмотреть сообщение
Вам же когда нужен сдвиг в int
ни разу не был нужен. И даже не представляю, зачем мне может понадобится делать сдвиг знакового типа
0
-41 / 49 / 5
Регистрация: 10.01.2017
Сообщений: 1,915
13.05.2023, 11:46  [ТС]
Цитата Сообщение от Алексей1153 Посмотреть сообщение
ни разу не был нужен. И даже не представляю, зачем мне может понадобится делать сдвиг знакового типа
Например для преобразования символа в кодировке UTF-8 в само Юникодное значение и наоборот.
Для преобразования Кодировки UTF-16 в UTF-8 и наоборот.
Или для создания маски для последующего "копирования" бит из одной переменной в другую.
Да мало ли где еще.
Битовые операции точно не лишние в языках.
0
19501 / 10106 / 2461
Регистрация: 30.01.2014
Сообщений: 17,825
13.05.2023, 12:21
Optimus11, все эти примеры гораздо лучше реализуются на беззнаковом множестве, чем на знаковом. По этой причине он и пишет, что на знаковом числе сдвиг не применял: это закономерно, потому что например сдвиг вправо на отрицательном числе - это implementation-defined behaviour, а сдвиг влево за знаковый бит - это undefined behavior. Так что техническая реализация использующая сдвиги на знаковых числах должна быть крайне аккуратно написана и совершенно не подходит, когда нужен весь диапазон разрядной сетки, как в ваших примерах.

Добавлено через 14 минут
Цитата Сообщение от Optimus11 Посмотреть сообщение
однако С и С++ предоставляют такую возможность
Здесь логическая ошибка. C\C++ не предоставляет эту возможность, он просто не способен без снижения производительности проконтролировать все такие случаи. Т.е. это вынужденная мера. Это не отменяет того, что стандарт объявляет такие действия некорректными, но не требует диагностики этих действий.
Проще говоря, если за углом не стоит ДПС-ник и не смотрит как вы перебегаете дорогу в неположенном месте, это не означает, что вы совершаете правомерное действие.
По этой же причине существует UB для сдвига знаковых отрицательных чисел. Потому что не всегда это возможно проконтролировать без привлечения дополнительных затрат. Поэтому запрет есть, но обязательная диагностика запрета не требуется.
В случае же с вашим вопросом все определено на этапе компиляции - поэтому контроль за этим может быть явным.
1
фрилансер
 Аватар для Алексей1153
6495 / 5724 / 1133
Регистрация: 11.10.2019
Сообщений: 15,286
13.05.2023, 12:29
Optimus11, я вручную кодировки не перегоняю, для этого предоставляет функции ОС или фреймворк
0
19501 / 10106 / 2461
Регистрация: 30.01.2014
Сообщений: 17,825
13.05.2023, 12:29
Цитата Сообщение от Optimus11 Посмотреть сообщение
Почему в одном случае "надеются на грамотность программиста", а в другом это не нужно, потому что программист не справится с форматом значения с плавающей точкой ?
Не думаю, что "надежда на грамотность" - это какое-то формальное правило при разработке стандарта. Если стандарт что-то оставляет на откуп программисту, то только потому, что нет эффективной технической возможности это проверить автоматически.
Если начнут добавлять такие проверки, то это приведет к тому, что C++ превратится в C#. Он вынужден будет обзавестись виртуальной машиной, с помощью которой станет возможно контролировать память и другие аспекты.
0
-41 / 49 / 5
Регистрация: 10.01.2017
Сообщений: 1,915
13.05.2023, 12:40  [ТС]
Цитата Сообщение от DrOffset Посмотреть сообщение
Optimus11, все эти примеры гораздо лучше реализуются на беззнаковом множестве, чем на знаковом. По этой причине он и пишет, что на знаковом числе сдвиг не применял: это закономерно, потому что например сдвиг вправо на отрицательном числе - это implementation-defined behaviour, а сдвиг влево за знаковый бит - это undefined behavior. Так что техническая реализация использующая сдвиги на знаковых числах должна быть крайне аккуратно написана и совершенно не подходит, когда нужен весь диапазон разрядной сетки, как в ваших примерах.

Добавлено через 14 минут

Здесь логическая ошибка. C\C++ не предоставляет эту возможность, он просто не способен без снижения производительности проконтролировать все такие случаи. Т.е. это вынужденная мера. Это не отменяет того, что стандарт объявляет такие действия некорректными, но не требует диагностики этих действий.
Проще говоря, если за углом не стоит ДПС-ник и не смотрит как вы перебегаете дорогу в неположенном месте, это не означает, что вы совершаете правомерное действие.
По этой же причине существует UB для сдвига знаковых отрицательных чисел. Потому что не всегда это возможно проконтролировать без привлечения дополнительных затрат. Поэтому запрет есть, но обязательная диагностика запрета не требуется.
В случае же с вашим вопросом все определено на этапе компиляции - поэтому контроль за этим может быть явным.
Понял, Спасибо.
0
13.05.2023, 15:53

Не по теме:

Цитата Сообщение от Optimus11 Посмотреть сообщение
Потому что Вы задаете один и тот же не относящийся к теме вопрос, про форматы, а по сути вопроса так и не можете ответить.
Optimus11, это ужи и грубо. Такая агрессия и не желание ответить на вопрос, типа, - А как вы себе представляете стандартизацию сдвига для doublе? это демонстрация особого рода неостроты мысли и грубости обращения (что есть следствие формы мыслительного процесса, в свою очередь). Прощайте.

0
-41 / 49 / 5
Регистрация: 10.01.2017
Сообщений: 1,915
13.05.2023, 23:37  [ТС]
Цитата Сообщение от IGPIGP Посмотреть сообщение

Не по теме:


Optimus11, это ужи и грубо. Такая агрессия и не желание ответить на вопрос, типа, - А как вы себе представляете стандартизацию сдвига для doublе? это демонстрация особого рода неостроты мысли и грубости обращения (что есть следствие формы мыслительного процесса, в свою очередь). Прощайте.



Не по теме:


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

0
Вездепух
Эксперт CЭксперт С++
 Аватар для TheCalligrapher
13210 / 6843 / 1824
Регистрация: 18.10.2014
Сообщений: 17,306
13.05.2023, 23:47
Цитата Сообщение от Optimus11 Посмотреть сообщение
Сдвиг битов и логические операции с целочисленными переменными уже есть в С и С++ - мой вопрос в который раз, в чем была дополнительная сложность сделать тоже самое с float и double ? А уж смысл двигать биты во float и double - пусть ищет сам программист.
В языках С и С++ термин бит обозначает разряды со значениями 0 и 1, фигурирующие в записи числа в позиционной системе счисления с основанием 2. С точки зрения языка эти биты в не имеют никакого отношения к битам памяти в двоичном компьтере. Все битовые операции в языка С и С++ - это операции над воображаемой записью числа в позиционной системе счисления с основанием 2.

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

А о каких "битах" вы ведете речь вообще в случае плавающих чисел? Откуда они возьмутся? Стандарт не вводит понятия "записи числа в позиционной системе счисления с основанием 2" для плавающих чисел. Сделано (точнее, не сделано) это по вполне понятным причинам: представления плавающих чисел весьма нетривиальны и никаких веских причин опираться на основание 2 для таких представлений нет. Да и пользы от стандартизации такого воображамого представления - никакой.

Поэтому и не существует никаких "битов" в плавающих числах.
3
Супер-модератор
Эксперт функциональных языков программированияЭксперт Python
 Аватар для Catstail
38209 / 21142 / 4312
Регистрация: 12.02.2012
Сообщений: 34,755
Записей в блоге: 14
13.05.2023, 23:52
Цитата Сообщение от TheCalligrapher Посмотреть сообщение
Поэтому и не существует никаких "битов" в плавающих числах.
- это сильно!

"А дьявола тоже нет? – вдруг весело осведомился больной у Ивана Николаевича.
– И дьявола… – Не противоречь! – одними губами шепнул Берлиоз, обрушиваясь за спину профессора и гримасничая.
– Нету никакого дьявола! – растерявшись от всей этой муры, вскричал Иван Николаевич не то, что нужно,
– вот наказание! Перестаньте вы психовать!
Тут безумный расхохотался так, что из липы над головами сидящих выпорхнул воробей.
– Ну, уж это положительно интересно, – трясясь от хохота, проговорил профессор, – что же это у вас, чего ни хватишься, ничего нет!" М.А. Булгаков М&М

1
Комп_Оратор)
Эксперт по математике/физике
 Аватар для IGPIGP
9007 / 4708 / 630
Регистрация: 04.12.2011
Сообщений: 14,003
Записей в блоге: 16
14.05.2023, 01:35
Цитата Сообщение от Catstail Посмотреть сообщение
- это сильно!
"В белом плаще, с красным подбоем, " выехал дябло (double), на двоичной мантиссе. В яблоках.
Catstail, да, - они там, и правда, - двоичные. И мантиссы и экспоненты. А упряжь по формату.
Но верно то, что беззнаковое целое в двоичном формате это таки двоичный формат целого числа, а плавающее это наложении как минимум, двух форматов - двоичного представления мантиссы, двоичного представления экспоненты, (1 формат) и способ их упаковки в одну запись - (2-й формат). А есть ещё и разные виды нормализации мантисс (если правильно помню).
Так что, строго говоря, плавающее это не двоичное число, а некий набор двоичных чисел.
И виной всему упаковка и с применением экспоненты. Без неё любое плавающее можно было бы представить как целое, но длина записи не помещалась бы ни в какие разумные рамки. Но тогда, можно было бы говорить о двоичных операциях.
Я считаю, что формат это ключевое слово. А формат (даже если отвлечься от платормозависимости), не даёт каких-то разумных резонов в пользу того, что бы что-то сдвигать или ещё как-то побитово логически устанавливать. Если бы такие нашлись, - другое дело. Был бы смысл поднимать вопрос.

Не по теме:

Цитата Сообщение от Optimus11 Посмотреть сообщение
В том, что диалог в данном случае нет смысла продолжать - с этим я согласен. Потому что Вы задаете один и тот же не относящийся к теме вопрос, про форматы, а по сути вопроса так и не можете ответить.
Вот это не мои проблемы и их мне не нужно перекладывать.

0
Нарушитель
623 / 381 / 67
Регистрация: 09.03.2016
Сообщений: 4,218
14.05.2023, 01:47
Какие проблемы?
Хошь сдвигай,
хошь не сдвигай.
Лишь бы с крышею беды не было...
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
14.05.2023, 01:47

Освещение. ошибка операции с плавающей точкой
задание: построить тетраэдр и кольца которые будут вращаться вокруг него. код: #include <GL\glut.h> #include <GL\glu.h> ...

Арифметические операции для чисел с плавающей точкой
При написании программы возникла проблема с использованием операторов для чисел с плавающей точкой(FADD, FSUB, FMUL etc). .8087 ;...

Когда нельзя применять метод наложения и почему?
ЭЛЕКТРОТЕХНИКА !!!СРОЧНО НУЖНЫ ОТВЕТЫ НА ВОПРОСЫ ПО ЭЛЕКТРОТЕХНИКЕ!!!!БУДУ ОЧЕНЬ БЛАГОДАРНА! 1) когда нельзя применять метод наложения...

Арифметические операции над числами в формате с плавающей точкой
Есть 2 числа: -0.625 и -52.000 Необходимо написать по шагам последовательность действий, реализующих операцию сложения. 1. Перевожу...

Метод выводит не то, что нужно операции с плавающей точкой
Я уже весь мозг себе сломал. Не понимаю, почему не работает. Пробовал отдельно выводить height, все правильно, ratio, тоже правильно,...


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

Или воспользуйтесь поиском по форуму:
40
Ответ Создать тему
Новые блоги и статьи
Учебный мини "цифровой двойник" = (Сервер = Java + Flask_питон )+(3D = Гугловскаая 4T nvideo + google colab) +( WMS = Odoo на Docker)
anaschu 07.07.2026
Увидел в требованиях к вакансии создателя имитационных моделей связку (REst + Api + WMS + Anylogic + питон + 3D Nvideo), и решил посмотреть, что это такое. Из этого всего я работал более менее. . .
Море в объективе
kumehtar 06.07.2026
Хотел написать много проникновенных слов, но передумал. Оно само - говорит. Кто слышит тот слышит.
Doom для терминала без стрельбы и монстров. 3D Raycasting на ascii.
dcc0 05.07.2026
Попросил нейронную сеть deepai. org написать рейкастинг 3D с библиотекой ncurses для Linux. Чтобы можно было ходить на стрелочки. Чтобы стены были отрисованы символами. Справилась. Первый вариант. . .
Установка статуса документа по условию
Maks 05.07.2026
Алгоритм из решения ниже реализован на нетиповом документе "НарядПутевка" разработанного в КА2. Задача: в табличной части "Материалы" документа при записи автоматически устанавливать статус. . .
Сезонность и суточность закисления почв
anaschu 04.07.2026
200 часов это все равно моловато. Есть ситуации, но нестандартные, когда смена происходит за 5 лет. Но обычно это 50 лет и более. Наверное, закисление почвы происходит сезонно в средней. . .
В чем ценность человеческого опыта в глобальном смысле?
kumehtar 03.07.2026
Возможно, ценность человека не в том, что он однажды достигает мудрости, а в том, что он становится носителем карты пути. Он знает не только истину, но и последовательность внутренних изменений,. . .
интеграция AnyLogic с самописным REST API и переход на Odoo
anaschu 03.07.2026
Успешная интеграция AnyLogic с самописным REST API и переход на промышленную Odoo WMS Сегодня проделал огромный путь от простой симуляции физических процессов до построения полноценной. . .
Поиск всех путей на ориентированном графе. Linux
dcc0 02.07.2026
Переработка старого кода из моей статьи. Через несколько переработок от PHP кода к C89 (надеюсь, 89). Но довольно запутанно получилось. Код для Linux. Но если убрать time и то, что с ним. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru