Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/335.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 巨蟒的下一个最高力量是10_Python_Ceil - Fatal编程技术网

Python 巨蟒的下一个最高力量是10

Python 巨蟒的下一个最高力量是10,python,ceil,Python,Ceil,我如何执行math.ceil,以便将一个数字分配给下一个最高的10次方 # 0.04 -> 0.1 # 0.7 -> 1 # 1.1 -> 10 # 90 -> 100 # ... 我目前的解决方案是一个检查输入数字范围的字典,但它是硬编码的,我更喜欢一行的解决方案。可能我缺少了一个简单的数学技巧或相应的numpy函数?您可以使用来完成此操作: >>> 10 ** math.ceil(math.log10(0.04))

我如何执行
math.ceil
,以便将一个数字分配给下一个最高的10次方

# 0.04  ->  0.1
# 0.7   ->  1
# 1.1   ->  10  
# 90    ->  100  
# ...
我目前的解决方案是一个检查输入数字范围的字典,但它是硬编码的,我更喜欢一行的解决方案。可能我缺少了一个简单的数学技巧或相应的numpy函数?

您可以使用来完成此操作:

>>> 10 ** math.ceil(math.log10(0.04))
0.1
>>> 10 ** math.ceil(math.log10(0.7))
1
>>> 10 ** math.ceil(math.log10(1.1))
10
>>> 10 ** math.ceil(math.log10(90))
100
log10(n)
为您提供满足
10**x==n
要求的解决方案
x
,因此如果您将
x
四舍五入,它将为您提供下一个最高幂10的指数

注意对于
n
值,其中
x
已经是一个整数,“10的次高幂”将是
n

>>> 10 ** math.ceil(math.log10(0.1))
0.1
>>> 10 ** math.ceil(math.log10(1))
1
>>> 10 ** math.ceil(math.log10(10))
10

你的问题没有明确说明,你需要退一步问一些问题

  • 您的输入类型是什么
  • 您想要哪种类型的输出
  • 对于小于1的结果,您希望取整到什么?您想要10的实际幂还是10的浮点近似幂?你知道10的负幂不能用浮点表示,对吗?现在让我们假设您需要10次方的浮点近似值
  • 如果输入正好是10的幂(或10的幂的最接近浮点近似值),那么输出是否应该与输入相同?还是应该是10的下一次幂?“10->10”或“10->100”?现在让我们假设前者
  • 您的输入值可以是所讨论类型的任何可能值吗?还是他们更受约束
在另一个答案中,有人建议先取对数,然后取整(上限函数),然后求幂

def nextpow10(n):
    return 10 ** math.ceil(math.log10(n))
不幸的是,这受到舍入错误的影响。首先,n从它碰巧拥有的任何数据类型转换为双精度浮点数,可能引入舍入误差,然后计算对数,可能在其内部计算和结果中引入更多舍入误差

因此,我没花多长时间就找到了一个结果不正确的例子

>>> import math
>>> from numpy import nextafter
>>> n = 1
>>> while (10 ** math.ceil(math.log10(nextafter(n,math.inf)))) > n:
...     n *= 10
... 
>>> n
10
>>> nextafter(n,math.inf)
10.000000000000002
>>> 10 ** math.ceil(math.log10(10.000000000000002))
10
从理论上讲,它也有可能在另一个方向失败,尽管这似乎更难激发

因此,对于浮点和整数的稳健解决方案,我们需要假设对数的值只是近似值,因此我们必须测试两种可能性。类似于

def nextpow10(n):
    p = round(math.log10(n))
    r = 10 ** p
    if r < n:
        r = 10 ** (p+1) 
    return r;
def nextpow10(n):
p=四舍五入(数学对数10(n))
r=10**p
如果r
我相信这段代码应该在一个合理的真实世界范围内为所有参数提供正确的结果。对于非常小或非常大数量的非整数和非浮点类型,它将中断,因为将它们转换为浮点的问题。Python将特殊情况下的整数参数添加到log10函数中,以防止溢出,但如果整数足够大,则可能会由于舍入错误而导致错误结果

为了测试这两个实现,我使用了以下测试程序

n = -323 # 10**-324 == 0
while n < 1000:
    v = 10 ** n
    if v != nextpow10(v): print(str(v)+" bad")
    try:
        v = min(nextafter(v,math.inf),v+1)
    except:
        v += 1
    if v > nextpow10(v): print(str(v)+" bad")
    n += 1
