Мне надо в числовой тэг объекта (float) запихнуть два числа. Номер объекта в некоем массиве, но еще и каждый объект по тегу должен знать а какой он из скольки.
Другими словами, например дробь 3/4 — содержит эту информацию — у нас как бы третий объект из четырех.
А вот та же самая дробь в другом представлении — 0.75 — уже эту информацию теряет.
Как в 0.75 засунуть инфу о 3/4 ?
Можно конечно использовать разряды. Например 3/4 зашифровать в 3004. Но может красивше есть решение?
Здравствуйте, B-52, Вы писали:
B5>Здравствуйте, Homunculus, Вы писали:
H>>Можно конечно использовать разряды. Например 3/4 зашифровать в 3004. Но может красивше есть решение?
B5>- Б4 B5>- Ранил!
Здравствуйте, Homunculus, Вы писали:
H>Действительно, не все потянут, что 0.5 — это и пятый из десяти и третий из шести.
Так сокращать дроби где-то примерно тогда и учат, или еще раньше.
Здравствуйте, pagid, Вы писали:
P>Здравствуйте, Homunculus, Вы писали:
H>>Действительно, не все потянут, что 0.5 — это и пятый из десяти и третий из шести. P>Так сокращать дроби где-то примерно тогда и учат, или еще раньше.
Так это сокращение я имел ввиду под «потеря информации». Но понять это смогли не только ли все, мало кто смог понять. И стали меня тыкать в программу 6 класса
H>Как в 0.75 засунуть инфу о 3/4 ?
H>Можно конечно использовать разряды. Например 3/4 зашифровать в 3004. Но может красивше есть решение?
Думаю, в любом случае будет стрёмная эквилибристика. Другой вариант, кроме поразрядного:
Если знаменатель всегда меньше числителя, можно в целой части хранить знаменатель, в дробной -- значение дроби.
trunc(4.75) = 4 -- знаменатель
round( frac(4.75)*trunc(4.75) ) = round( 0.75 * 4 ) = 3 -- числитель
Здравствуйте, Homunculus, Вы писали:
H>Так это сокращение я имел ввиду под «потеря информации». Но понять это смогли не только ли все, мало кто смог понять. И стали меня тыкать в программу 6 класса
Тогда никакой потери информации в переходе от 0.75 к 3/4 и не было. В 0.75 в принципе нет информации три это из четырех или шесть из восьми. Ну так-то это 75 из 100, но это неважно.
Здравствуйте, Homunculus, Вы писали:
H>Можно конечно использовать разряды. Например 3/4 зашифровать в 3004. Но может красивше есть решение?
Речь о двух целых числах?
Каковы их диапазоны?
Есть известный алгоритм по взаимно-однозначному отображению рациональных чисел на целые.
Судя по всему, речь идёт даже о натуральных числах.
Тогда есть очевидное решение — нумерация треугольником:
0
1
2
3
0
0
1
3
6
1
2
4
7
2
5
8
3
9
Тут n[x, y] = (x+y)*(x+y+1)/2+y
В обратную сторону cходу формулу не напишу — но, похоже, надо будет брать квадратный корень, округлять и вычитать.
Уйдемте отсюда, Румата! У вас слишком богатые погреба.
Здравствуйте, Homunculus, Вы писали:
H>Мне надо в числовой тэг объекта (float) запихнуть два числа.
Запихни туда адрес объекта, содержащего нужное тебе в удобном формате. Да, надо будет подпрыгнуть в приседе чтобы из float получить адрес, добраться до объекта и так далее. Зато работать потом будет удобно.
Здравствуйте, Homunculus, Вы писали:
H>Мне надо в числовой тэг объекта (float) запихнуть два числа. Номер объекта в некоем массиве, но еще и каждый объект по тегу должен знать а какой он из скольки.
Ну вообще в машинном представлении float это мантисса и степень. Если хочется простоты и наглядности, то цела и дробная части.
Например, число 3/4 записать как 3.4. Изврат, конечно, что там с точностью — хз, но зато просто и наглядно.
Немного не так. В данном случае известно, что x < y, y >= 1 (по семантике y — это размер массива, а x — zero-based индекс элемента в массиве). Поэтому треугольник лучше сделать таким:
x — по горизонтали, y — по вертикали
0
1
2
3
1
0
2
1
2
3
3
4
5
4
6
7
8
9
И формула попроще:
n[x, y] = x + y*(y-1)/2;
Обратное преобразование мне выводить тоже лень
(И да, придется иметь дело с квадратным корнем и округлениями).
--
Справедливость выше закона. А человечность выше справедливости.
Здравствуйте, Homunculus, Вы писали:
R3>>А заказчику это надо? H>Дело не в том, что надо заказчику, а в том, какой инструментарий предоставляет некий движок. А предоставляет он float тэг
float это нонче 64 бита же? Ну и кодируй ими два 32-битных числа, числитель и знаменатель.
H>Можно конечно использовать разряды. Например 3/4 зашифровать в 3004. Но может красивше есть решение?
Распихать по битикам — это ж самое естественное. Только не забывай, у тебя не все варианты доступны — много NaN-ов и тебе их с высокой вероятностью превратят в один единственный вариант NaN-а.
Здравствуйте, Homunculus, Вы писали:
H>Дело не в том, что надо заказчику, а в том, какой инструментарий предоставляет некий движок. А предоставляет он float тэг
1. Попытка натянуть сову на глобус. Заказчик тут очень важен. Завтра он тебе скажет хранить строку, ты её тоже во float пихать будешь?
2. В данном случае единственный (вроде) вариант: первое число хранить до точки, второе — после. Но не знаю, как float с этим справится.
Здравствуйте, Homunculus, Вы писали:
Pzz>>Как в одно число засунуть два числя? Никак!
H>Спорное утверждение. Хочешь сказать, что "3/4" — это не "число", а "действие"?
Я хочу сказать, что 3/4, чем бы оно не было, состоит из двух независимых параметров. Технически их можно засунуть в 4 байта, если разрядов хватает дня представления обоих параметров с приемлимой точностью (например, разбросав по разрядам, не важно, в двоичной записи или в десятичной). Но оно от этого не перестанет быть двумя независимыми параметрами.
Здравствуйте, ути-пути, Вы писали:
УП>Тогда тебе плавающая точка не подходит, только в виде изначальных не сокращенных дробей.
Ну, плавющую точку от него требует его framework, а он может вполне совместить в памяти (union, reinterpret_cast и т.п.) float и пару целых чисел подходящего размера и на своей стороне работать с этой парой. Нужно только позаботиться, чтоб в NaN-ы не залетать.
--
Справедливость выше закона. А человечность выше справедливости.
Здравствуйте, Homunculus, Вы писали:
H>Как раз вопрос и был задан, потому что это и важно
Тогда и храни два числа. А как, это в зависимости в каких они пределах могут изменяться. 3004 вполне годный вариант, если для знаменателя достаточно трех десятичных разрядов. Некрасивое решение? А оно некрасивое по причине необходимости использовать float, то есть уже кривое и записью "3004" кривее/некрасивее не сделаешь.
Здравствуйте, ути-пути, Вы писали:
D>>float это нонче 64 бита же? Ну и кодируй ими два 32-битных числа, числитель и знаменатель. УП>Вроде могут быть нюансы со специальными значениями типа nan, inf и т.п.?
нам то что оно float вообще не очень интересно, поэтому и nan/inf тоже. Для нас это 64 бита, которые мы как хотим так и рассматриваем:
А, да, если этот float десериализуется из строчки, или ещё где-то участвует в операциях с плавающей точкой, тогда бОльшая беда, конечно. Тогда тупо математикой — про порядок забиыть, пользоваться мантиссой в десятичном представлении, как тс изначально писал — числитель*выбранное смещение + знаменатель.
Слуш, вопрос не в тему. Увидел твою подпись. У тебя действительно такая необычная двойная фамилия? А почему так получилось? Если я конечно не лезу не в свое дело, просто интересно. Нисколько не хотел задеть вопросом.
Здравствуйте, ути-пути, Вы писали:
УП>Вроде могут быть нюансы со специальными значениями типа nan, inf и т.п.?
И поэтому не стоит играться с битами или пытаться объединить union'ом. Нужно как и изначально предложил ТС самому себе и нам преобразовывать в целое, а его уже во float и обратно (если нужно). Оценить конечно область допустимых значений и при преобразовании из float округлять, а не отбрасывать, но эту уже капитанствую.
Здравствуйте, Dair, Вы писали:
D>нам то что оно float вообще не очень интересно, поэтому и nan/inf тоже. Для нас это 64 бита, которые мы как хотим так и рассматриваем:
Мы-то да, можем его рассматривать как сырую память, а вот как этот float рассматривает его библиотека, и не перекорячит ли где-то у себя внутре — это вопрос.
Переубедить Вас, к сожалению, мне не удастся, поэтому сразу перейду к оскорблениям.
Здравствуйте, Homunculus, Вы писали:
H>Слуш, вопрос не в тему. Увидел твою подпись. У тебя действительно такая необычная двойная фамилия? А почему так получилось? Если я конечно не лезу не в свое дело, просто интересно. Нисколько не хотел задеть вопросом.
У меня в самом деле такая фамилия. У отца была такая же, у деда — тоже.
Семейная легенда говорит, что при царе-горохе некая моя русская пра-пра-[...]-бабушка, имя и даты утратились, вышла замуж в Российской Империи за австрийца Шмидтгофа (Schmidt — кузнец, Hof — двор, т.е., то ли придворный кузнец, то ли попросту кузнецкий двор), который потом куда-то потратился, и тогда она вышла замуж за Лебедева, который усыновил её сына от первого брака. А поскольку тогда в Империи уже был национализм, то "чужую кровь", чтобы не терять, оставили и с исходной фамилией тоже. Насколько это правда — я , спросить уже не с кого, я теперь самый старший с такой фамилией.
Здравствуйте, ути-пути, Вы писали:
D>>нам то что оно float вообще не очень интересно, поэтому и nan/inf тоже. Для нас это 64 бита, которые мы как хотим так и рассматриваем: УП>Мы-то да, можем его рассматривать как сырую память, а вот как этот float рассматривает его библиотека, и не перекорячит ли где-то у себя внутре — это вопрос.
Да, поэтому я бы имплементацию метода floatTagToMyNumbers и myNumbersToFloatTag писал бы во время отладки (или, там, класса-конвертера), посмотрев, что происходит с тем или иным тэгом.
Здравствуйте, Dair, Вы писали:
D>Семейная легенда говорит, что при царе-горохе некая моя русская пра-пра-[...]-бабушка, имя и даты утратились, женилась в Российской Империи на австрийце Шмидтгофе (Schmidt — кузнец, Hof — двор, т.е., то ли придворный кузнец, то ли попросту кузнецкий двор), который потом куда-то потратился, и тогда она вышла замуж за Лебедева, который усыновил её сына от первого брака. А поскольку тогда в Империи уже был национализм, то "чужую кровь", чтобы не терять, оставили и с исходной фамилией тоже. Насколько это правда — я , спросить уже не с кого, я теперь самый старший с такой фамилией.
Здравствуйте, ути-пути, Вы писали:
УП>Здравствуйте, Dair, Вы писали:
D>>float это нонче 64 бита же? Ну и кодируй ими два 32-битных числа, числитель и знаменатель.
Нет. Это float64 нонче 64 бита и то в Go.
число с плавающей запятой двойной точности IEEE 754 всегда равно 64 битам. Аналогично, одинарная точность float всегда равна 32 битам.
Здравствуйте, Dair, Вы писали:
D>Да, поэтому я бы имплементацию метода floatTagToMyNumbers и myNumbersToFloatTag писал бы во время отладки (или, там, класса-конвертера), посмотрев, что происходит с тем или иным тэгом.
Это ничего не гарантирует, библиотека может раз в полнолуние менять поведение для одного единственного значения, а потом опять работать нормально, до следующего полнолуния.
Переубедить Вас, к сожалению, мне не удастся, поэтому сразу перейду к оскорблениям.
Здравствуйте, ути-пути, Вы писали:
D>>Да, поэтому я бы имплементацию метода floatTagToMyNumbers и myNumbersToFloatTag писал бы во время отладки (или, там, класса-конвертера), посмотрев, что происходит с тем или иным тэгом. УП>Это ничего не гарантирует, библиотека может раз в полнолуние менять поведение для одного единственного значения, а потом опять работать нормально, до следующего полнолуния.
Можно обойти все неудобные значения, чтобы всегда был корректный float, которому ничего не грозит от перекладывания через всякие регистры. Но тут предлагали способы гораздо проще, хоть и еще больше сужающие диапазоны возможных значений.
Переубедить Вас, к сожалению, мне не удастся, поэтому сразу перейду к оскорблениям.
Здравствуйте, Sheridan, Вы писали:
S>Запихни туда адрес объекта, содержащего нужное тебе в удобном формате. Да, надо будет подпрыгнуть в приседе чтобы из float получить адрес, добраться до объекта и так далее. Зато работать потом будет удобно.
А чтоб не зависеть от платформы, вместо адреса можно запихивать индекс в массиве. А в массив уже можно запихнуть все, что угодно, без ограничений на размер элемента.
--
Справедливость выше закона. А человечность выше справедливости.
Здравствуйте, Homunculus, Вы писали:
H>Не знай в какую тему сунуть вопрос, поэтому сюда.
H>Мне надо в числовой тэг объекта (float) запихнуть два числа. Номер объекта в некоем массиве, но еще и каждый объект по тегу должен знать а какой он из скольки.
Неужели у тебя на столько закрытый и нерасширяемый формат, что надо так извращаться?
Конечно ты можешь этот float кастить в последовательность байт и делать с ним всё что угодно (первые два байта числитель, следующие знаменатель).
Но может можно как-то по человечески расширить формат?
А ещё можно кодировать в большие целые. Например: 13240
Жирным идёт информация о количестве знаков, далее идёт число. Округляешь до целых и декодируешь.
Здравствуйте, rg45, Вы писали:
R>Так в этом же и вопрос, собсно: как лучше упаковать два целых числа в один float. По поводу семантики у него вопросов нет, насколько я могу судить.
Во float чертовски неудобно, там мантисса, порядок, каждые со своими знаками, эти биты причудливо сочетаются и не все комбинации валидны.
Тут надо смотреть. Если доступны честные 4 байта, пусть даже они называются словом float, но никто не контролирует валидность этого float'а, то проще всего использовать их, как две группы по 16 бит. В противном случае, я бы посмотрел, какой диапазон целых чисел доступен для точного представления в виде float, и распоряжался бы ими примерно так, как Homunculus изначально предполагал.
Здравствуйте, Лось Чтостряслось, Вы писали:
ЛЧ>>>нет такого числа QC>>Есть 3.399999999999 ? ЛЧ>типа того
Если мне склероз не изменяет, то если задано литералом, типа float X=3.4, то будет 3.4, а если результат операции, ну типа x = 34/10, то уже тогда — да, или 3.399999999999 или 3.40000000000001.
Здравствуйте, Dym On, Вы писали:
DO>Если мне склероз не изменяет, то если задано литералом, типа float X=3.4, то будет 3.4, а если результат операции, ну типа x = 34/10, то уже тогда — да, или 3.399999999999 или 3.40000000000001.
мне казалось некоторые значения в принципе не могут храниться в float
Здравствуйте, Лось Чтостряслось, Вы писали:
ЛЧ>мне казалось некоторые значения в принципе не могут храниться в float
И это понятно — float, как и другие числовые типы представлены фиксированным количеством бит, соответственно могут обестечить представление лишь какого-то конечного числа вариантов. Тогда как множество вещественных числел бесконечно на любом отрезке числовой прямой (для любой пары различных вещественных чисел всегда найдется третье вещественное число, которое будет больше одного и меньше другого).
--
Справедливость выше закона. А человечность выше справедливости.
Здравствуйте, Homunculus, Вы писали:
H>Так делают те, кто хотят сделать себя незаменимым в проекте и чтоб проект гикнулся после ухода того, кто так делает
Ещё так делают те, кто не любит писать документацию.
Здравствуйте, Лось Чтостряслось, Вы писали:
ЛЧ>мне казалось некоторые значения в принципе не могут храниться в float
Ну естественно, разрядная сетка не бесконечна.
от того, что с этим float делает движок. Если вообще ничего не делает, не сериализует и не преобразовывает, то тупо reinterpret_cast из float в int, и дальше побитно. Например, два 16-битных индекса.
Если движок что-то делает, то надо разбираться, что именно, и уже оттуда плясать. Например, если он преобразовывает эти теги строку и обратно, то надо смотреть, как там будет работать округление, что потеряется, а что нет.
Самый бронебойный вариант — вообще забить на тэги, и сделать хэш-таблицу от уникалього ID объекта, если он есть. По производительности будет вменяемо + большинство граблей это решение облетит на версту. Если нет unique id, то можно завести свою таблицу (линейную или хэш) и писать в этот float номер записи в этой таблице. Опять же надо смотреть, что там будет с точностью при сериализации.
Здравствуйте, pugv, Вы писали:
P>Здравствуйте, Maniacal, Вы писали:
M>>Только на 32-битной архитектуре.
P>Я на это и намекал. Качественно расставленные грабли. Не говоря уже о сериализации, что тоже упомянули ниже.
Грабли решаются static_assert-ом. А вообще, это из серии "быстро, дешево, качественно: выбери любые два". Качественный вариант — изучать/менять движок. Быстрый вариант — расставлять грабли и метить их флажками.
Здравствуйте, rg45, Вы писали:
R>А чтоб не зависеть от платформы, вместо адреса можно запихивать индекс в массиве. А в массив уже можно запихнуть все, что угодно, без ограничений на размер элемента.
Только может потребоваться какое-то дополнительное хранилище для массива. Мы ж не знаем, может эти float библиотека где-то в БД хранит между сессиями. Вообще, ТС мог бы добавить подробностей.
Переубедить Вас, к сожалению, мне не удастся, поэтому сразу перейду к оскорблениям.
Здравствуйте, Homunculus, Вы писали:
H>Мне надо в числовой тэг объекта (float) запихнуть два числа. Номер объекта в некоем массиве, но еще и каждый объект по тегу должен знать а какой он из скольки.
H>Другими словами, например дробь 3/4 — содержит эту информацию — у нас как бы третий объект из четырех.
белиберда какая то массив объектов один или несколько ? если один — то дели номер (объекта) на длину массива и всё — нафига это хранить ?
H>Можно конечно использовать разряды. Например 3/4 зашифровать в 3004. Но может красивше есть решение?
сначала опиши задачу нормально
если несколько (с объектами) — то тут зависит от того, может ли размер массивов динамически меняться / есть ли многопоток ?
если нет, то введи поле id в объект и юзай чё нить типа Hashmap ..
Здравствуйте, xma, Вы писали:
xma>белиберда какая то массив объектов один или несколько ? если один — то дели номер (объекта) на длину массива и всё — нафига это хранить ?
Ага, "нихера не понял, но совет дам".
--
Справедливость выше закона. А человечность выше справедливости.
разумно предположить, что делает то, что можно, а то что нельзя — не делает, не?
если оно не NaN — выживет, а если не денормализованное — выживет даже если попадет в лапы какого-то убогого процессора. т.е выкинуть два варианта экспоненты, все остальное — наше, вопрос только чтобы точности хватило
Здравствуйте, Je suis Mamut, Вы писали:
JSM>разумно предположить, что делает то, что можно, а то что нельзя — не делает, не?
Правильно. Но можно быть точнее, вдруг делает лишь какое-то подмножество из допустимого.
JSM>если оно не NaN — выживет, а если не денормализованное — выживет даже если попадет в лапы какого-то убогого процессора. т.е выкинуть два варианта экспоненты, все остальное — наше, вопрос только чтобы точности хватило
А если оно не грузится в регистры, а только перекладывается в памяти, то может выжить в любом виде.
Переубедить Вас, к сожалению, мне не удастся, поэтому сразу перейду к оскорблениям.
Здравствуйте, xma, Вы писали:
xma>можно подумать что ты (или кто то ещё) понял что он вообще хочет ? как изложил — такие и советы ..
По-крайней мере, настолько тупых ответов, как у тебя здесь ни у кого больше нет. Ты единственный отличился.
xma>не говоря уже (про тебя) о том — зачем нормальному высокооплачиваемому прогеру — топить за коммунизм ..
"люди" — всю Вселенную уже по полочкам разложили (на основе принципиальной неразличимости больше некоторого максимального числа уникальных Вселенных — через экран монитора (или любые иные цифровые интерфейсы)) ..
но коммунисты да, всегда считали себя "самыми умными" (c) — на деле по факту оказываясь самыми отсталыми ..
"люди" — всю Вселенную уже по полочкам разложили (на основе принципиальной неразличимости больше некоторого максимального числа уникальных Вселенных — через экран монитора (или любые иные цифровые интерфейсы)) .. xma>но коммунисты да, всегда считали себя "самыми умными" (c) — на деле по факту оказываясь самыми отсталыми ..
Не мороси, истеричка.
--
Справедливость выше закона. А человечность выше справедливости.
xma> расскажи как на духу — на нормальную то работу, коммунистов не берут, да ?
А ты представь, что он купил 50000 биткоинов в 2009-м году, когда они стоили по одному центу.
Деньги для него сейчас не проблема, но рассказывать он тебе об этом не сможет и не будет.
Какая тогда у него будет на твои слова реакция?
Надо изучить формат float и засунуть туда битами что ты хош. В первом приближении можно просто два 16-битовых числа засунуть. Вроде никому от этого плохо не должно быть.
Здравствуйте, Sheridan, Вы писали:
S>Здравствуйте, Homunculus, Вы писали:
H>>Мне надо в числовой тэг объекта (float) запихнуть два числа. S>Запихни туда адрес объекта, содержащего нужное тебе в удобном формате. Да, надо будет подпрыгнуть в приседе чтобы из float получить адрес, добраться до объекта и так далее. Зато работать потом будет удобно.
Если уж кастить, то почему не к двум short — 2x2 bytes (если, конечно, 2 байта достаточно для индекса)? Тогда будет меньше проблем с сериализацией к примеру. Хотя все равно о кроссплатформенности можно забыть. Ранее предложенное решение по взаимно-однозначному отображению рациональных чисел на целые гораздо интереснее, если индексы не должны быть сильно большими.
Я бы вообще не советовал использовать tag c float, а поискать решение получше. Выглядит стремно, нечитабельно, наверняка приведет к проблемам в будущем — как и все подобные хаки. В общем лучше иметь отдельную мапу Object2Info и через нее получать все дополнительные данные.
Здравствуйте, Homunculus, Вы писали:
H>Другими словами, например дробь 3/4 — содержит эту информацию — у нас как бы третий объект из четырех. H>А вот та же самая дробь в другом представлении — 0.75 — уже эту информацию теряет.
Вроде выше советловали в битах кодировать: кол-во бит -- всего число элементов, и далее по обычным
правилам двоичной арифметики представить соотв. число. Т.е. работать с бинарным массивом.
Здравствуйте, vfedosov, Вы писали:
V>Я бы вообще не советовал использовать tag c float, а поискать решение получше. Выглядит стремно, нечитабельно, наверняка приведет к проблемам в будущем — как и все подобные хаки. В общем лучше иметь отдельную мапу Object2Info и через нее получать все дополнительные данные.
Совершенно согласен.
Здравствуйте, Homunculus, Вы писали:
H>Мне надо в числовой тэг объекта (float) запихнуть два числа. Номер объекта в некоем массиве, но еще и каждый объект по тегу должен знать а какой он из скольки.