【问题标题】:remquo Results Not Making Senseremquo 结果没有意义
【发布时间】:2016-01-13 13:15:41
【问题描述】:

我读到here remquo 应该返回:

如果成功,则返回在 std::remainder 中定义的除法 x/y 的浮点余数,以及符号为 x/y 的符号且大小全等的值 模 2nx/y的积分商的大小,其中n是实现定义的大于或等于3的整数。

现在很明显,我误解了所有技术术语,因为我认为我会取回除法的分数结果。而是这个操作:

int quot;
const float rem = remquo(7.0F, 4.0F, &quot);

quot 设置为2,将rem 设置为-1.0!我可以看到这是如何有效的,因为 4.0 * 2 = 8.07.0 - 8.0 = -1.0。但是为什么我们使用quot 会导致否定的rem?我不应该取回 1quot3.0rem 吗?

【问题讨论】:

  • 你说的是C还是C++?它们是不同的语言。
  • @Olaf 这是我要问的一个 C 函数,并且在两种语言中实现相同。如果你能用 C 语言向我解释,你已经用 C++ 向我解释过。或者,如果你可以用 C++ 向我解释,你会用 C 向我解释。
  • 你引用的不是C标准,而是C++标准。
  • @JonathanMee 可能相关:stackoverflow.com/questions/11630321/…

标签: c++ c floating-point division modulo


【解决方案1】:

由于您的问题是关于remquo 返回的值,所以它完全是关于std::remainder,因为remquo 的那部分行为被直接定义为与std::remainder 的行为相同。

std::remainder 提供 IEEE 754 余数运算,这与 fmod 的不同之处在于两个正值的 fmod 可以预期始终为正,而 IEEE 754 余数是针对积分定义的商 q 作为数学商 x/y 的 最近 整数,因此每次数学商将 向上 舍入到下一个整数时,remainder = x - y*q 都会产生负结果.

question “Math.IEEERemainder returns negative results.” 中正在讨论 IEEE 754 余数运算,因此您可能想阅读它和接受的答案,尽管它们是关于不同的编程语言的。

注意:规范中关于商“模 2n 与积分商的大小一致”的部分仅仅意味着您没有得到整个积分商,这实际上可能不会适合int 类型(想想remquo(FLT_MAX, 1.0f, ...)。相反,您会获得实现定义的整数商最低有效位的数量。您获得的实现定义的位数必须至少为三位,但可以更多。

【讨论】:

  • 感谢您对“一致”部分的澄清。标准(C 和 C++)真的可以更清楚地表明它只是将值放入整数中。我只是想知道为什么他们只使用三个位,因为int 至少有 15 个幅度位。
  • @Olaf 使用remquo 的人通常只关心积分商的最后几位。考虑remquo(…, M_PI_2, …)(这是一个不好的例子,因为你可能真的对除以真实 π 的余数更感兴趣,而不是它的浮点近似值,但请耐心等待):你可能想要知道整数商是偶数还是奇数,也许它是否等于 0、1、2 或 3 模 4,但不太关心高阶位。
  • 感谢您的解释。实际上,我尽可能避免使用浮点数(直到现在,我的 C 项目都很幸运;-)
【解决方案2】:

行为正确;如 std::remainder 中所述,商四舍五入到最接近的整数,则余数可能为负数。

如果您使用整数,我建议您使用 C 函数 div()

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2015-03-28
    • 2011-09-05
    • 2014-11-17
    • 2017-09-21
    • 1970-01-01
    • 2023-02-07
    • 2021-04-24
    • 1970-01-01
    相关资源
    最近更新 更多