Как преобразовать входные данные с плавающей точкой в целые числа и сохранить максимальную точность?
Я должен использовать алгоритм, который ожидает матрицу целых чисел в качестве входных данных. Входные данные имеют реальную ценность, поэтому я хочу преобразовать входные данные в целочисленные, прежде чем передавать их в алгоритм.
Я хотел масштабировать входные данные по большой константе, а затем округлить до целых чисел. Это выглядит как хорошее решение, но как выбрать хорошую постоянную для использования, тем более что диапазон входных значений с плавающей запятой может варьироваться от случая к случаю? Любые другие идеи также приветствуются?
2 ответа
Вероятно, лучший общий ответ на этот вопрос - выяснить, какое максимальное целочисленное значение может принять ваш алгоритм в качестве элемента в матрице, не вызывая переполнения самого алгоритма. Как только вы получите это максимальное значение, найдите максимальное значение с плавающей запятой во ваших входных данных, затем масштабируйте свои входные данные по отношению этих двух максимальных значений и округлите до ближайшего целого числа (избегайте усечения).
На практике вы, вероятно, не можете сделать это, потому что вы, вероятно, не можете определить, какое максимальное целочисленное значение может принять алгоритм без переполнения. Возможно, вы не знаете деталей алгоритма, или он сложным образом зависит от всех входных значений. Если это так, вам просто нужно выбрать произвольное максимальное входное значение, которое, кажется, работает достаточно хорошо.
Сначала нормализуйте ваш ввод в диапазоне [0,1), затем используйте общий способ их масштабирования:
f(x) = range_max_exclusive * x + range_min_inclusive
После этого приведите f(x) (или округлите, если хотите) к целому числу. Таким образом, вы можете обрабатывать ситуации, такие как реальные значения в диапазоне [0,1)
или же [0,n) where n>1
,
В общем, ваша любимая библиотека содержит матричные операции, которые вы можете реализовать с помощью этой техники легко и с большей производительностью, чем ваша возможная реализация.
РЕДАКТИРОВАТЬ: Уменьшение, а затем увеличение наверняка потеряет некоторую точность. Я одобряю это, потому что операция нормализации обычно идет с библиотекой. Также вы можете сделать это без уменьшения масштаба:
f(x) = range_max_exlusive / max_element * x + range_min_inclusive