我现在是编程和学习基础知识的新手。我想知道python中的float类型是否只表示实数的近似值?我知道float使用二进制分数,但是Floats0.5,0.25,0.125等仍然是近似值吗?我试过了:
sum([0.1] * 10) == 1它返回False。
但
sum([0.5] * 10) == 5它返回True。
最后我试了一下:
for i in range(1, 8):
answer = sum([1 / 2 ** i] * 10)
print(answer == 1 / 2 ** i * 10)答案完全正确。
这意味着python中的一些浮点数确实是实数,而不是近似值?
发布于 2018-08-26 20:26:23
每个浮点对象精确地表示一个数字(或特殊的值,如NaN)。浮点对象不表示近似值。
考虑浮点的正确方式是,浮点值是精确的数字,但浮点操作近似实数运算。
Python不能精确地指定浮点算法;每个Python实现都可以使用实现它的平台的底层算法。通常使用IEEE754格式,尽管操作可能不完全符合IEEE754。为了说明您的代码发生了什么,我将使用IEEE-754基本的64位二进制浮点数。
处理源文本0.5时,会将其转换为浮点数。注意,转换是一种运算,就像加法或乘法是运算一样。字符被解释为十进制数字,转换生成的浮点数最接近该十进制数所表示的数字。在本例中,0.5表示二进制浮点数的二分之一,因此结果恰好是0.5。
然后,[0.5] * 10生成一个包含0.5的10个副本的列表,然后sum将这些副本相加。此求和中执行的所有加法都是精确的,因为浮点格式可以精确地表示0.5、1、1.5、2等等。因此,结果是5,准确地说,将此与5进行比较会得到true。
另一方面,在处理源文本0.1时,该十进制数表示十分之一,这不能准确表示。转换会生成最接近的可表示值,即0.1000000000000000055511151231257827021181583404541015625.
当sum添加这十个副本时,并不总是准确地执行该添加。将前两个元素相加是准确的,将0.1000000000000000055511151231257827021181583404541015625添加到0.1000000000000000055511151231257827021181583404541015625将生成0.200000000000000011102230246251565404236316680908203125.但是,将0.200000000000000011102230246251565404236316680908203125添加到0.1000000000000000055511151231257827021181583404541015625,时,结果为0.3000000000000000444089209850062616169452667236328125.在此加法过程中,加法中的位将进位到新位置(操作数小于1/4,但结果超过1/4-进位到1/4位置的加法。由于浮点格式只有固定数量的位数(53)可用于该值,因此该操作必须丢弃低位。在这样做的过程中,它稍微改变了结果。所以这个加法只是近似值。
随着这些加法的继续,最终的值是0.99999999999999988897769753748434595763683319091796875.将其与1进行比较时,结果为false。
发布于 2018-08-26 20:26:50
Python将浮点数表示为二进制小数。因此,像0.5这样的数字可以准确地表示出来,而0.1这样的数字则不能。Python中的浮点数只是近似值,如果它们不能用二进制分数精确表示的话。如果您在处理浮点算术时需要更高的精度,我建议您查看一下小数:https://docs.python.org/3/library/decimal.html
此外,还可以在以下位置找到关于Python浮点数的很好的资源:https://docs.python.org/3/tutorial/floatingpoint.html
https://stackoverflow.com/questions/52023734
复制相似问题