python中求和的计算

python中求和的计算,python,sum,Python,Sum,在我的课堂上,我被要求写一个程序来计算下面的等式,其中d是距离最近的整数的距离 到目前为止,我写的是: def suma(x,y,z): d = 0 f = 0 if x - math.ceil(x) < math.floor(x) - x: d == x - math.ceil(x) else: d == math.floor(x) - x for i in range(y,z): k = list

在我的课堂上,我被要求写一个程序来计算下面的等式,其中d是距离最近的整数的距离

到目前为止,我写的是:

def suma(x,y,z):
    d = 0
    f = 0
    if x - math.ceil(x) < math.floor(x) - x:
        d == x - math.ceil(x)
    else:
        d == math.floor(x) - x
    for i in range(y,z):
        k = list(range(y,z))
        f += math.pow(2,k[i])*pow(d,2)*(x/pow(2,k[i]))
    return f

print(suma(6,0,15))
def suma(x,y,z):
d=0
f=0
如果x-数学楼层(x)<数学楼层(x)-x:
d==x-math.ceil(x)
其他:
d==数学楼层(x)-x
对于范围内的i(y,z):
k=列表(范围(y,z))
f+=数学功率(2,k[i])*pow(d,2)*(x/pow(2,k[i]))
返回f
印刷品(suma(6,0,15))
结果是我得到了0.0,我想知道我在哪里犯了错误

我非常感谢您在评估以下代码时提供的支持-我不仅对Python完全陌生,而且对编程也完全陌生,我渴望学习并期待反馈


事先非常感谢

通过执行
d==x-math.ceil(x)
,您实际上是在比较d的值。你的意思是写
d=x-math.ceil(x)


这就是为什么它最终返回0,因为d的值永远不会更新。

通过执行
d==x-math.ceil(x)
,您实际上是在比较d的值。你的意思是写
d=x-math.ceil(x)


这就是为什么它最终返回0,因为d的值从未更新。

除了对赋值使用
==
之外,您的代码还有一些问题:

  • 您的
    d
    不是最接近整数的距离;当你输入
    x=6.3
    时,你得到
    -0.7
    ,但应该得到
    0.3
    。相反,只需使用
    d=x-round(x)
  • 您对
    范围的循环没有任何意义,只起作用,因为
    y
    0
    ,因此
    k[i]
    i
    相同;相反,只需对范围(y,z)内的k循环
通过此操作,您可以将代码简化/修复为:

def suma(x, y, z):
    d = x - round(x)
    f = 0
    for k in range(y, z):
        f += 2**k * d**2 * x/(2.**k)
    return f
或更短,与生成器表达式一起使用
sum
。此外,无需在循环的每次迭代中计算
d**2

def suma(x, y, z):
    d2 = (x - round(x))**2
    return sum(2**k * d2 * x/(2.**k) for k in range(y, z))

此外,如评论中所述,
2**k*d**2*x/(2.**k)
应与
d**2*x
相同,因为这两个
2**k
相互抵消,因此您可以进一步简化代码;您甚至不需要总和,因为这些术语独立于
k
(假设您的公式是正确的)


除了在作业中使用
==
之外,您的代码还有一些问题:

  • 您的
    d
    不是最接近整数的距离;当你输入
    x=6.3
    时,你得到
    -0.7
    ,但应该得到
    0.3
    。相反,只需使用
    d=x-round(x)
  • 您对
    范围的循环没有任何意义,只起作用,因为
    y
    0
    ,因此
    k[i]
    i
    相同;相反,只需对范围(y,z)内的k循环
通过此操作,您可以将代码简化/修复为:

def suma(x, y, z):
    d = x - round(x)
    f = 0
    for k in range(y, z):
        f += 2**k * d**2 * x/(2.**k)
    return f
或更短,与生成器表达式一起使用
sum
。此外,无需在循环的每次迭代中计算
d**2

def suma(x, y, z):
    d2 = (x - round(x))**2
    return sum(2**k * d2 * x/(2.**k) for k in range(y, z))

此外,如评论中所述,
2**k*d**2*x/(2.**k)
应与
d**2*x
相同,因为这两个
2**k
相互抵消,因此您可以进一步简化代码;您甚至不需要总和,因为这些术语独立于
k
(假设您的公式是正确的)


执行
d==…
不会将任何内容分配给
d
。你的意思是
d=…
我知道你没有给d赋值,因为你使用==运算符“结果是给我0.0”。你应该得到什么结果?在不知道正确答案的情况下很难调试它。@ZuzannaNikitorowicz欢迎使用堆栈溢出。没有必要在问题中添加代码语言(在本例中为Python)——这都是由标记(您已经添加):)处理的,只是一个数学问题:为什么您的等式中有
math.pow(2,k[i])*(1/pow(2,k[i])
?等于1。所以你基本上是在做
math.pow(d,2)*x
,在求和中…做
d==…
不会给
d
赋值。你的意思是
d=…
我知道你没有给d赋值,因为你使用==运算符“结果是给我0.0”。你应该得到什么结果?在不知道正确答案的情况下很难调试它。@ZuzannaNikitorowicz欢迎使用堆栈溢出。没有必要在问题中添加代码语言(在本例中为Python)——这都是由标记(您已经添加):)处理的,只是一个数学问题:为什么您的等式中有
math.pow(2,k[i])*(1/pow(2,k[i])
?等于1。所以你基本上是在做
math.pow(d,2)*x
,在求和中…我同意这是一个问题,但即使将
=
s更改为
=
s,结果仍然是0.0。肯定还有别的事情发生。是的,通过做
d=math.floor(x)-x
,每次x是整数时,它都将是0。对于
d=x-math.ceil(x)
我同意这是一个问题,但即使将
=
s更改为
=
s,结果仍然是0.0。肯定还有别的事情发生。是的,通过做
d=math.floor(x)-x
,每次x是整数时,它都将是0。这同样适用于
d=x-math.ceil(x)
x=6.8
时,例如,
round(x)
给出
7
d
将是
-0.2
。在这里,这并不重要,因为我们考虑了正方形,但在另一种情况下,这应该被考虑在内。我只是想指出,因为OP似乎对舍入函数感到困惑。@Motun-True;首先我有一个
abs
,但正如你所说,这个数字是平方的。OP的问题