【问题标题】:C++: std::remquo not giving expected output [duplicate]C ++:std :: remquo没有给出预期的输出[重复]
【发布时间】:2019-05-08 01:45:11
【问题描述】:

我试图在 C++ 中找到一个双重除以另一个的次数,而我发现这样做的唯一函数是 remquo。但是在使用它时,它并没有给出预期的结果,当它们应该是从 0 到 20 时,结果商只在 0 到 3 之间。

较小尺寸的双精度数工作是否对更精确的浮点数有问题?

int quotient;
    double remainder = remquo((coordX+maxX), tileSizeX, &quotient);
    cout << coordX+maxX << " / " << tileSizeX << " = " << quotient << " r " << remainder << endl;
    return quotient;

在这种情况下,maxX 将为 0.773,coordX 将是一个介于 -0.773 到 0.773 之间的数字,最后 tileSizeX 约为 0.073619。

这里是 cout 调用的一些输出:

0.773 / 0.073619 = 2 r 0.0368095 但 0.073619 * 2 + 0.0368095 = 0.1840475,与我预期的 0.773 相差甚远。

0.085 / 0.073619 = 0 r 0.011381

0.181 / 0.073619 = 2 r 0.0337619

0.433 / 0.073619 = 3 r -0.00871429

1.269 / 0.073619 = 0 r 0.0174762

余数看起来总是对的,但商几乎从来都不是。有什么我不明白的地方吗?

【问题讨论】:

  • 请发MCVE 并提供编译器版本和操作系统
  • 查看documentation此外,x/y 的符号和至少最后三位将按原样存储,足以确定结果的八分圆期间。。 3 位不是很多。
  • 另外余数定义为 该函数计算的除法运算 x/y 的 IEEE 浮点余数正好是值 x - n*y,其中值 n 是最接近精确值 x/y 的整数值。当 |n-x/y| = ½,值 n 被选择为偶数。,这不是您要处理的值。
  • MCVE 很重要,因为我认为您的代码中没有显示舍入错误; 0.773/0.073619 实际上比 10.5 稍微大一点,所以余数应该是负数,但你显示的是正数余数(所以我怀疑除数不完全是显示的值)
  • 注意。我没有标记为骗子(其他 q 并不是真正的骗子)我 vtc 不包括 MCVE。您可以通过包含 MCVE 并粘贴结果副本来重新打开。

标签: c++ c++11 floating-point double division


【解决方案1】:

remquo的定义包括(C11 7.12.10.3/1,C++17引用):

remquo 函数计算与remainder 函数相同的余数。在 quo 指向的对象,它们存储一个值,其符号是 x/y 的符号,其大小与 x/y 的积分商的大小模 2n 一致,其中 @ 987654327@ 是实现定义的大于或等于3 的整数。

您似乎错误地期望 quo 持有积分商的实际值。


我试图在 C++ 中找到一个双除以另一个的次数

有多种方法可以做到这一点,例如std::trunc(x/y)std::lrint(x/y)。阅读std::remainderstd::fmod 的文档也可能会有所帮助。您可以在 cppreference.com 或 ISO C 和 C++ 草案中查看所有这些函数。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2020-01-22
    • 2018-09-18
    • 2019-09-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多