楼层划分如何根据文件规定不给出结果?

如何解决楼层划分如何根据文件规定不给出结果?

>>> print (12//0.2)
59.0
>>> print(floor(12/0.2))
60

为什么在这种情况下不能按规则进行楼层划分?

p.s。在这种情况下,Python在0.2情况下将0.20000000001视为floor division 所以 (12/0.2000000001)产生59.999999... 并且floor(59.999999999)输出59 但是不知道为什么在0.2情况下python为什么将0.2000000001视为floor division而不是division情况?

解决方法

12 / 0.2产生60.0的原因不是因为对0.2的处理不同,而是因为浮点除法中的错误抵消了0.2表示中的错误。浮点数始终具有相同的值(大于十进制的0.2),但是根据操作的不同,这些错误将累积或消除。

在其他情况下,错误不会完全消除,并显示在结果中:

>>> (12 / (0.2 * 0.2)) * 0.2
59.99999999999999

在CPython中,这些特定类型的整数除法(float //自动转换第一个参数后的float)和相对幅度的执行方式如下(有关完整方法,请参见Python's source code):

mod = a % b
result = (a - mod) / b

如果b实际上为0.2,则mod将为0,但在浮点中它会稍大,因此mod刚好在0.2以下。

如果您手动执行此操作,则可以看到我们最终得到59.0:

>>> a = 12.0
>>> b = 0.2
>>> mod = a % b
>>> mod
0.19999999999999934
>>> (a - mod) / b
59.0

OP还询问浮点除法中的错误,也是如此:

值(尾数*基数^指数):

12:         1.1000000000000000000000000000000000000000000000000000 * 2^3
0.2:        1.1001100110011001100110011001100110011001100110011010 * 2^(-3)

记住0.2不是真正的0.2,它是0.200000000000000011102230246251565404236316680908203125。将12除以> 0.2 的值应为

要除以值,我们将尾数除以指数,然后得到:

12 / 0.2:   0.1110111111111111111111111111111111111111111111111111111 * 2^6

但是最后3位不适合加倍,而尾数只有53位(包括符号),我们目前使用的是56位。

由于结果以0开头,因此我们首先进行归一化,将尾数乘以2,然后从指数中减去1。然后我们必须舍入到最接近的53位尾数:

normalised: 1.110111111111111111111111111111111111111111111111111111 * 2^5
rounded:    1.1110000000000000000000000000000000000000000000000000 * 2^5

1.1110000000000000000000000000000000000000000000000000000000 * 2 ^ 5等于60。

正确结果(1.110111111111111111111111111111111111111111111111111111111 * 2 ^ 5)和我们可以表示为64位双精度数的最接近值(1.1110000000000000000000000000000000000000000000000000000000 * 2 ^ 5)之差就是浮点除法中的错误。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其他元素将获得点击?
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。)
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbcDriver发生异常。为什么?
这是用Java进行XML解析的最佳库。
Java的PriorityQueue的内置迭代器不会以任何特定顺序遍历数据结构。为什么?
如何在Java中聆听按键时移动图像。
Java“Program to an interface”。这是什么意思?
Java在半透明框架/面板/组件上重新绘画。
Java“ Class.forName()”和“ Class.forName()。newInstance()”之间有什么区别?
在此环境中不提供编译器。也许是在JRE而不是JDK上运行?
Java用相同的方法在一个类中实现两个接口。哪种接口方法被覆盖?
Java 什么是Runtime.getRuntime()。totalMemory()和freeMemory()?
java.library.path中的java.lang.UnsatisfiedLinkError否*****。dll
JavaFX“位置是必需的。” 即使在同一包装中
Java 导入两个具有相同名称的类。怎么处理?
Java 是否应该在HttpServletResponse.getOutputStream()/。getWriter()上调用.close()?
Java RegEx元字符(。)和普通点?