当前位置: 首页 > 面试题库 >

Python中意外的浮点表示形式

蒯卓君
2023-03-14
问题内容

您好,我在Python中使用字典来存储一些城市及其人口,例如:

population = { 'Shanghai' : 17.8, 'Istanbul' : 13.3, 'Karachi' : 13.0, 'mumbai' : 12.5 }

现在,如果我使用命令print population,则会得到结果:

{'Karachi': 13.0, 'Shanghai': 17.800000000000001, 'Istanbul': 13.300000000000001, 'mumbai': 12.5}

相反,如果我使用命令,则会print population['Shanghai']得到的初始输入17.8

我对你的问题是如何的17.813.3变成17.80000000000000113.300000000000001分别?所有这些信息是如何产生的?以及为什么将其存储在此处,因为我的初始输入表明我至少在我所知的范围内不需要这些额外的信息。


问题答案:

在Python 3.1中已对此进行了更改。在新页面上:

Python现在使用David Gay的算法来查找不会更改其值的最短浮点表示形式。这应该有助于减轻围绕二进制浮点数的一些困惑。

用类似1.1这样的数字很容易看出其重要性,该数字在二进制浮点数中没有确切的等价物。由于没有精确的等价项,因此像这样的表达式的float('1.1')计算结果是最接近的可表示值,0x1.199999999999ap+0以十六进制或1.100000000000000088817841970012523233890533447265625十进制表示。该最接近的值曾经且仍在以后的浮点计算中使用。

新功能是显示数字的方式。以前,Python使用一种简单的方法。的值repr(1.1)被计算为format(1.1, '.17g')其中评价'1.1000000000000001'。使用17位数字的优点是它依靠IEEE-754保证来确保eval(repr(1.1))准确地往返于其原始值。缺点是许多人发现输出令人困惑(将二进制浮点表示的固有限制误认为是Python本身的问题)。

的新算法repr(1.1)更智能,并且返回'1.1'。有效地,它搜索所有等效的字符串表示形式(使用相同的基础浮点值存储的字符串表示形式),并返回最短的表示形式。

新算法倾向于在可能的情况下发出更清晰的表示,但它不会更改基础值。因此,1.1 + 2.2 != 3.3即使这些表示可能暗示其他情况,仍然是这种情况。

新算法取决于基础浮点实现中的某些功能。如果找不到所需的功能,则将继续使用旧算法。而且,文本pickle协议通过使用旧算法来确保跨平台的可移植性。

(由Eric Smith和Mark Dickinson贡献;发行1580年)



 类似资料:
  • 问题内容: 我想将浮点数表示为四舍五入到一定位数的字符串,并且从不使用指数格式。本质上,我想显示任何浮点数并确保它“看起来不错”。 这个问题有几个部分: 我需要能够指定有效位数。 有效位数必须是可变的,而字符串格式化运算符不能做到这一点。[编辑]我已经改正了;字符串格式化操作符可以做到这一点。 我需要将其四舍五入到一个人期望的方式,而不是像1.999999999999 我想出了一种方法来完成此任务

  • 问题内容: 我想撤消一个列表,但是我设法做到了,但是在工作的中间我发现了一些奇怪的事情。下面的程序按预期工作,但list_reversed [i] = list [len(list)-1-i] 和 print(list [i]) (顺理成章地注释了 最后一行 )这 行 引起了 list 的更改。我没看到什么?我的Python版本是3.3.3。先感谢您。 问题答案: 以下: 使两个变量引用相同的列表

  • 我只需要在Python中舍入浮点数的最后2个正数 EX: 0.000000302329303- 这是否可能以类似圆形的简单方式实现?

  • 问题内容: 在Java中,我试图找到一种将浮点数转换为分数字符串的方法。例如: 任何想法如何用Java做到这一点? 问题答案: 最简单的方法可能是使用反复试验。 版画

  • 浮点是C语言中定义的实现,因此没有任何保证。 我们的代码需要可移植,我们正在讨论是否可以在协议中使用IEEE754浮动。出于性能考虑,如果我们在发送或接收数据时不必在定点格式之间来回转换,那就太好了。 虽然我知道平台和架构之间在或的大小上可能存在差异。但我似乎找不到任何关于和的具体信息。 到目前为止,我发现在big endian平台上字节顺序可能会颠倒。虽然有些平台不支持浮点运算,但包含和的代码甚

  • 问题内容: 是否有一种相当简单的方法将datetime对象转换为RFC 1123(HTTP / 1.1)日期/时间字符串,即具有以下格式的字符串 使用不起作用,因为字符串取决于语言环境。我是否需要手工制作琴弦? 问题答案: 您可以从不依赖于语言环境设置的stdlib中使用wsgiref.handlers.format_date_time 您可以使用不依赖于语言环境设置的stdlib中的email.