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