n=-323#10**-324==0
当n<1000时:
v=10**n
如果v!=下一步10(v):打印(str(v)+“坏”)
尝试:
v=min(下一个(v,math.inf),v+1)
除:
v+=1
如果v>nextpow10(v):打印(str(v)+“坏”)
n+=1
这在朴素的实现中发现了很多失败,但在改进的实现中却没有发现任何失败。

请检查

>>> i = 0.04123
>>> print i, 10 ** len(str(int(i))) if int(i) > 1 else 10 if i > 1.0 else 1 if i > 0.1 else 10 ** (1 - min([("%.100f" % i).replace('.', '').index(k) for k in [str(j) for j in xrange(1, 10) if str(j) in "%.100f" % i]]))               
0.04123 0.1
>>> i = 0.712
>>> print i, 10 ** len(str(int(i))) if int(i) > 1 else 10 if i > 1.0 else 1 if i > 0.1 else 10 ** (1 - min([("%.100f" % i).replace('.', '').index(k) for k in [str(j) for j in xrange(1, 10) if str(j) in "%.100f" % i]]))                 
0.712 1
>>> i = 1.1
>>> print i, 10 ** len(str(int(i))) if int(i) > 1 else 10 if i > 1.0 else 1 if i > 0.1 else 10 ** (1 - min([("%.100f" % i).replace('.', '').index(k) for k in [str(j) for j in xrange(1, 10) if str(j) in "%.100f" % i]]))                   
1.1 10
>>> i = 90
>>> print i, 10 ** len(str(int(i))) if int(i) > 1 else 10 if i > 1.0 else 1 if i > 0.1 else 10 ** (1 - min([("%.100f" % i).replace('.', '').index(k) for k in [str(j) for j in xrange(1, 10) if str(j) in "%.100f" % i]]))                    
90 100
此代码基于
len(str(int(float\u number))
中的十次方原理

有4例:

  • int(i)>1

    Float
    number-转换为
    int
    ,然后从中提取字符串
    str()
    ,将为我们提供一个长度为
    字符串。所以,第一部分,对于输入
    i>1.0
    ,它是这个长度的十次幂

  • &三,。小分支:
    i>1.0
    i>0.1
    分别是
    10
    1
  • 最后一种情况是,当
    i<0.1
    :这里,十是负幂。为了得到逗号后的第一个非零元素,我使用了这样的结构
    (“%.100f”%I).replace(“.”,“”).index(k)
    ,其中k在
    [1:10]
    区间上运行。此后,取结果列表的最小值。并且减少一,它是第一个零,应该被计数。此外,如果标准python的
    index()
    [1:10]
    间隔中找不到至少一个非零元素,那么它可能会崩溃,这就是为什么最后我必须按出现次数“筛选”列表:
    如果str(j)在“%.100f”%I
    中。 此外,为了获得更高的精度-
    %.100f
    可能会有所不同

似乎您想要的是最低的下一次幂10。。。 这里有一种使用纯数学的方法,没有日志,而是递归

def ceiling10(x):
    if (x > 10):
        return ceiling10(x / 10) * 10
    else:
        if (x <= 1):
            return ceiling10(10 * x) / 10
        else:
            return 10
for x in [1 / 1235, 0.5, 1, 3, 10, 125, 12345]:
    print(x, ceiling10(x))
def天花板10(x):
如果(x>10):
返回天花板10(x/10)*10
其他:
if(x)

可能是这样的吧?这是我脑子里想不出来的,但当我在终端上尝试了一些数字时,它就起作用了。

我认为最简单的方法是:

import math


number = int(input('Enter a number: '))
next_pow_ten = round(10 ** math.ceil(math.log10(number)))
print(str(10) + ' power ' + str(round(math.log10(number))) + ' = '\
      + str(next_pow_ten))

我希望这对您有所帮助。

@bold看起来这些解决方案从
10
开始工作,这需要一些东西,例如
log10
。您需要的词是“电源”。也许你的母语单词翻译错了。谢谢,莫妮卡!@bold:我找到了这个问题,但这是另一个问题。Jonrsharpe提供了一个完美的答案。这也与此有关。1是第0阶,10是第1阶,100是第2阶,等等。使用日志函数似乎就是我想不出来的窍门有。我相信这正是我所希望的!谢谢你。注意:这取决于你想要的行为,这是行不通的
import math


number = int(input('Enter a number: '))
next_pow_ten = round(10 ** math.ceil(math.log10(number)))
print(str(10) + ' power ' + str(round(math.log10(number))) + ' = '\
      + str(next_pow_ten))