为了账号安全,请及时绑定邮箱和手机立即绑定

如何打印浮点数的全精度

如何打印浮点数的全精度

慕森王 2021-06-12 10:44:03
我编写了以下函数,其中传递了 x,y 的值:def check(x, y):    print(type(x))    print(type(y))    print(x)    print(y)    if x == y:        print "Yes"现在当我打电话给 check(1.00000000000000001, 1.0000000000000002) 它时正在打印:<type 'float'><type 'float'>1.01.0现在从变量 x & y 的打印语句中,我很难调试为什么 x != y (尽管两者都打印相同的值)。虽然我通过打印 x - y 解决了它,这给了我不同的但有什么方法可以修改打印语句,以便在不使用任何外部打印库和减法解决方案的情况下知道为什么 x!=y 在这个特定用例中。
查看完整描述

3 回答

?
桃花长相依

TA贡献1860条经验 获得超8个赞

要获得完全精确和正确的格式,请执行以下操作


format(2**(1/2), '.60g') 

# -> '1.4142135623730951454746218587388284504413604736328125'

并检查它


import decimal

print(decimal.Decimal.from_float(2**(1/2))

# -> '1.4142135623730951454746218587388284504413604736328125'

需要时,g格式类型会切换为指数表示法。


查看完整回答
反对 回复 2021-06-29
?
慕哥9229398

TA贡献1877条经验 获得超6个赞

你在这里真正需要的是小数。Python float 不会允许您达到这样的精度。


In [28]: d= Decimal('1.00000000000000001')


In [29]: print d

1.00000000000000001


查看完整回答
反对 回复 2021-06-29
?
宝慕林4294392

TA贡献2021条经验 获得超8个赞

获得具有全精度浮点数的字符串表示的一个简单解决方案是使用json.dumps.


JSON 序列化/反序列化必须确保往返是无损的,因此,实现会生成您正在寻找的字符串表示:


import json


def check(x,y):

    print(json.dumps(x))

    print(json.dumps(y))

    print("x == y is {}".format(x == y))

In [1]: check(1.00000000000000001, 1.0000000000000002)

1.0

1.0000000000000002

x == y is False


In [2]: check(1e-300, 2e-300)

1e-300

2e-300

x == y is False


In [3]: check(1e+300, 2e+300)

1e+300

2e+300

x == y is False

这也说明1.00000000000000001实际上是1.0。这也可以通过使用 枚举 1.0 附近的数字来检查np.nextafter,这会产生下一个更大/更小的可表示浮点值:


    0.9999999999999994

    0.9999999999999996

    0.9999999999999997

    0.9999999999999998

    0.9999999999999999

[*] 1.0               

    1.0000000000000002

    1.0000000000000004

    1.0000000000000007

    1.0000000000000009

    1.000000000000001 

另一个注意事项:json.dumps具有在某些情况下可能令人讨厌的功能:它甚至支持NaN和 +/- 无限值,即使它们不是 JSON 标准的一部分,这在这个用例中实际上是有益的。


我见过的另一种方法是使用"{:.17g}".format(x)基于g 格式说明符。格式化程序也会e在必要时从符号切换到固定符号,17 位数字应该总是足够的精度,但我还没有验证过。但在某些情况下,它可能会产生过多的数字。


查看完整回答
反对 回复 2021-06-29
  • 3 回答
  • 0 关注
  • 187 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信