понимание std :: fmod и std :: remainder - PullRequest
0 голосов
/ 01 февраля 2019

Может кто-нибудь объяснить, как работают функции 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

1 Ответ

0 голосов
/ 01 февраля 2019

В качестве опорных состояний для 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.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...