c – 理解std :: fmod和std :: remainder

有人可以解释
std::fmod
std::remainder功能的工作原理.在std :: fmod的情况下,有人可以解释如何显示以下步骤:

std::fmod(+5.1, +3.0) = 2.1

对于std :: remainder来说也是如此,它会产生负面结果.

std::remainder(+5.1, +3.0) = -0.9
std::remainder(-5.1, +3.0) = 0.9

最佳答案 作为
std::fmod的参考状态:

由该函数计算的除法运算x / y的浮点余数恰好是值x-n * y,其中n是x / y,其小数部分被截断.

返回值与x具有相同的符号,并且大小小于y.

因此,在问题中,当x = 5.1和y = 3.0时,
截止的小数部分的x / y(5.1 / 3.0 = 1.7)是1.因此n是1.因此fmod将产生x-1 * y,其为5.1-1 * 3.0,其为5.1-3.0,即2.1.

并且参考状态为std::remainder
由该函数计算的除法运算x / y的IEEE浮点余数恰好是值x-n * y,其中值n是最接近精确值x / y的积分值.当| n-x / y | =½,值n选择为偶数.

因此,在问题中采用例子,当x = 5.1且y = 3.0时
x / y(1.7)的最接近的整数值是2.因此n是2.因此,余数将产生x-2y,其为5.1-2 * 3.0,其为5.1-6.0,即-0.9.

但是当x = -5.1且y = 3.0时
x / y(-1.7)的最接近的整数值是-2.所以n是-2.因此剩余部分将产生x-2y,其为-5.1-(-2)* 3.0,其为-5.1 6.0,其为0.9

该引用还指出:与std :: fmod()相反,返回的值不能保证与x具有相同的符号.

点赞