Сравнение произвольных арифметических типов: кто-нибудь знает реализацию?

при написании нескольких математических утилит я столкнулся с необходимостью реализовать универсальную утилиту, которая может выполнять сравнения между любыми двумя фундаментальными арифметическими типами. Когда я начал кодирование, стало ясно, что эта операция не так проста, как кажется, поскольку мне нужна правильная обработка угловых случаев, особенно когда типы имеют разную точность, т. е. стратегия округления при преобразовании между типами становится важной. Подумайте:

float a1 = 4.8f;
int a2 = 4;
assert(a2 != (int) a1); //fails erroneously since we truncated a1

float b1 = 40000000.0f; //can represent only 40000000 and 40000004 accurately
long b2 = 40000002;
assert(b1 != (float) b2); //fails erroneously since we now truncated b2

вышеуказанное может быть реализовано с использованием признаков типа C++0x для автоматического выбора соответствующего алгоритма в соответствии с аргументами шаблона, предоставленными функции сравнения. Однако это довольно сложно, и есть довольно много мест, где могут ползать ошибки, поэтому я не думаю, что изобретать все сам стоит. Кто-нибудь знает библиотеку, которая реализует выше правильно?

1 ответов


вы можете посмотреть в библиотеке МП GNU-это Bignum на http://gmplib.org/. Из их страницы:

ГМП свободная библиотека для произвольной арифметики точности, работая дальше целые числа со знаком, рациональные числа и числа с плавающей запятой. Там не является практическим ограничением точности, кроме тех, которые подразумеваются доступная память в машине GMP работает дальше. GMP имеет богатый набор функции, и функции имеют регулярный интерфейс.

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