关于 python 的无限浮动技术问题
technical problem on python with infinite float
我正在使用 Python,我有一个问题,我想做一个程序,可以从 1 数到无穷大,以知道无穷大是多少。
这是我的代码:
a=0
for i in range(1, 10e+99):
a += 1
print (a)
但它说“'float' 对象不能解释为整数”
而 10e+99 不是浮点数
请帮助我
也许你的意思是你的程序永远持续下去:
a = 0
while True:
a += 1
print(a)
当我看到 while True:
时,我在脑海中将其替换为 'forever'。
使用代码可以检查变量是否为无穷大。
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
注意:无穷大是没有尽头的无穷大,无论您输入什么值或数字,它总是 return false。
问题的出现是因为 range()
函数接受了一个 int
,而 10e+99 确实是一个 float
。虽然 10e+99 当然不是无穷大,因此如果您真的想让 for 循环按原样工作 你可以简单地做
a=0
for i in range(1, int(10e+99)):
a += 1
print (a)
正如其他用户指出的那样,我会完全重新考虑您的策略:使用基于范围的 for 循环到 "find out" 无穷大的值是行不通的。无穷大不是数字。
根据 Python 2 documentation and Python 3 documentation,range
需要整数参数。
在IEEE-754 32位二进制浮点数中,最大可表示的有限数约为3.4028e38。将源码中的数字如1e99
转换成这种格式时,任何大于等于2128−2104[=54=的数] (340,282,377,062,143,265,289,209,819,405,393,854,464) 将转换为无穷大,假设使用了常见的舍入到最近的关系到偶数的方法。因此,10e+99
(代表 10•1099,因此代表 10100)就像无穷大。然而,Python 实现更通常使用 IEEE-754 64 位二进制浮点数,其中最大可表示的有限数是 21024−2971 ,并且 10e99
充当有限数。1 因此,要获得无穷大,您需要大约 1e309
。
人类无法测试从1递增1到10e99
的循环是否会产生无穷大,因为人类可用的总计算能力只有10左右30 每年增加(对于“大约”的松散意义,一些数量级)。这不足以计数到 32 位浮点有限数的极限,更不用说 64 位浮点数了。
如果以浮点数形式进行运算,即使有无限的计算能力,它也永远不会达到无穷大,因为一旦总和达到 253在 IEEE-754 64 位二进制中,加 1 不会改变数字; 253 将在每次迭代中产生。这是因为 IEEE-754 64 位二进制只有 53 位可用于尾数,因此 253+1 不可表示。最接近的可表示值是 253 和 253+2。执行算术时,默认情况下,精确的实数结果四舍五入为最接近的可表示值,并四舍五入为其尾数中具有偶数低位的数字。当 253 加 1 时,实数结果 253+1 四舍五入为 253,因此对于所有未来的迭代,总和保持在 253。
脚注
1 The representable value nearest 10100 is 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.
如果您更正并执行您的程序,将会发生以下情况:
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 等量的太阳来执行此计算。
在你打return之前,我恳请你:三思!拯救宇宙!
我正在使用 Python,我有一个问题,我想做一个程序,可以从 1 数到无穷大,以知道无穷大是多少。 这是我的代码:
a=0
for i in range(1, 10e+99):
a += 1
print (a)
但它说“'float' 对象不能解释为整数”
而 10e+99 不是浮点数 请帮助我
也许你的意思是你的程序永远持续下去:
a = 0
while True:
a += 1
print(a)
当我看到 while True:
时,我在脑海中将其替换为 'forever'。
使用代码可以检查变量是否为无穷大。
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
注意:无穷大是没有尽头的无穷大,无论您输入什么值或数字,它总是 return false。
问题的出现是因为 range()
函数接受了一个 int
,而 10e+99 确实是一个 float
。虽然 10e+99 当然不是无穷大,因此如果您真的想让 for 循环按原样工作 你可以简单地做
a=0
for i in range(1, int(10e+99)):
a += 1
print (a)
正如其他用户指出的那样,我会完全重新考虑您的策略:使用基于范围的 for 循环到 "find out" 无穷大的值是行不通的。无穷大不是数字。
根据 Python 2 documentation and Python 3 documentation,
range
需要整数参数。在IEEE-754 32位二进制浮点数中,最大可表示的有限数约为3.4028e38。将源码中的数字如
1e99
转换成这种格式时,任何大于等于2128−2104[=54=的数] (340,282,377,062,143,265,289,209,819,405,393,854,464) 将转换为无穷大,假设使用了常见的舍入到最近的关系到偶数的方法。因此,10e+99
(代表 10•1099,因此代表 10100)就像无穷大。然而,Python 实现更通常使用 IEEE-754 64 位二进制浮点数,其中最大可表示的有限数是 21024−2971 ,并且10e99
充当有限数。1 因此,要获得无穷大,您需要大约1e309
。人类无法测试从1递增1到
10e99
的循环是否会产生无穷大,因为人类可用的总计算能力只有10左右30 每年增加(对于“大约”的松散意义,一些数量级)。这不足以计数到 32 位浮点有限数的极限,更不用说 64 位浮点数了。如果以浮点数形式进行运算,即使有无限的计算能力,它也永远不会达到无穷大,因为一旦总和达到 253在 IEEE-754 64 位二进制中,加 1 不会改变数字; 253 将在每次迭代中产生。这是因为 IEEE-754 64 位二进制只有 53 位可用于尾数,因此 253+1 不可表示。最接近的可表示值是 253 和 253+2。执行算术时,默认情况下,精确的实数结果四舍五入为最接近的可表示值,并四舍五入为其尾数中具有偶数低位的数字。当 253 加 1 时,实数结果 253+1 四舍五入为 253,因此对于所有未来的迭代,总和保持在 253。
脚注
1 The representable value nearest 10100 is 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.
如果您更正并执行您的程序,将会发生以下情况:
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 等量的太阳来执行此计算。
在你打return之前,我恳请你:三思!拯救宇宙!