Мне надо в числовой тэг объекта (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-битных числа, числитель и знаменатель.