Среда, 18 Декабря 2024, 10:40

Приветствую Вас Гость

[ Новые сообщения · Игроделы · Правила · Поиск ]
  • Страница 1 из 1
  • 1
Красивое округление вещественных чисел
GECKДата: Среда, 18 Декабря 2013, 00:13 | Сообщение # 1
заслуженный участник
Сейчас нет на сайте
В общем есть набор не очень красивых чисел(первый столбик), из них хочется получить красивые(второй столбик).
Код
       8.15730721    10
         4.826809    5
           2.8561    5
             1.69    5
                1    1
0.591715976331361    1
0.350127796645776    0.5
0.207176211033003    0.5
0.122589473984026    0.5
0.072538150286406    0.1
0.042921982417992    0.05
0.025397622732539    0.05
0.01502817913168  0.05
0.008892413687385    0.01
0.005261783246973    0.01

Смысл чисел - шаг координатной сетки при разных масштабах. Исходная последовательность может долго продолжаться в обе стороны и варьировать свои значения.
Чувствую, что есть какое-то простое решение, но но туплю sad


Всё гениальное просто. И хреново работает.
hero564Дата: Среда, 18 Декабря 2013, 01:46 | Сообщение # 2
Made in Ukraine
Сейчас нет на сайте
GECK, странное округление какое-то
VirtualcreatureДата: Среда, 18 Декабря 2013, 13:23 | Сообщение # 3
постоянный участник
Сейчас нет на сайте
Такой логики от компьютера добиться сложно.
Компьютеры... Они логичны.)
Но есть способ решить эту проблему, пусть не изящно, но довольно логично. от себя добавлю, что шаг "1-2-4-8-16-32-64..." и выглядит эстетичнее и задается легче.


Сообщение отредактировал Virtualcreature - Среда, 18 Декабря 2013, 13:25
vasua99Дата: Среда, 18 Декабря 2013, 13:41 | Сообщение # 4
GNU follower
Сейчас нет на сайте
Вычислить степень числа 10, так, чтобы 10^n было близко к искомому числу.

Жизнь игра, и мы в ней пешки... А я кушаю пельмешки)
FarcuatДата: Среда, 18 Декабря 2013, 19:53 | Сообщение # 5
частый гость
Сейчас нет на сайте
Нужно нормализовать значения и округлить

Код
// k - входящее число
// за норму возьмем значения из (0.1;1)
// s - на сколько порядков отличается от нормы
if(k >= 1.0f) s = (int)(log10(k)) + 1;
else s = (int)(log10(k));

// t - лежит в (0.1;1)
t = k / pow(10, s);

// e - округляем и возвращаем порядок
if(t < 0.5f) e = 0.5f * pow(10, s);
else  e = pow(10, s);
GECKДата: Среда, 18 Декабря 2013, 21:36 | Сообщение # 6
заслуженный участник
Сейчас нет на сайте
Farcuat, благодарю smile

Всё гениальное просто. И хреново работает.
  • Страница 1 из 1
  • 1
Поиск:

Все права сохранены. GcUp.ru © 2008-2024 Рейтинг