Нахождение «дискретной» разницы между близкими числами с плавающей точкой - PullRequest
4 голосов
/ 31 мая 2011

Предположим, у меня есть два числа с плавающей точкой, x и y, причем их значения очень близки.

Существует дискретное число чисел с плавающей точкой, представляемых на компьютере, поэтому мы можем перечислять их в порядке возрастания: f_1, f_2, f_3, .... Я хотел бы найти расстояние x и y в этом списке (то есть они 1, 2, 3, ... или n отдельные шаги друг от друга?)

Можно ли сделать это, используя только арифметические операции (+-*/), а не глядя на двоичное представление? Меня прежде всего интересует, как это работает на x86.

Верно ли следующее приближение, если предположить, что y > x и x и y находятся всего в нескольких шагах (скажем, <100) друг от друга? (Вероятно нет ...) </p>

(y-x) / x / eps

Здесь eps обозначает эпсилон машины. (Эпсилон машины - это разница между 1.0 и следующим наименьшим числом с плавающей запятой.)

Ответы [ 2 ]

3 голосов
/ 16 января 2012

Число с плавающей запятой лексикографически упорядочено, поэтому:

int steps(float a, float b){

  int ai = *(int*)&a;  // reinterpret as integer
  int bi = *(int*)&b;  // reinterpret as integer
  return bi - ai;
}

steps(5.0e-1, 5.0000054e-1);  // returns 9

Такой метод используется при сравнении чисел с плавающей запятой.

1 голос
/ 31 мая 2011

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

Начните с использования frexp () дляразбить x на экспоненту exp и мантиссу.Я полагаю, что следующее число больше x равно x + eps * 2^(exp-1).(«-1» означает, что frexp возвращает мантиссу в диапазоне [1/2, 1), а не [1, 2).)

Если x и y имеют одинаковый показатель степени, вы в основном сделали,В противном случае вам нужно посчитать, сколько шагов происходит на степень 2, что составляет всего 1.0/eps.Другими словами, количество шагов между 2 ^ n и 2 ^ (n + 1) равно 1.0/eps.

Итак, для y> x подсчитайте, сколько шагов от x до следующей степенииз двух;затем посчитайте, сколько еще шагов нужно, чтобы достичь наибольшей степени 2, меньшей y;затем посчитайте, сколько еще шагов нужно, чтобы добраться оттуда до y.Все это довольно легко выразить в терминах eps, я думаю.

...