2024-05-08 13:14:23 发布
网友
有谁能提供一些指导,说明如何用Python进行简单的计算,以粗略地证明该语言实现了符合ieee754的53位精度?除了这件事,我在这里没什么可谈的。我尝试过使用0.1+0.2的典型例子,但没有成功。在
>>> for i in range(100): x = 2**i if float(x) == float(x + 1): print(i) break 53
这是因为x是一个整数,并且在Python中整数的位范围是无限的。在
x
计算epsilon,使1.0 + eps == 1.0:
1.0 + eps == 1.0
from itertools import count eps = 1.0 for bits in count(): if 1.0+eps == 1.0: break eps *= 0.5
再加上第三个例子。在
在ieee754中,无穷定义为将所有指数位设置为1 所有尾数都归零。带负片 无穷大,符号位也设为1。这意味着只有零位将属于尾数。在
import struct def float_bin(f): "as bin function, but converts floats to their binary representation" bytes_ = struct.pack("d", f) format_ = "{:08b}" * len(bytes_) binary = format_.format(*bytes_[::-1]) return binary mantissa_bits = float_bin(float("-inf")) # mantissa_bits == "1111111111110000000000000000000000000000000000000000000000000000" print(mantissa_bits.count("0")) # prints 52... (rather than 53)
最后一点在哪里?ieee754明确地为尾数指定了53位,但只存储了52位。这是因为尾数的前导部分是隐含的。 所有用科学记数法表示的数字必须以 非零位数。例如,0.123 * 10^5无效。相反,正确的表示是1.23 * 10^4。 然而,由于二进制中只有一个非零位,所以这个位只能取一个值。因此,显式地存储此位将是一种浪费。意思是,对于53位尾数,您只需要存储52位。在
0.123 * 10^5
1.23 * 10^4
这是因为
x
是一个整数,并且在Python中整数的位范围是无限的。在计算epsilon,使
1.0 + eps == 1.0
:再加上第三个例子。在
在ieee754中,无穷定义为将所有指数位设置为1 所有尾数都归零。带负片 无穷大,符号位也设为1。这意味着只有零位将属于尾数。在
最后一点在哪里?ieee754明确地为尾数指定了53位,但只存储了52位。这是因为尾数的前导部分是隐含的。 所有用科学记数法表示的数字必须以 非零位数。例如,
0.123 * 10^5
无效。相反,正确的表示是1.23 * 10^4
。 然而,由于二进制中只有一个非零位,所以这个位只能取一个值。因此,显式地存储此位将是一种浪费。意思是,对于53位尾数,您只需要存储52位。在相关问题 更多 >
编程相关推荐