В качестве опорных состояний для 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 :
Остаток IEEE с плавающей точкой операции деления x/y
, рассчитанный этой функцией, является в точности значением x - n*y
, где значение n является целым значением, ближайшим к точному значению x/y
.Когда |n-x/y| = ½
, значение n
выбрано четным.
Итак, чтобы взять пример в вопросе, когда x = +5.1
и y = +3.0
Ближайшее интегральное значение к x/y (1.7)
равно 2
.Так что n
это 2
.Таким образом, remainder
даст 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
.Таким образом, remainder
даст x - 2y
, что составляет -5.1 - (-2) * 3.0
, что составляет -5.1 + 6.0
, что составляет +0.9
Ссылка также утверждает, что: В отличие от std::fmod()
,возвращаемое значение не обязательно имеет тот же знак , что и x
.