Я пытаюсь реализовать функцию Matlab eps(x)
на С++.
Например, в Матлабе:
>> eps(587.3888)
ans = 1.1369e-13
>> eps(single(587.3888))
ans = 6.1035e-05
Однако, когда я пытаюсь сделать это на С++, я не могу получить правильный ответ с одинарной точностью.
#include <limits>
#include <iostream>
#include <math.h>
#define DEBUG(x) do { std::cerr << x << std::endl; } while (0)
#define DEBUG2(x) do { std::cerr << #x << ": " << x << std::endl; } while (0)
int main() {
float epsf = std::numeric_limits<float>::epsilon();
DEBUG2(epsf);
double epsd = std::numeric_limits<double>::epsilon();
DEBUG2(epsd);
float espxf = nextafter(float(587.3888), epsf) - float(587.3888);
double espxd = nextafter(double(587.3888), epsd) - double(587.3888);
DEBUG2(espxf);
DEBUG2(espxd);
}
Запустив программу, я получаю следующий вывод:
$ ./a.out
epsf: 1.19209e-07
epsd: 2.22045e-16
espxf: -1.13687e-13
espxd: -1.13687e-13
Кажется, что по какой-то причине, хотя значения eps для одинарной и двойной точности верны, вывод с использованием функции nextafter
выводит только значение двойной точности. Мое значение для epsxf
должно быть 6.1035e-05, как в Matlab.
Есть предположения?
eps
всегда дает положительные результаты. Приведенный выше код даст отрицательный результат, еслиx
большеepsf
. Вот фиксированный код:double eps(float x) { float xp = std::abs(x); double x1 = std::nextafter(xp, xp + 1.0f); return x1 - xp; }
- person legends2k   schedule 28.12.2015