Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/357.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
浮点除法的Python等式_Python - Fatal编程技术网

浮点除法的Python等式

浮点除法的Python等式,python,Python,使用Python3,以下内容如何返回True a = 2/3 b = 4/6 print(a == b) 我有一个算法,需要对数字列表进行排序,每个数字的形式都是x/y,其中x和y是整数。(y!=0) 我担心该司的数字精度会导致上述案件的不稳定和任意排序。但是,根据这个例子,对于更大的整数,这似乎不是一个问题 Python是否从b的分子和分母中删除了公因数2,并保留了a和b不仅仅是浮点的信息?Python遵循浮点规范。*(64位)IEEE浮点基本上是基数2的一种形式,细分如下: 符号的一位(

使用Python3,以下内容如何返回
True

a = 2/3
b = 4/6
print(a == b)
我有一个算法,需要对数字列表进行排序,每个数字的形式都是x/y,其中x和y是整数。(y!=0)

我担心该司的数字精度会导致上述案件的不稳定和任意排序。但是,根据这个例子,对于更大的整数,这似乎不是一个问题

Python是否从b的分子和分母中删除了公因数2,并保留了a和b不仅仅是浮点的信息?

Python遵循浮点规范。*(64位)IEEE浮点基本上是基数2的一种形式,细分如下:

  • 符号的一位(正或负)
  • 尾数或有效位的53位,包括隐含的前导位
  • 指数为11位
浮点值乘以或除以2,或二的任意幂,只影响指数,而不影响尾数。**因此,它本身通常是一个相当“稳定”的运算,因此2/3应该产生与4/6相同的结果。但是,IEEE浮点数仍存在以下问题:

  • 大多数操作都不是关联的(例如,在一般情况下,
    (a*b)*c!=a*(b*c)
  • 更复杂的运算不需要正确地四舍五入(然而,正如蒂姆·彼得斯所指出的,除法肯定不是一个“更复杂”的运算,它将被正确地四舍五入)***
  • 中间结果总是四舍五入到53位
您应该准备好处理这些问题,并假设大多数数学上等价的浮点表达式不会产生相同的值。特别是在Python中,您可以使用来估计两个浮点值是否“足够接近”到“可能是相同的值”


*事实上,这是一个谎言。Python遵循C的
double
,它几乎总是以某种方式遵循ieee754,但在足够奇特的体系结构上可能会偏离它。在这种情况下,C标准提供很少或没有保证,因此您必须查看您的体系结构或编译器的浮点文档

**如果指数没有溢出或下溢。如果是这样的话,那么您通常会分别在一个适当的有符号无穷大或零上着陆,或者根据体系结构和/或Python的编译方式,您可能会下溢到一个有符号的无穷大


***由于IEEE 754,精确的“更复杂”操作集有所不同。因此,一个给定的操作是符合IEEE 754标准还是只符合臭名昭著的宽松C标准,这一点几乎不明显。在某些情况下,操作可能不符合任何标准。

2/3与4/6相同。(2/3)*(2/2)=2/2=1,标识元素。回答是正确的

只需注意,只要整数
x
y
可以精确表示为Python浮点数,
x/y
在所有当前机器上都是无限精确商的正确舍入值。这就是IEEE754浮点标准所要求的,目前所有的机器都支持这一点

因此,在你的具体例子中,重要的部分不是
b=4/6
中的分子和分母有一个共同的因子(特别是!)2,而是(a)它们有一些共同的因子;(b)4和6都可以精确地表示为Python浮动

例如,可以保证

(2 * 9892837) / (3 * 9892837) == 2 / 3

这也是事实。因为
(2*9892837)/(3*9892837)
的无限精确值与
2/3
的无限精确值相同,IEEE 754除法的作用就好像计算了无限精确商一样。您可以用其中的任何其他非零整数替换9892837,前提是产品仍然可以精确表示为Python浮点。

很抱歉,我无法回答您的问题。对不对!?这里有什么值得关注的?我想你在谈论不同的事情:身份和平等,2/3等于4/6,因此
2/3==4/6
返回
True
。现在,
2/3是4/6
返回
False
,因为它们是不同的元素。为每个变量分配一个变量,并比较它们的
id()
,您将看到。更多信息:@tokenizer\u fsj:OP询问的是浮点精度,而不是对象标识。他们已经使用了正确的比较运算符,所以我不明白你为什么觉得有必要对他们进行更正。谢谢Kevin,这正是我想知道的。事实上,幸运的是,在足够简单的情况下,它们仍然是相等的,但任何依赖这一点的行为都会导致代码的脆弱性。这并不能回答所提出的实际问题。问题是这两个表达式之间的精确性和可能的不稳定性。这在理论上肯定是等价的,但是你能保证CPU上的这类表达式也是一样的吗?Kevin上面的答案实际上回答了眼前的问题。2和2.0实际上与这个示例的工作原理无关
(n*x)/(n*y)=x/y
对于任何整数,使得
n*y
不是0,
n*x
n*y
都可以精确地表示为Python浮动。是的,我意识到了这一点。我把你的“无限精确商”和进入除数和被除数的无限精确整数搞混了。