Расчет пропорции с отрицательными значениями с плавающей точкой - PullRequest
0 голосов
/ 13 марта 2012

Я хотел бы знать, есть ли в C ++ способ рассчитать пропорцию, включающую возможно отрицательные значения как в переменных, так и в экстремальных значениях.

Моя цель - синхронизировать виджет ввода текста с плавающей запятой с фиксированными крайностями (например, пользователь может ввести любое двойное значение между A (min) и B (max) с A, B = any_constant_real_number) с помощью ползунка, который может скользить только между 0 и 100 (для упрощения).

Если A и B положительны, все тривиально. как val_slider = ((val_textin-A) * 100) / (B-A)

но поскольку A и B можно считать реальными, мне кажется, что единственная возможность состоит в том, чтобы использовать несколько выражений if /, или огромные формулы, включающие много функций abs (), и проверять деления на 0, чьи ошибки и очень дорого по сравнению с такой простой задачей.

Есть ли какой-нибудь более быстрый и короткий способ добиться того же в c / c ++ / stl?

Простите за мой плохой английский. Любой намек? Спасибо.

Ответы [ 2 ]

3 голосов
/ 13 марта 2012

Ваша формула должна хорошо работать с отрицательными значениями A и B, а также записывать как A < B.

Пример, если вы хотите, чтобы пользователь мог вводить значения от -100 до 100, и сопоставить их с ползунком, который переходит от 0 до 100, когда пользователь вводит -90, вы получаете:

((-90 - A) * 100) / (B - A) = ((-90 - (-100)) * 100) / (100 - (-100)) 
                            = 10 * 100 / 200
                            = 5

Ввод значения 50 приводит к значению ползунка:

((50 - A) * 100) / (B - A) = ((50 - (-100)) * 100) / (100 - (-100)) 
                           = 150 * 100 / 200
                           = 75
1 голос
/ 13 марта 2012

Я не знаю C ++, но знаю математику, поэтому попробуйте:

val_slider = 100 * ( val_textin - A ) / ( B - A )

Эй, подожди. Это именно то, что у вас есть. Тестовый кейс ..

A = -200, B = + 200, val_texin = 100 (75% бара, верно?)

val_slider = 100 * (100–200) / (200–200) = (300) / (400) * 100 = 75

Видишь, ты правильно понял. Единственное, что МОЖЕТ произойти, это B == A, но это не может быть учтено с помощью математики и требует единственного IF. Если они равны, val_slider точно B (или A, поскольку они равны).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...