【问题标题】:Binary/Hex Floating Point Entry二进制/十六进制浮点输入
【发布时间】:2014-01-28 06:23:01
【问题描述】:

为什么小数点只能以 10 为底?为什么以下会引发语法错误?

0b1011101.1101

我输入的数字是否有歧义?除了93.8125

同样的问题也适用于其他基地:

0x5d.d

我可以用一个相当简单的函数来编程解决这个问题:

def base_float(number_string, base):
    n = number_string.split('.')
    number = int(n[0], base)
    if len(n) > 1 and len(n[1]):
        frac_part = float(int(n[1], base)) / base**len(n[1])
        if number < 0:
            frac_part = -frac_part
        number += frac_part
    return number

它给了我我期望的表现:

>>> base_float('0b1011101.1101', 2)
93.8125

int 接受任意基数,但没有小数点,float 接受小数点但没有任意基数。为什么?

【问题讨论】:

  • 我猜没有人想要足够的功能来实现它。对于整数,二进制、八进制和十六进制往往比十六进制更有用。不过,我不知道真正的原因是什么。
  • 请注意,在极少数情况下,允许使用非十进制文字中的小数部分会破坏现有代码。目前,0b1.bit_length() 是有效代码;如果引入二进制浮点文字,0b1. 将是浮点文字,0b1.bit_length() 将是语法错误。
  • @user2357112 这些问题已经出现。将1..__class__(1).__class__1.__class__ 进行比较。
  • @Hyperboreus:我知道这些情况。不过,现在更改语言以允许使用非十进制浮点文字可能会破坏以前工作的代码。没有工作代码依赖于1.__class__
  • 这确实是一个语言设计问题,user2357112 的评论是正确的:没有人想要或需要足够的功能来实现它并说服其他 Python 开发人员认为它值得在核心语言中使用。请注意,一种从十六进制字符串转换的方法:试试float.fromhex('123.456')

标签: python python-2.7 floating-point numbers syntax-error


【解决方案1】:

它们被称为小数点;)

你可以使用一种科学*符号

>>> 0b10111011101 * 0b10**-4
93.8125
>>> 0x5dd * 0x10**-1
93.8125
>>> 938125 * 10**-4 # note power is number of "decimal" places to shift
93.8125

* 是的,我意识到这不是真正的科学记数法

编辑

出于好奇,我使用dis 模块将字节码反汇编为一个简单的这些语句,看看它们是否是在运行时计算的

>>> import dis
>>> def f():
...     return 0x5dd * 0x10**-1
...
>>> dis.dis(f)
  2           0 LOAD_CONST               6 (93.8125)
              3 RETURN_VALUE

所以看起来您在使用此方法时不应该看到性能损失。

编辑 2

...除非你使用 Python 2

>>> import dis
>>> def f():
...     return 0x5dd * 0x10**-1
...
>>> dis.dis(f)
  2           0 LOAD_CONST               1 (1501)
              3 LOAD_CONST               4 (0.0625)
              6 BINARY_MULTIPLY
              7 RETURN_VALUE

【讨论】:

  • 没问题,你能详细说明原因吗 - 我很感兴趣
【解决方案2】:

正如 cmets 中的人们已经写道:它只是被认为是不需要的。

它们可能非常有用,尤其是当需要存储给定实体的确切值并再次保留它时,但这种情况很少发生。

您的功能是 - 如果我将 if int_part &lt; 0: 替换为 if number &lt; 0: - 非常有帮助。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-10-30
    • 2011-12-05
    • 2015-10-11
    • 2016-06-02
    • 1970-01-01
    • 2012-03-28
    相关资源
    最近更新 更多