fmod函数python fmod函数 php

在python交互模式下,20÷6的余数怎么表达?在 Python 交互模式下fmod函数python,fmod函数python你可以使用模运算符(%)来表示整数的余数 。例如fmod函数python,要求 20 除以 6 的余数,可以使用如下代码:
模运算1
这里,20 除以 6 的余数是 2 。
注意,模运算符(%)只能用于求整数的余数,对于浮点数,它是不适用的 。如果要求浮点数的余数,可以使用内置函数 math.fmod() 。
例如:
模运算2
这里,函数 math.fmod() 返回fmod函数python了浮点数 20 除以 6 的余数 2.0 。
调用fmod函数是什么意思调用fmod函数是
功 能:计算x对y的模 , 即x/y的求余运算 (参见百科词条mod中的"求余函数" 条目) , 若y是0,则返回NaN 。
用 法:double fmod(double x,double y);
需要头文件:math.h
为什么Python中//和math.floor运算结果会不同先说结论:这个问题是由于cpython的地板除运算符(//)的实现不是 浮点除法+floor 来实现而是用了(被除数 - 余数)/除数 导致的 。
PS:Jython下可以得到20.0,而PEP里规定了a // b应该等于round(a/b) , 所以似乎这是cpython实现的一个bug?
首先先分析下1 / 0.05究竟应该等于多少 。答案就是精确的20.0 。
简单解释下:IEEE754浮点数规定,如果一个浮点数的值不能被精确记录,那么它的值会被记成与这个数距离最近的可以被IEEE浮点数表示的数 。
首先,0.05在二进制下是无限循环小数,自然不能被精确记录,因此0.05这个浮点数的实际值是不等于0.05的,实际值是约为0.05 + 2.7e-18 。
之后做浮点除法,实际上做的是1 / (0.05+2.7...e-18),这个除法的结果大约是20 - 1.1e-15 。这个值也不能被精确表示,恰好离这个数最近的可以表示的值就是20.0,因此即使有浮点数误差结果也是精确的20.0 。
既然1/0.05就是20.0,那么对他做floor运算自然也是20了 。
现在的问题就是为什么1 // 0.05会变成19.0,要解决这个问题只能翻源码看//运算符的实现 。
直接把cpython/floatobject.c at 829b49cbd2e4b1d573470da79ca844b730120f3d · python/cpython · GitHub 中实现//运算的一段贴上来:
static PyObject *
float_divmod(PyObject *v, PyObject *w)
{
double vx, wx;
double div, mod, floordiv;
CONVERT_TO_DOUBLE(v, vx);
CONVERT_TO_DOUBLE(w, wx);
if (wx == 0.0) {
PyErr_SetString(PyExc_ZeroDivisionError, "float divmod()");
return NULL;
}
PyFPE_START_PROTECT("divmod", return 0)
mod = fmod(vx, wx);
/* fmod is typically exact, so vx-mod is *mathematically* an
exact multiple of wx.But this is fp arithmetic, and fp
vx - mod is an approximation; the result is that div may
not be an exact integral value after the division, although
it will always be very close to one.
*/
div = (vx - mod) / wx;
if (mod) {
/* ensure the remainder has the same sign as the denominator */
if ((wx0) != (mod0)) {
mod += wx;
div -= 1.0;
}
}
else {
/* the remainder is zero, and in the presence of signed zeroes
fmod returns different results across platforms; ensure
it has the same sign as the denominator. */
mod = copysign(0.0, wx);
}
/* snap quotient to nearest integral value */
if (div) {
floordiv = floor(div);
if (div - floordiv0.5)
floordiv += 1.0;
}
else {
/* div is zero - get the same sign as the true quotient */
floordiv = copysign(0.0, vx / wx); /* zero w/ sign of vx/wx */
}
PyFPE_END_PROTECT(floordiv)
return Py_BuildValue("(dd)", floordiv, mod);
}
可以发现cpython中x // y的实现实际上是
round((x - fmod(x, y)) / y)
 , 其中fmod函数是求两个浮点数相除的余数 。

推荐阅读