remquo结果没有意义

时间:2016-01-13 13:15:41

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

我看了remquo应该返回的here

  

如果成功,则返回std :: remainder中定义的除法x/y的浮点余数,以及符号为x/y并且其大小为全等的值 modulo 2 n    到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 。但是,为什么我们使用的quot会导致否定rem?我不应该找回 1 quot 3.0 rem吗?

2 个答案:

答案 0 :(得分:1)

由于您的问题与remquo返回的值有关,因此完全是std::remainder,因为remquo行为的这一部分直接定义为与std::remainder

std::remainder提供IEEE 754余数运算,它与fmod不同,因为两个正值的fmod可以预期总是正的,而IEEE 754余数是相对于整数商q定义为数学商x / y的最近整数,因此remainder = x - y*q每次数学商数为上到下一个整数。

IEEE 754余数操作是question “Math.IEEERemainder returns negative results.”中讨论的操作,因此您可能希望阅读它并接受答案,尽管它们是关于不同的编程语言。

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

答案 1 :(得分:1)

行为是正确的;如std :: remainder中所述,商被舍入到最接近的整数,那么余数可以是负数。

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