结果没有意义

remquo Results Not Making Sense

本文关键字:有意义 结果      更新时间:2023-10-16

我在这里读到remquo应该返回:

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

现在很明显,我误解了所有这些技术语言,因为我认为我会得到除法的分数结果。相反,此操作:

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

quot设置为 2,将rem设置为 -1.0!我可以看到这是有效的,因为 4.0 * 2 = 8.0 和 7.0 - 8.0 = -1.0。但是为什么我们使用会导致负remquot?我不应该得到 1quot3.0rem吗?

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

std::remainder提供了 IEEE 754 余

数运算,它与fmod的不同之处在于,两个正值的fmod可以预期始终为正,而 IEEE 754 余数相对于整数商q定义为最接近数学商 x/y 的整数,因此每次数学商向上舍入到下一个整数时remainder = x - y*q都会产生负结果。

IEEE 754余数操作是问题"Math.IEEERemainder返回负结果"中讨论的操作,因此您可能希望阅读它和接受的答案,尽管它们是关于不同的编程语言。

注意:规范中关于商的部分是"全等模 2n 与积分商的大小"只是意味着你没有得到整个积分商,这确实可能不适合int类型(想想remquo(FLT_MAX, 1.0f, ...)。相反,您将获得一个实现定义的整数商的最低有效位数。您获得的实现定义的位数必须至少为 3,但可以更多。

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

如果你正在使用整数,我建议你使用 C 函数div((