CLI / C ++ Как хранить более 15-значное число с плавающей запятой? - PullRequest
1 голос
/ 04 декабря 2011

Для школьного проекта у меня есть простая программа, которая сравнивает 20х20 фотографий.Я положил 20 фотографий, а затем я поставил 21-ую фотографию, которая сравнивается с существующими 20-ю, и выскакивает ответ, какую фотографию я вставил (или какая наиболее похожа).Проблема в том, что мой учитель хотел, чтобы я использовал алгоритм ближайшего соседа, поэтому я считаю расстояние от каждой фотографии.У меня все работает, но дело в том, что если фотографии слишком похожи, у меня возникает проблема с тем, чтобы сказать, какая из них ближе к моей.Например, я получаю эти расстояния с двумя разными фотографиями (ну, они ПОЧТИ одинаковы):

0 distance: 1353.07982026191
1 distance: 1353.07982026191

Это уже 15 цифр, и я использую тип double.Я читал, что long double то же самое.Есть ли какой-нибудь "простой" способ хранить числа с более чем 15 цифрами и делать с ними математику?

Я считаю расстояние, используя евклидово расстояние enter image description here Мне просто нужно быть более точным, или это ограничение, которое я, вероятно, не будупройти здесь, и я должен поговорить с моим учителем, я не могу сравнить такие похожие фотографии?

Ответы [ 2 ]

2 голосов
/ 05 декабря 2011

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

Допустим, вы пытаетесь вычислить, находится ли вектор x ближе к a или b..То, что вам нужно вычислить, это знак

d 2 ( x , a ) - d 2 ( x , b )

Что становится (я кратко опущу некоторые отрывки)

изатем

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

2 голосов
/ 05 декабря 2011

Я думаю, вам нужно это: gmplib.org

Существует руководство по установке этой библиотеки и на этом сайте.

А вот статья о поплавках: http://gmplib.org/manual/C_002b_002b-Interface-Floats.html#C_002b_002b-Interface-Floats

...