Tôi đang cố gắng để thực hiện eps(x)
chức năng của Matlab trong C++Thực hiện eps Matlab (x) hàm trong C++
Ví dụ, trong Matlab:
>> eps(587.3888)
ans = 1.1369e-13
>> eps(single(587.3888))
ans = 6.1035e-05
Tuy nhiên, khi tôi cố gắng để làm điều này trong C++ Tôi không thể có được câu trả lời chính xác duy nhất.
#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);
}
Chạy chương trình tôi nhận được kết quả như sau:
$ ./a.out
epsf: 1.19209e-07
epsd: 2.22045e-16
espxf: -1.13687e-13
espxd: -1.13687e-13
Có vẻ như vì một lý do mặc dù các giá trị eps cho đơn và đôi chính xác là chính xác, sản lượng sử dụng nextafter
chức năng chỉ ra giá trị chính xác kép. Giá trị của tôi cho epsxf
phải là 6.1035e-05 vì nó nằm trong Matlab.
Mọi suy nghĩ?
'eps' của MATLAB luôn mang lại kết quả tích cực. Đoạn mã trên sẽ cho kết quả âm nếu 'x' lớn hơn' epsf'. [Ở đây] (http://coliru.stacked-crooked.com/a/68546c8c401c0610) 's mã cố định: 'double eps (float x) {float xp = std :: abs (x); double x1 = std :: nextafter (xp, xp + 1.0f); return x1 - xp; } ' – legends2k