我正在尝试检查double
变量p
是否大约等于整数。在我的代码中的某个时刻,我有
double ip;
cout << setprecision(15) << abs(p) << " " << modf(abs(p), &ip) << endl;
对于给定的运行,我得到了打印输出
1 1
这似乎是说 1 的小数部分是 1,我在这里遗漏了什么还是可能存在一些舍入问题等?
注意:我没有包括整个代码,因为来源p
很复杂,我只是问这是否是一个熟悉的问题
您正在测试一个接近 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
会不会有一些舍入问题等?
当然可以。如果该值略小于 1,则其值及其小数部分在显示时都可以四舍五入为 1。
由来
p
复杂
那么它很可能不是一个精确的整数。