Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/365.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
我需要一种干净的方法来检查Python中的浮动范围_Python - Fatal编程技术网

我需要一种干净的方法来检查Python中的浮动范围

我需要一种干净的方法来检查Python中的浮动范围,python,Python,我正在寻找Python中范围检查浮动的一种简单方法,其中最小和最大边界可能为null 有关守则是: tval = float(-b - discriminant) / float (2*a) if tval >= tmin and tval <= tmax: return tval tval = float(-b + discriminant) / float (2*a) if tval >= tmin and tval &l

我正在寻找Python中范围检查浮动的一种简单方法,其中最小和最大边界可能为null

有关守则是:

    tval = float(-b - discriminant) / float (2*a)
    if tval >= tmin and tval <= tmax:
        return tval 

    tval = float(-b + discriminant) / float (2*a)
    if tval >= tmin and tval <= tmax:
        return tval

    # Neither solution was within the acceptable range.
    return None
tval=float(-b-判别式)/float(2*a)

如果tval>=tmin,tval=tmin,tval首先,一些设置:我们需要一个浮点无穷大常数

INF = float(1e3000)

第一种选择可被视为实用的便携式选择;只需使用一些非常大的值,它保证超出平台浮点类型所能表示的范围。第二个选项是“真正”可移植的,但需要Python2.6或更高版本

现在,您的条件可以这样写(编辑:仅当
tmin
tmax
不能为零时!
):


if(tmin或-INF)为了可读性,我可能首先定义一个checker函数:

def inrange(x, min, max):
    return (min is None or min <= x) and (max is None or max >= x)

tval = float(-b - discriminant) / float (2*a)
if inrange(tval, tmin, tmax):
    return tval 

tval = float(-b + discriminant) / float (2*a)
if inrange(tval, tmin, tmax):
    return tval 

# Neither solution was within the acceptable range.
return None
def输入范围(x,最小值,最大值):
返回值(最小值为无或最小值=x)
tval=浮动(-b-判别式)/浮动(2*a)
如果在范围内(tval、tmin、tmax):
回程tval
tval=浮动(-b+判别式)/浮动(2*a)
如果在范围内(tval、tmin、tmax):
回程tval
#两种溶液均不在可接受范围内。
一无所获

我敢打赌,在range
方法中肯定有一个模块定义了这样的
。但我没有找到它(尽管我也没有寻找它)

使用atzz答案中的INF(使用
0.0
时不会失败):

def凝聚(*值):
对于v值:
如果v不是无:
返回v

如果使用atzz答案中的INF合并(tmin,-INF)

if tmin is None: tmin = -INF
if tmax is None: tmax = +INF

tval = float(-b - discriminant) / float (2*a)
if tmin <= tval <= tmax:
    return tval 

tval = float(-b + discriminant) / float (2*a)
if tmin <= tval <= tmax:
    return tval

# Neither solution was within the acceptable range.
return None
如果tmin为None:tmin=-INF
如果tmax为无:tmax=+INF
tval=浮动(-b-判别式)/浮动(2*a)

如果tmin@atzz,我怀疑Adam会重新添加这个,但无论如何,如果您明确地包含他的“returnnone”(可能前面有注释和一个“else”),代码会更清晰,因此,当if条件失败时,没有一个维护人员认为这是一个bug,而您得到的隐式返回值为None。对于tmin和tmax的0.0值失败。@Peter Hansen--嗯,还有什么“其他”呢?什么是隐性回报?我只是照原样从问题中提取了
if
语句。此处描述的更改仅影响条件。其他的改变超出了问题的范围。我将保留我的投票权。即使这不是一个完整的答案,它也激发了一些其他的解决方案,并设法向我展示了一个我不知道我需要的单元测试。阿特兹:事实上,当你得到错误和误导性的答案时,我投了反对票,现在它被修复了,我将撤回该选项并投赞成票。不过,我仍然认为有一个更好的解决方案(就清晰度而言)(我在回答中更喜欢的解决方案):)这个很好用。由于tmin和tmax实际上是作为关键字参数接收的,我可以简单地为它们设置默认值-/+无穷大,而不是无。这实际上是一个更合理的违约。
if (tmin or -INF) <= tval <= (tmax or +INF) :
    return tval
def inrange(x, min, max):
    return (min is None or min <= x) and (max is None or max >= x)

tval = float(-b - discriminant) / float (2*a)
if inrange(tval, tmin, tmax):
    return tval 

tval = float(-b + discriminant) / float (2*a)
if inrange(tval, tmin, tmax):
    return tval 

# Neither solution was within the acceptable range.
return None
def coalesce(*values):
  for v in values:
    if v is not None:
      return v

if coalesce(tmin, -INF) <= tval <= coalesce(tmax, INF):
  return tval
if ((tmin is None or tmin <= tval) and
    (tmax is None or tval <= tmax)):
   return tval
if tmin is None: tmin = -INF
if tmax is None: tmax = +INF

tval = float(-b - discriminant) / float (2*a)
if tmin <= tval <= tmax:
    return tval 

tval = float(-b + discriminant) / float (2*a)
if tmin <= tval <= tmax:
    return tval

# Neither solution was within the acceptable range.
return None