Как я должен сделать проверку равенства для 80bit с плавающей точкой IEEE?

голоса
2

относится к:

Однако в связи с 80 битной IEEE поплавков (смотрите раздел 8.2) на x86

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

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


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

Текущий код используется:

Задан 10/12/2008 в 05:33
источник пользователем
На других языках...                            


2 ответов

голоса
2

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

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

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

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

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

Ответил 10/12/2008 в 07:04
источник пользователем

голоса
0

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

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.

Ответил 10/12/2008 в 07:03
источник пользователем

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more