1

我正在尝试检查double变量p是否大约等于整数。在我的代码中的某个时刻,我有

double ip;
cout << setprecision(15) << abs(p) << " " << modf(abs(p), &ip) << endl;

对于给定的运行,我得到了打印输出

1 1

这似乎是说 1 的小数部分是 1,我在这里遗漏了什么还是可能存在一些舍入问题等?

注意:我没有包括整个代码,因为来源p很复杂,我只是问这是否是一个熟悉的问题

4

2 回答 2

2

您正在测试一个接近 1 的值,因此 15 的精度不足以明确地描述它。

此代码清楚地显示了您的问题:

#include <iostream>
#include <iomanip>
#include <cmath>
#include <limits>
using namespace std;

int main() {
    double ip, d = nextafter(1., .0); // Get a double just smaller than 1
    const auto mp = std::numeric_limits<double>::max_digits10;
    cout << 15 << ": " << setprecision(15)
        << abs(d) << " " << modf(abs(d), &ip) << '\n';
    cout << mp << ": " << setprecision(mp)
        << abs(d) << " " << modf(abs(d), &ip) << '\n';
}

关于大肠杆菌: http ://coliru.stacked-crooked.com/a/e00ded79c1727299

15: 1 1
17: 0.99999999999999989 0.99999999999999989
于 2014-10-01T13:13:57.147 回答
2

会不会有一些舍入问题等?

当然可以。如果该值略小于 1,则其值及其小数部分在显示时都可以四舍五入为 1。

由来p复杂

那么它很可能不是一个精确的整数。

于 2014-10-01T13:05:58.517 回答