# coding=utf-8 # # This file is part of Hypothesis, which may be found at # https://github.com/HypothesisWorks/hypothesis-python # # Most of this work is copyright (C) 2013-2018 David R. MacIver # (david@drmaciver.com), but it contains contributions by others. See # CONTRIBUTING.rst for a full list of people who may hold copyright, and # consult the git log if you need to determine who owns an individual # contribution. # # This Source Code Form is subject to the terms of the Mozilla Public License, # v. 2.0. If a copy of the MPL was not distributed with this file, You can # obtain one at http://mozilla.org/MPL/2.0/. # # END HEADER from __future__ import division, print_function, absolute_import import math from hypothesis.internal.compat import struct_pack, struct_unpack def sign(x): try: return math.copysign(1.0, x) except TypeError: raise TypeError('Expected float but got %r of type %s' % ( x, type(x).__name__ )) def is_negative(x): return sign(x) < 0 def count_between_floats(x, y): assert x <= y if is_negative(x): if is_negative(y): return float_to_int(x) - float_to_int(y) + 1 else: return count_between_floats(x, -0.0) + count_between_floats(0.0, y) else: assert not is_negative(y) return float_to_int(y) - float_to_int(x) + 1 def float_to_int(value): return ( struct_unpack(b'!Q', struct_pack(b'!d', value))[0] ) def int_to_float(value): return ( struct_unpack(b'!d', struct_pack(b'!Q', value))[0] )