为了账号安全,请及时绑定邮箱和手机立即绑定

具有无限浮点数的python上的技术问题

具有无限浮点数的python上的技术问题

人到中年有点甜 2022-08-25 15:22:08
我正在使用Python,我有一个问题,我想做一个程序,可以数从1到无限,要知道多少是无限的。这是我的代码:a=0for i in range(1, 10e+99):  a += 1  print (a)但它说“'浮点'对象不能被解释为整数”而10e + 99不是浮子请帮帮我
查看完整描述

5 回答

?
心有法竹

TA贡献1866条经验 获得超5个赞

  1. 根据 Python 2 文档和 Python 3 文档,需要整数参数。range

  2. 在IEEE-754 32位二进制浮点数中,最大可表示的有限数约为3.4028e38。将数字(如源代码中的数字)转换为此格式时,任何大于或等于 2128−2104 (340,282,377,062,143,265,289,209,819,405,393,854,464) 的数字都将转换为无穷大,前提是使用常见的舍入到最近连接到偶数方法。因此,(代表10•1099,因此代表10100)将表现得像无穷大。但是,Python实现通常使用IEEE-754 64位二进制浮点,其中最大可表示的有限数是21024−2971,并充当有限数。1 因此,要获得无穷大,您需要周围。1e9910e+9910e991e309

  3. 人类不可能测试从1到1递增1的循环是否会产生无穷大,因为人类每年可用的总计算能力只有大约1030个添加(对于松散的“周围”感,一些数量级)。这不足以计数到32位浮点有限数的极限,更不用说64位浮点数了。10e99

  4. 如果算术以浮点格式完成,即使具有无限的计算能力,它也永远不会达到无穷大,因为一旦IEEE-754 64位二进制文件中的总和达到253,添加1不会改变数字;253 将在每次迭代中产生。这是因为 IEEE-754 64 位二进制文件只有 53 位可用于有效位数,因此 253+1 不可表示。最接近的可表示值为 253 和 253+2。执行算术运算时,默认情况下,确切的实数结果将舍入为最接近的可表示值,并将关系舍入到其有效位数为偶数低位的数字。当 1 相加到 253 时,实数结果 253+1 将舍入为 253,因此对于所有将来的迭代,总和将保持在 253

脚注

1 最接近的 10100 的可表示值为 10,000,000,000,000,000,159,028,911,097,599,180,468,360,808,563,945,281,389,781,327,557,747,838,772,170,381,060,813,469,985,856,815,104。


查看完整回答
反对 回复 2022-08-25
?
慕码人8056858

TA贡献1803条经验 获得超6个赞

问题出现是因为函数取一个,而10e+99确实是一个。虽然10e + 99当然不是无穷大,因此你不应该期望无穷大在程序执行过程中弹出任何地方,但如果你真的想让你的for循环按原样工作,你可以简单地做range()intfloat


a=0

for i in range(1, int(10e+99)):

    a += 1

    print (a)

然而,正如其他用户所指出的那样,我会完全重新考虑你的策略:使用基于范围的for循环来“找出”无穷大的值是行不通的。无穷大不是一个数字。


查看完整回答
反对 回复 2022-08-25
?
烙印99

TA贡献1829条经验 获得超13个赞

使用是代码,你可以检查你的变量是否无穷大。


import math


infinity = float('inf')

a = 99999999999999999999999999999999

if a > infinity:

 print('Your number is an infinity number')

else:

 print('Your number is not an infinity number')


#or you can check with math.isinf


print('Your number is Infinity: ',math.isinf(infinity ))


# Also infinity can be both positive and negative 

注意:无穷大是无穷大,没有尽头,无论您输入什么值或数字,它都将始终返回false。


查看完整回答
反对 回复 2022-08-25
?
慕勒3428872

TA贡献1848条经验 获得超6个赞

以下是如果您更正并执行程序将会发生什么:


a=0

for i in range(1, 10**100):

  a += 1

  print (a)

假设你有一个超级高效的python虚拟机(每个人都知道他们有多高效...)。


假设您有一个非常有效的(无界)大整数实现。


假设每个循环需要几个机器周期才能以十进制形式打印这些数字(假设只有1000,这在现实中是很不真实的)。


假设每个周期大约需要1.0e-10秒(10GHz),这意味着利用并行度实现打印。


有了这些不切实际的假设,程序完成已经需要10 ^ 93秒。


宇宙的年龄估计小于10^ 18秒。这将是漫长的。


现在让我们计算一下它将在400W计算机的基础上吸收的能量。假设所有太阳物质(2e30 kg)都可以转换为计算机的电能(通过E = m c ^ 2),您将消耗大约2 10 ^ 48相当于Sun来执行此计算。


在你回头之前,我恳请你:三思而后行!拯救宇宙!


查看完整回答
反对 回复 2022-08-25
?
慕神8447489

TA贡献1780条经验 获得超1个赞

也许你的意思是你的程序永远持续下去:


a = 0

while True:

  a += 1

  print(a)

当我看到时,在我的脑海中,我用“永远”代替它。while True:


查看完整回答
反对 回复 2022-08-25
  • 5 回答
  • 0 关注
  • 161 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
微信客服

购课补贴
联系客服咨询优惠详情

帮助反馈 APP下载

慕课网APP
您的移动学习伙伴

公众号

扫描二维码
关注慕课网微信公众号