Python库或numpy中是否有函数将float作为输入并返回其十进制科学符号分解,即尾数和指数?或者是否有一种简单的方法来实现这一点,而无需借助字符串转换或使用for循环来确定指数?编写这样的函数并不困难,我感到震惊的是我在数学,十进制或numpy中找不到现有的函数。
e.g。如果fexp
和fman
是给出float的十进制浮点表示的指数和尾数的函数,那么我们希望以下语句都返回true:
fexp(154.3) == 2.0
fman(154.3) == 1.543
fexp(-1000) == 3.0
fman(-1000) == -1.0
简而言之,这将是一个"十进制版本" math.frexp
。
答案 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)