【问题标题】:Find floating point accuracy查找浮点精度
【发布时间】:2023-03-15 11:00:01
【问题描述】:

在python中,给定数字2.056e+072.05645e+07,你如何找到每个数字的有效数字?也就是尾数的长度。目的是比较数据输入的数字,并只选择信息最多的一个。

此信息以某种方式隐藏在 Why Are Floating Point Numbers Inaccurate?(可能还有 Easy way of finding decimal places)中。

使用'2.05645e+07'.index('e') 似乎是一种黑客行为。

【问题讨论】:

    标签: python floating-point


    【解决方案1】:

    稍微不那么骇人听闻,但仍有待改进:

    len(''.join([str(x) for x in Decimal(2.05645e+07).as_tuple().digits]).rstrip('0'))
    

    通过检查thanks to @Mark Dickinson 更具可读性

    from types import StringType
    
    def mantissa_length(string):
        '''>>> mantissa_length("2.05645e+07")
        6
        >>> mantissa_length("2.05645e+01")
        6'''
        assert type(string) is StringType, "this function fails for float values"
        digits = Decimal(string).as_tuple().digits
        return len(''.join([str(x) for x in digits]).rstrip('0'))
    

    【讨论】:

    • 为什么不len(str(Decimal(2.05645e+07)).rstrip('0'))
    • @L_S: len(str(Decimal(2.05645e+01)).rstrip('0')) 不过问题很好。
    • 对于2.05645e+01 的输入,您的解决方案给出50 的输出。这就是你想要的吗?
    • @MarkDickinson:奇怪的是,如果首先将参数转换为字符串,则可以避免这种行为......
    • @serv-inc:对。使用浮点文字,您首先转换为 Python 的二进制浮点格式,会产生一个小的舍入误差,然后转换为 Decimal 是精确的(因此保留了该舍入误差)。直接从字符串转换时,不会引入舍入误差。
    猜你喜欢
    • 1970-01-01
    • 2021-04-05
    • 2023-03-31
    • 2018-07-06
    • 2017-11-30
    • 2019-11-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多