Как мне сделать тест на равенство для 80-битной IEEE с плавающей запятой? - PullRequest
2 голосов
/ 10 декабря 2008

относится к:

Однако в отношении 80-битных IEEE с плавающей запятой (см. Раздел 8.2) на x86

В частности, мне нравится эта реализация , использующая число представимых значений между операндами, потому что оно масштабируется по умолчанию.

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


p.s. Язык реализации будет D, но я могу перевести. Также была бы идеальной реализация, которая может автоматически обрабатывать любой базовый тип (например, если бы был доступен только 64-битный реальный тип).

Текущий используемый код:

Ответы [ 2 ]

2 голосов
/ 10 декабря 2008

Поскольку в D встроены 80-битные реалы (насколько я могу судить), почему бы вам не просто использовать стандартный подход сравнения со значением эпсилона. Это может быть фиксированное значение, если вы заранее знаете приблизительный диапазон, например, валюта США:

if (abs (a - b) < 1e-6) // effectively equal

или допустимая относительная ошибка, например, 1 часть на миллион среднего значения:

if (abs (a - b) < ((a + b) / 2) / 1e6) // effectively equal

Имейте в виду, я не знаю D, приведенный выше код только для демонстрационных целей.

0 голосов
/ 10 декабря 2008

Мое текущее решение -

bool Near(real a, real b, int count = 5)
{
    // Returns the number of mantissa bits which are equal in x and y.
    int i = std.math.feqrel!(real)(a,b);
    return i + count >= real.mant_dig;
}

Показывает количество несовпадающих битов на входах. Я не уверен, насколько хорошо это будет работать при степенях 2.

...