二进制/十六进制浮点输入

时间:2014-01-28 06:23:02

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

为什么基数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接受小数点但不接受任意基数。为什么呢?

2 个答案:

答案 0 :(得分:5)

他们被称为十进制点;)

你可以使用某种科学的*符号

>>> 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

答案 1 :(得分:1)

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

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

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