Оператор Modulo в Python
Что делает модуль в следующем фрагменте кода?
from math import *
3.14 % 2 * pi
Как мы вычисляем по модулю число с плавающей запятой?
Ответы
Ответ 1
Математически оператор modulo может быть представлен как:
a % b = c
a - n*b = c
Где n
- целое число, которое делает c
как можно меньше, но положительным.
В этом случае:
3.14 % 2
= 3.14 - 1 * 2
= 1.14
Кроме того, 3.14 % 2 * pi
интерпретируется как (3.14 % 2) * pi
. Я не уверен, что вы хотели написать 3.14 % (2 * pi)
(в любом случае, алгоритм один и тот же. Просто вычтите/добавьте до тех пор, пока число не станет как можно меньше).
Ответ 2
В дополнение к другим ответам в документации fmod
есть несколько интересных вещей, которые можно сказать по этому вопросу:
math.fmod(x, y)
Возврат fmod(x, y)
, как определено платформой C библиотека. Обратите внимание, что выражение Python x % y
может не возвращать то же самое результат. Целью стандарта C является то, что fmod(x, y)
точно (математически, до бесконечной точности), равной x - n*y
для некоторых целое число n такое, что результат имеет тот же знак, что и x
, и величина менее abs(y)
. Pythons x % y
возвращает результат со знаком y
вместо этого, и не может быть точно рассчитан для аргументов float. Для Например, fmod(-1e-100, 1e100)
- -1e-100
, но результат Pythons -1e-100 % 1e100
- это 1e100-1e-100
, который не может быть представлен точно как float и округляется до удивительного 1e100
. По этой причине, функция fmod()
обычно предпочтительнее при работе с поплавками, тогда как Питоны x % y
предпочтительнее при работе с целыми числами.
Ответ 3
так же, как и нормальный modulo 3.14 % 6.28 = 3.14
, точно так же, как 3.14%4 =3.14
3.14%2 = 1.14
(остаток...)
Ответ 4
То же самое, чего вы ожидаете от обычного по модулю... например. 7 % 4 = 3
, 7.3 % 4.0 = 3.3
Остерегайтесь проблем с плавающей запятой.
Ответ 5
вы должны использовать fmod (a, b)Хотя абс (x% y) abs (y) истинно математически, для поплавков это может быть неверно численно из-за округления. Например, и предполагая платформу, на которой плавающий Python является номером двойной точности IEEE 754, для того, чтобы -1e-100% 1e100 имели тот же знак, что и 1e100, вычисленный результат равен -1e-100 + 1e100, что численно точно равным 1e100. Функция fmod() в математическом модуле возвращает результат, знак которого соответствует знаку первого аргумента, и поэтому возвращает -1e-100 в этом случае. Какой подход более подходит, зависит от приложения.
где x = a% b используется для целого по модулю