Python 3.x 如何获取[-100100]中x的表达式sqrt(16+;x**2)产生的所有整数

Python 3.x 如何获取[-100100]中x的表达式sqrt(16+;x**2)产生的所有整数,python-3.x,Python 3.x,我想制作一个程序,给出一个由表达式y=sqrt(16+x**2)得到的所有整数的列表,对于[-100100]中的x 我试过这个 def num(): x= [] for y in range (-100,100): z = (16+y**2)**0.5 if isinstance(z,int): x.append(z) return(x) 但是我有一个问题,函数sqrt()总是给出一个浮点数,例如 sqrt(1

我想制作一个程序,给出一个由表达式y=sqrt(16+x**2)得到的所有整数的列表,对于[-100100]中的x 我试过这个

def num():
    x= []
    for y in range (-100,100):
        z = (16+y**2)**0.5 
        if isinstance(z,int):
            x.append(z)
    return(x) 
但是我有一个问题,函数sqrt()总是给出一个浮点数,例如

sqrt(16+3**2)

Out[20]:5.0

尝试模运算符:

def num():
    x= []
    for y in range (-100,100):
        z = (16+y**2)**0.5 
        if z % 1 == 0:
            x.append(z)
    return(x)

有关模运算的更多信息:

请尝试模运算:

def num():
    x= []
    for y in range (-100,100):
        z = (16+y**2)**0.5 
        if z % 1 == 0:
            x.append(z)
    return(x)

关于模的更多信息:

如果i持续(z,int),你可以在z==int(z)的情况下执行
。这将截断小数点右边的任何内容,并检查该值是否保持不变。基本上只是检查小数点右边的所有内容是否都是零。

如果是持续(z,int)
,而不是
,如果z==int(z)
,则只需执行
。这将截断小数点右边的任何内容,并检查该值是否保持不变。基本上只是检查小数点右边的所有内容是否为零。

这不是您唯一的问题

浮点数不是所有实数的精确表示。特别是,它们不能精确地表示像平方根2这样的数字,我们甚至不能确定像平方根4这样的数字的浮点表示是否精确

程序员至少有两种方法来处理这个问题

求解
y
的方程。有三种解决方案,每一种都依赖于此

我想说,只有三根。但是可爱的,精确的。如果要以这种方式执行,请使用Symphy库

这是一种允许浮点近似的不精确方法,适用于无法求解原始方程的情况

公差
是不精确性的来源,是一个人自己对整数和平方根例程产生的值之间的差异的估计。请注意,必须应用
abs
运算符,以便将差值视为正值

tolerance = 0.0001

x = []
for y in range(-100, 101):
    z = (16+y**2)**0.5
    if abs(z-round(z)) < tolerance:
        x.append(z)

print (x)

这不是你唯一的问题

浮点数不是所有实数的精确表示。特别是,它们不能精确地表示像平方根2这样的数字,我们甚至不能确定像平方根4这样的数字的浮点表示是否精确

程序员至少有两种方法来处理这个问题

求解
y
的方程。有三种解决方案,每一种都依赖于此

我想说,只有三根。但是可爱的,精确的。如果要以这种方式执行,请使用Symphy库

这是一种允许浮点近似的不精确方法,适用于无法求解原始方程的情况

公差
是不精确性的来源,是一个人自己对整数和平方根例程产生的值之间的差异的估计。请注意,必须应用
abs
运算符,以便将差值视为正值

tolerance = 0.0001

x = []
for y in range(-100, 101):
    z = (16+y**2)**0.5
    if abs(z-round(z)) < tolerance:
        x.append(z)

print (x)

如果效率不是您主要关心的问题,则您无需处理
float
s的替代方案:

x = []
for z in range(4, 100):
    for y in range(z):
        if z**2 - y**2 == 16:
            x.append(z)

如果效率不是您主要关心的问题,则您无需处理
float
s的替代方案:

x = []
for z in range(4, 100):
    for y in range(z):
        if z**2 - y**2 == 16:
            x.append(z)

如果你愿意使用symphy,这个问题可以表述为丢番图方程
z=sqrt(16+x**2)->z**2=16+x**2
,其中
x
z
必须是整数:

>>> diophantine(16 + x**2 - y**2)
{(−3,−5),(−3,5),(0,−4),(0,4),(3,−5),(3,5)}

这些是你对x和y的答案。因此,在这种情况下,你的“程序”只是能够以一种可以用现有工具解决的形式陈述问题……在一个相对较高的层次上(与你现在工作的较低层次相比)。

如果你愿意使用Symphy,这个问题可以表述为丢番图方程
z=sqrt(16+x**2)->z**2=16+x**2
其中
x
z
必须是整数:

>>> diophantine(16 + x**2 - y**2)
{(−3,−5),(−3,5),(0,−4),(0,4),(3,−5),(3,5)}

这些是你对x和y的答案。因此,在这种情况下,你的“程序”只是能够用一种可以用现有工具来解决的问题来陈述问题……在一个相对高的水平上(与你现在正在工作的较低级别)。

< P>如果你只考虑x从0到100,你可以计算y值并取int值。这将为您提供比实际值小1或正确的值,因此测试这两个值以查看其中一个是否满足等价关系,
y**2-(16+x**2)=0
。如果是,那么x是一个答案(和-x也是):


因此,通过意识到+/-x给出相同的结果,您只需搜索原始范围的一半;意识到在计算sqrt时,您可能会偏离1,这会使您所做的测试加倍……但对洞察力和技巧的需求会大大减少。:-)y**2-(16+x**2)=0
。如果是,那么x是一个答案(和-x也是):


因此,通过意识到+/-x给出相同的结果,您只需搜索原始范围的一半;意识到在计算sqrt时,您可能会偏离1,这会使您所做的测试加倍……但对洞察力和技巧的需求会大大减少。:-)

提示:可能重复提示:可能重复抱歉,正在电话上键入。现在试一试如果z是,比如说,4.999999999999怎么办?对不起,是在打电话。现在试一试如果z是,比如说,4.999999999999999怎么办?如果z是,比如说,4.999999999999怎么办?如果z是,比如说,4.999999999999怎么办?
abs(z-int(z))
检查失败您自己的“如果z是,比如,4.999999999999怎么办?”测试。也许你想要abs(z-round(z))?谢谢你,@MarkDickinson!再一次谦卑了<