我看了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
设置为 2 ,将rem
设置为 -1.0 !我可以看到它是如何有效的,因为 4.0 * 2 = 8.0 和 7.0 - 8.0 = -1.0 。但是,为什么我们使用的quot
会导致否定rem
?我不应该找回 1 的quot
和 3.0 的rem
吗?
答案 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()