Аноны, мне нужно один диапазон чисел преобразовать в другой, с сохраненим пропорциональности, чтобы например середина первого легла в середину второго, а концы в концы, и тд. Например из [1500...2000] сделать [100...4000]. 1500 => 100.0000001700 => 1660.0000001800 => 2440.0000002000 => 4000.000000У меня получилась вот такая формула, x - входное значение и(x - min1) / (max1 - min1) * (max2 - min2) + min2(x - min1) / (max1 - min1) - находим где на первом отрезке находится значение x, (0.5 - посередине и тд), потом умножаем на (max2 - min2) чтобы спроецировать на второй отрезок и прибавляем сдвиг min2.Тащемта тривиально и работает верно, но все таки интересно - можно ли поэлегантнее, в меньше действий?
>>768848 (OP)Все норм. Теперь уебывай. Тред закроют.
>>768848 (OP)Ну если у тебя много разных чисел необходимо перевести, то можешь развернуть формулу:x (max2 - min2) / (max1 - min1) - min1 (max2 - min2) / (max1 - min1) + min2(max2 - min2) / (max1 - min1), min1 * (max2 - min2) / (max1 - min1) и min2 у тебя не будут часто изменяемыми, поэтому их можно рассчитать заранее. В итоге будет только 4 + 3 действия для каждого числа вместо 6 на каждое.
>>769310Точнее даже 5 + 2 действия на каждое число.
>>769310Да много, непрерывный поток конвертируется, возможно придется запихивать в прерывание, то есть нужна оптимизация по скорости. Да, наверное есть смысл развернуть, спасибо за идею. >>768858Что не так с тредом?
Не, хотелось бы конечно развернуть прямо в красивое уравнение прямой y=mx + b, но тогда придется делать в вещественных числах, но не на всех моих корах есть FPU, поэтому боюсь что только медленнее станет.
>>769360Ты думаешь, что станет медленнее, чем изначально?
>>769369Не знаю, надо сравнивать. Кажется все-таки можно в целых, ведь линейное преобразование, типа умножить сперва, потом разделить, сейчас попробую.
Вот так наверное оптимально, развернуто и в целых числах float m = (float)(bn-b0)/(float)(an-a0); int b = (float)(b0 - a0m)1024; int mm = m 1024 + 0.5; ... printf ("%d => %d\n", i, (imm + b)>>10);
тест разметки [code int a0 = 1170, an = 1870, b0 = 700, bn = 2000; float m = (float)(bn-b0)/(float)(an-a0); int b = (float)(b0 - a0m)1024; int mm = m 1024 + 0.5; for (int i = a0; i <= an; i += 100) { printf ("%d => %d\n", i, (i - a0)(bn-b0)/(an-a0) + b0); printf ("%d => %d\n", i, (i*mm + b)>>10); }[/code]