在没有字符串的情况下将浮点数分解为基数10中的尾数和指数

时间:2017-07-26 16:00:36

标签: python

Python库或numpy中是否有函数将float作为输入并返回其十进制科学符号分解,即尾数和指数?或者是否有一种简单的方法来实现这一点,而无需借助字符串转换或使用for循环来确定指数?编写这样的函数并不困难,我感到震惊的是我在数学,十进制或numpy中找不到现有的函数。

e.g。如果fexpfman是给出float的十进制浮点表示的指数和尾数的函数,那么我们希望以下语句都返回true:

fexp(154.3) == 2.0
fman(154.3) == 1.543
fexp(-1000) == 3.0
fman(-1000) == -1.0

简而言之,这将是一个"十进制版本" math.frexp

2 个答案:

答案 0 :(得分:11)

避免字符串转换的一种方法是使用Decimals实现方法:

from decimal import Decimal

def fexp(number):
    (sign, digits, exponent) = Decimal(number).as_tuple()
    return len(digits) + exponent - 1

def fman(number):
    return Decimal(number).scaleb(-fexp(number)).normalize()

请注意,使用浮点数时,无法计算尾数和指数而不进行舍入。原因是floating point numbers are stored as base 2 fractions。例如,154.3的存储浮点值为154.30000000000001136868377216160297393798828125。浮点数在控制台中显示为准确的数字,因为(在CPython中)they are always rounded when serialized using a hard-coded precision of 17

答案 1 :(得分:2)

我希望有更好的答案,但我想出了

from math import floor, log10

def fexp(f):
    return int(floor(log10(abs(f)))) if f != 0 else 0

def fman(f):
    return f/10**fexp(f)