首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >python中的浮点类型是否只表示实数的近似值?

python中的浮点类型是否只表示实数的近似值?
EN

Stack Overflow用户
提问于 2018-08-26 14:25:12
回答 2查看 240关注 0票数 0

我现在是编程和学习基础知识的新手。我想知道python中的float类型是否只表示实数的近似值?我知道float使用二进制分数,但是Floats0.5,0.25,0.125等仍然是近似值吗?我试过了:

代码语言:javascript
运行
复制
sum([0.1] * 10) == 1

它返回False。

代码语言:javascript
运行
复制
sum([0.5] * 10) == 5

它返回True。

最后我试了一下:

代码语言:javascript
运行
复制
for i in range(1, 8):
    answer = sum([1 / 2 ** i] * 10)
    print(answer == 1 / 2 ** i * 10)

答案完全正确。

这意味着python中的一些浮点数确实是实数,而不是近似值?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 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。

票数 3
EN

Stack Overflow用户

发布于 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

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/52023734

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档