代码之家  ›  专栏  ›  技术社区  ›  shadowtalker

假设策略生成inf时,特别要求不要

  •  1
  • shadowtalker  · 技术社区  · 6 年前
    from functools import partial
    import hypothesis as h
    import hypothesis.strategies as hs
    import hypothesis.extra.numpy as hnp
    import numpy as np
    
    
    floats_notnull = partial(hs.floats, allow_nan=False, allow_infinity=False)
    complex_notnull = partial(hs.complex_numbers, allow_nan=False, allow_infinity=False)
    
    data_strategy_real = hnp.arrays(
        np.float64,
        hs.tuples(hs.integers(min_value=2, max_value=50),
                  hs.integers(min_value=2, max_value=5)),
        floats_notnull()
    )
    
    data_strategy_complex = hnp.arrays(
        np.complex64,
        hs.tuples(hs.integers(min_value=2, max_value=50), hs.just(1)),
        complex_notnull()
    )
    
    data_strategy = hs.one_of(data_strategy_real, data_strategy_complex)
    

    如果你跑了 data_strategy.example() 有几次,您会注意到结果中的一些值有无限的实部或虚部。我在这里的意图是明确地禁止无限部分或NaN部分。

    我做错什么了?

    更新 :如果我使用

    data_strategy = hs.lists(complex_notnull, min_size=2, max_size=50)
    

    如果我使用

    data_strategy = data_strategy_real
    

    inf 有人出现了。

    2 回复  |  直到 6 年前
        1
  •  3
  •   Zac Hatfield-Dodds    5 年前

    complex64类型太小,已溢出。不知何故,这一假设未能抓住这一点。

    64位 有限浮点,然后将它们转换为32位(因为 complex64 是一对32位浮点数)。你可以用 width=32 论据 floats()

    floats_notnull_32 = partial(hs.floats, allow_nan=False, allow_infinity=False, width=32)
    

    你不会得到通常的超额支票,因为 it's only implemented for floats and integers 目前。我已打开(编辑:并修复) issue #1591 也可以检查复杂类型和字符串类型。

        2
  •  1
  •   shadowtalker    6 年前

    这个 complex64

    complex128 暂时解决了问题。