Здравствуйте, Homunculus, Вы писали:
H>Слуш, вопрос не в тему. Увидел твою подпись. У тебя действительно такая необычная двойная фамилия? А почему так получилось? Если я конечно не лезу не в свое дело, просто интересно. Нисколько не хотел задеть вопросом.
У меня в самом деле такая фамилия. У отца была такая же, у деда — тоже.
Семейная легенда говорит, что при царе-горохе некая моя русская пра-пра-[...]-бабушка, имя и даты утратились, вышла замуж в Российской Империи за австрийца Шмидтгофа (Schmidt — кузнец, Hof — двор, т.е., то ли придворный кузнец, то ли попросту кузнецкий двор), который потом куда-то потратился, и тогда она вышла замуж за Лебедева, который усыновил её сына от первого брака. А поскольку тогда в Империи уже был национализм, то "чужую кровь", чтобы не терять, оставили и с исходной фамилией тоже. Насколько это правда — я , спросить уже не с кого, я теперь самый старший с такой фамилией.
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 -- числитель
Здравствуйте, B-52, Вы писали:
B5>Здравствуйте, Homunculus, Вы писали:
H>>Можно конечно использовать разряды. Например 3/4 зашифровать в 3004. Но может красивше есть решение?
B5>- Б4 B5>- Ранил!
Здравствуйте, Dym On, Вы писали:
DO>Если мне склероз не изменяет, то если задано литералом, типа float X=3.4, то будет 3.4, а если результат операции, ну типа x = 34/10, то уже тогда — да, или 3.399999999999 или 3.40000000000001.
мне казалось некоторые значения в принципе не могут храниться в float
Здравствуйте, 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>Как раз вопрос и был задан, потому что это и важно
Тогда и храни два числа. А как, это в зависимости в каких они пределах могут изменяться. 3004 вполне годный вариант, если для знаменателя достаточно трех десятичных разрядов. Некрасивое решение? А оно некрасивое по причине необходимости использовать float, то есть уже кривое и записью "3004" кривее/некрасивее не сделаешь.
Здравствуйте, Homunculus, Вы писали:
H>Мне надо в числовой тэг объекта (float) запихнуть два числа.
Запихни туда адрес объекта, содержащего нужное тебе в удобном формате. Да, надо будет подпрыгнуть в приседе чтобы из float получить адрес, добраться до объекта и так далее. Зато работать потом будет удобно.
Здравствуйте, Dair, Вы писали:
D>Да, поэтому я бы имплементацию метода floatTagToMyNumbers и myNumbersToFloatTag писал бы во время отладки (или, там, класса-конвертера), посмотрев, что происходит с тем или иным тэгом.
Это ничего не гарантирует, библиотека может раз в полнолуние менять поведение для одного единственного значения, а потом опять работать нормально, до следующего полнолуния.
Переубедить Вас, к сожалению, мне не удастся, поэтому сразу перейду к оскорблениям.
Здравствуйте, Лось Чтостряслось, Вы писали:
ЛЧ>мне казалось некоторые значения в принципе не могут храниться в float
И это понятно — float, как и другие числовые типы представлены фиксированным количеством бит, соответственно могут обестечить представление лишь какого-то конечного числа вариантов. Тогда как множество вещественных числел бесконечно на любом отрезке числовой прямой (для любой пары различных вещественных чисел всегда найдется третье вещественное число, которое будет больше одного и меньше другого).
--
Справедливость выше закона. А человечность выше справедливости.
Здравствуйте, pagid, Вы писали:
P>Здравствуйте, Homunculus, Вы писали:
H>>Действительно, не все потянут, что 0.5 — это и пятый из десяти и третий из шести. P>Так сокращать дроби где-то примерно тогда и учат, или еще раньше.
Так это сокращение я имел ввиду под «потеря информации». Но понять это смогли не только ли все, мало кто смог понять. И стали меня тыкать в программу 6 класса
H>Можно конечно использовать разряды. Например 3/4 зашифровать в 3004. Но может красивше есть решение?
Распихать по битикам — это ж самое естественное. Только не забывай, у тебя не все варианты доступны — много NaN-ов и тебе их с высокой вероятностью превратят в один единственный вариант NaN-а.
Здравствуйте, Homunculus, Вы писали:
Pzz>>Как в одно число засунуть два числя? Никак!
H>Спорное утверждение. Хочешь сказать, что "3/4" — это не "число", а "действие"?
Я хочу сказать, что 3/4, чем бы оно не было, состоит из двух независимых параметров. Технически их можно засунуть в 4 байта, если разрядов хватает дня представления обоих параметров с приемлимой точностью (например, разбросав по разрядам, не важно, в двоичной записи или в десятичной). Но оно от этого не перестанет быть двумя независимыми параметрами.
Здравствуйте, Dair, Вы писали:
D>нам то что оно float вообще не очень интересно, поэтому и nan/inf тоже. Для нас это 64 бита, которые мы как хотим так и рассматриваем:
Мы-то да, можем его рассматривать как сырую память, а вот как этот float рассматривает его библиотека, и не перекорячит ли где-то у себя внутре — это вопрос.
Переубедить Вас, к сожалению, мне не удастся, поэтому сразу перейду к оскорблениям.
Здравствуйте, ути-пути, Вы писали:
УП>Здравствуйте, Dair, Вы писали:
D>>float это нонче 64 бита же? Ну и кодируй ими два 32-битных числа, числитель и знаменатель.
Нет. Это float64 нонче 64 бита и то в Go.
число с плавающей запятой двойной точности IEEE 754 всегда равно 64 битам. Аналогично, одинарная точность float всегда равна 32 битам.
Здравствуйте, Homunculus, Вы писали:
H>Действительно, не все потянут, что 0.5 — это и пятый из десяти и третий из шести.
Так сокращать дроби где-то примерно тогда и учат, или еще раньше.
Здравствуйте, ути-пути, Вы писали:
D>>float это нонче 64 бита же? Ну и кодируй ими два 32-битных числа, числитель и знаменатель. УП>Вроде могут быть нюансы со специальными значениями типа nan, inf и т.п.?
нам то что оно float вообще не очень интересно, поэтому и nan/inf тоже. Для нас это 64 бита, которые мы как хотим так и рассматриваем:
А, да, если этот float десериализуется из строчки, или ещё где-то участвует в операциях с плавающей точкой, тогда бОльшая беда, конечно. Тогда тупо математикой — про порядок забиыть, пользоваться мантиссой в десятичном представлении, как тс изначально писал — числитель*выбранное смещение + знаменатель.
Здравствуйте, Dair, Вы писали:
D>Семейная легенда говорит, что при царе-горохе некая моя русская пра-пра-[...]-бабушка, имя и даты утратились, женилась в Российской Империи на австрийце Шмидтгофе (Schmidt — кузнец, Hof — двор, т.е., то ли придворный кузнец, то ли попросту кузнецкий двор), который потом куда-то потратился, и тогда она вышла замуж за Лебедева, который усыновил её сына от первого брака. А поскольку тогда в Империи уже был национализм, то "чужую кровь", чтобы не терять, оставили и с исходной фамилией тоже. Насколько это правда — я , спросить уже не с кого, я теперь самый старший с такой фамилией.
Можно обойти все неудобные значения, чтобы всегда был корректный float, которому ничего не грозит от перекладывания через всякие регистры. Но тут предлагали способы гораздо проще, хоть и еще больше сужающие диапазоны возможных значений.
Переубедить Вас, к сожалению, мне не удастся, поэтому сразу перейду к оскорблениям.
от того, что с этим float делает движок. Если вообще ничего не делает, не сериализует и не преобразовывает, то тупо reinterpret_cast из float в int, и дальше побитно. Например, два 16-битных индекса.
Если движок что-то делает, то надо разбираться, что именно, и уже оттуда плясать. Например, если он преобразовывает эти теги строку и обратно, то надо смотреть, как там будет работать округление, что потеряется, а что нет.
Самый бронебойный вариант — вообще забить на тэги, и сделать хэш-таблицу от уникалього ID объекта, если он есть. По производительности будет вменяемо + большинство граблей это решение облетит на версту. Если нет unique id, то можно завести свою таблицу (линейную или хэш) и писать в этот float номер записи в этой таблице. Опять же надо смотреть, что там будет с точностью при сериализации.
Мне надо в числовой тэг объекта (float) запихнуть два числа. Номер объекта в некоем массиве, но еще и каждый объект по тегу должен знать а какой он из скольки.
Другими словами, например дробь 3/4 — содержит эту информацию — у нас как бы третий объект из четырех.
А вот та же самая дробь в другом представлении — 0.75 — уже эту информацию теряет.
Как в 0.75 засунуть инфу о 3/4 ?
Можно конечно использовать разряды. Например 3/4 зашифровать в 3004. Но может красивше есть решение?
Здравствуйте, Homunculus, Вы писали:
H>Так это сокращение я имел ввиду под «потеря информации». Но понять это смогли не только ли все, мало кто смог понять. И стали меня тыкать в программу 6 класса
Тогда никакой потери информации в переходе от 0.75 к 3/4 и не было. В 0.75 в принципе нет информации три это из четырех или шесть из восьми. Ну так-то это 75 из 100, но это неважно.
Здравствуйте, 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-битных числа, числитель и знаменатель.
Здравствуйте, Homunculus, Вы писали:
H>Дело не в том, что надо заказчику, а в том, какой инструментарий предоставляет некий движок. А предоставляет он float тэг
1. Попытка натянуть сову на глобус. Заказчик тут очень важен. Завтра он тебе скажет хранить строку, ты её тоже во float пихать будешь?
2. В данном случае единственный (вроде) вариант: первое число хранить до точки, второе — после. Но не знаю, как float с этим справится.
Здравствуйте, ути-пути, Вы писали:
УП>Тогда тебе плавающая точка не подходит, только в виде изначальных не сокращенных дробей.
Ну, плавющую точку от него требует его framework, а он может вполне совместить в памяти (union, reinterpret_cast и т.п.) float и пару целых чисел подходящего размера и на своей стороне работать с этой парой. Нужно только позаботиться, чтоб в NaN-ы не залетать.
--
Справедливость выше закона. А человечность выше справедливости.
Слуш, вопрос не в тему. Увидел твою подпись. У тебя действительно такая необычная двойная фамилия? А почему так получилось? Если я конечно не лезу не в свое дело, просто интересно. Нисколько не хотел задеть вопросом.
Здравствуйте, ути-пути, Вы писали:
УП>Вроде могут быть нюансы со специальными значениями типа nan, inf и т.п.?
И поэтому не стоит играться с битами или пытаться объединить union'ом. Нужно как и изначально предложил ТС самому себе и нам преобразовывать в целое, а его уже во float и обратно (если нужно). Оценить конечно область допустимых значений и при преобразовании из float округлять, а не отбрасывать, но эту уже капитанствую.
Здравствуйте, ути-пути, Вы писали:
D>>нам то что оно float вообще не очень интересно, поэтому и nan/inf тоже. Для нас это 64 бита, которые мы как хотим так и рассматриваем: УП>Мы-то да, можем его рассматривать как сырую память, а вот как этот float рассматривает его библиотека, и не перекорячит ли где-то у себя внутре — это вопрос.
Да, поэтому я бы имплементацию метода floatTagToMyNumbers и myNumbersToFloatTag писал бы во время отладки (или, там, класса-конвертера), посмотрев, что происходит с тем или иным тэгом.
Здравствуйте, ути-пути, Вы писали:
D>>Да, поэтому я бы имплементацию метода floatTagToMyNumbers и myNumbersToFloatTag писал бы во время отладки (или, там, класса-конвертера), посмотрев, что происходит с тем или иным тэгом. УП>Это ничего не гарантирует, библиотека может раз в полнолуние менять поведение для одного единственного значения, а потом опять работать нормально, до следующего полнолуния.
Здравствуйте, 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.
Здравствуйте, Homunculus, Вы писали:
H>Так делают те, кто хотят сделать себя незаменимым в проекте и чтоб проект гикнулся после ухода того, кто так делает
Ещё так делают те, кто не любит писать документацию.
Здравствуйте, Лось Чтостряслось, Вы писали:
ЛЧ>мне казалось некоторые значения в принципе не могут храниться в 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) запихнуть два числа. Номер объекта в некоем массиве, но еще и каждый объект по тегу должен знать а какой он из скольки.