【问题标题】:fmod telling me fractional part of 1 is 1fmod 告诉我 1 的小数部分是 1
【发布时间】:2014-11-26 07:59:57
【问题描述】:

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

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

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

1 1

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

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

【问题讨论】:

  • 我建议您设置更高的精度并重新测试,这可能会捕获 not-quite-1。另外,我猜你省略了 p 的初始化,而不是我们的 sn-p 的 1。
  • @Deduplicator 哦,是的,我现在明白了,例如p=0.999999999 这会发生.. 我会删除这篇文章,但这会删除你对 cme​​ts 的支持吗?
  • 不要仅仅因为它在 cmets 中得到回答就删除它。相反,鼓励评论者写一个实际的答案,或者如果他们不写,自己写答案。
  • 好的!其实我想删除它,因为我认为这是一个愚蠢的问题:)
  • 此外,cmets 是短暂的,对它们的支持仅在上下文中很重要。

标签: c++ integer std rounding fmodf


【解决方案1】:

您正在测试一个接近 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

【讨论】:

【解决方案2】:

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

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

p的来历很复杂

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-01-13
    相关资源
    最近更新 更多