Python 3.x 创建有符号32位浮点最大值十进制的编程方法(Python3) 问题陈述和背景
我正在编写一个函数,它是一个包含单个浮点值的字符串,例如“3.14159” 我想做的是评估这个浮点数是否在有符号32位浮点数的边界内(也是64位的,但现在让我们先忘掉它) 由于浮点精度问题,我想使用Python 3.x 创建有符号32位浮点最大值十进制的编程方法(Python3) 问题陈述和背景,python-3.x,floating-point,decimal,Python 3.x,Floating Point,Decimal,我正在编写一个函数,它是一个包含单个浮点值的字符串,例如“3.14159” 我想做的是评估这个浮点数是否在有符号32位浮点数的边界内(也是64位的,但现在让我们先忘掉它) 由于浮点精度问题,我想使用Decimal对象进行比较 我的问题是: 如何创建一个包含最大有符号32位浮点值的十进制 这将用于比较 我所尝试的: 浏览完这篇维基百科文章后: 。。。报告有23个系数位,8个指数位和1个符号位,我编写了以下代码 from decimal import Decimal def is_single(
Decimal
对象进行比较
我的问题是:
如何创建一个包含最大有符号32位浮点值的十进制
这将用于比较
我所尝试的:
浏览完这篇维基百科文章后:
。。。报告有23个系数位,8个指数位和1个符号位,我编写了以下代码
from decimal import Decimal
def is_single(value):
d_value = Decimal(value)
_23bit_max_bin = '1' * 23 # '11111111111111111111111'
_23bit_max_dec = int(_23bit_max_bin, 2) # 8388607
_coeffient_tuple = tuple([int(d) for d in str(_23bit_max_dec)]) # (8, 3, 8, 8, 6, 0, 6)
_exponent_bin = '1' * 8 # '11111111'
_exponent_dec = int(_exponent_bin, 2) # 255
_dec_tuple = (0, _coeffient_tuple, _exponent_dec) # (1, (8, 3, 8, 8, 6, 0, 6), 254)
max_single_size = Decimal(_dec_tuple) # Decimal('8.388607E+261')
print(max_single_size) # Decimal('8.388607E+261')
return d_value < max_single_size
is_single('3.14159')
从十进制导入十进制
def为单(值):
d_值=十进制(值)
_23bit_max_bin='1'*23#'11111111111'
_23bit_max_dec=int(_23bit_max_bin,2)#8388607
_系数=元组([int(d)表示str中的d([u 23bit_max_dec)])#(8,3,8,8,6,0,6)
_指数_bin='1'*8#'11111111'
_指数=int(_指数_bin,2)#255
_dec_tuple=(0,_系数_tuple,_指数_dec)#(1,(8,3,8,8,6,0,6),254)
max_single_size=Decimal(_dec_tuple)#Decimal('8.388607E+261'))
打印(最大单个尺寸)#十进制('8.388607E+261')
返回d_值<最大单个大小
单身('3.14159')
。。。我希望这里可以取系数和指数的最大二进制值,将它们转换为十进制值,然后使用结果创建一个decimal
对象
问题在于,结果值似乎与同一维基百科页面上报告的值相似,即,8.388607E+261
(我的值)与1.1754942107×10不同−38
(维基)
我觉得我好像错过了什么。。。也许现在已经太晚了
阅读资料:
float
中的可表示数字范围为−∞ 到+∞, 所以所有的有限数都在这个范围内。但我想你想考虑<代码>浮点< /代码>类型的有限范围,而不是全范围。
_23bit_max_bin = '1' * 23 # '11111111111111111111111'
_23bit_max_dec = int(_23bit_max_bin, 2) # 8388607
这将为您提供float
编码的有效位字段的最大值,解释为二进制整数。这不是表示的有效位的最大值
假设指数字段既不是全零也不是全1,则表示的有效位是二进制数字为“1”后接“.”后接有效位字段位的数字。因此,最大有效位为1.111111111112=21−2.−二十三,
这将为您提供指数字段的最大值。但是,指数字段的最大值用于编码无穷大和N,而不是有限数。用于有限数的指数字段的最大值为111111102(25410)。此外,表示的指数是指数字段(解释为二进制整数)的值减去127。所以最大指数是254−127=127
_dec_tuple = (0, _coeffient_tuple, _exponent_dec) # (1, (8, 3, 8, 8, 6, 0, 6), 254)
它使用254作为10的指数。float
格式中的指数是2的指数
float
中可表示的最大有限值是最大有效位乘以最大指数幂的2,因此为(21−2.−23) • 2127 = 2128 − 2104 = 340282346638528859811704183484516925440. 让我们打那个号码M
但是,当确定一个十进制数是否有界时,你应该考虑是否考虑:
- 电话号码在−M至+M(含),或
- 该数字在转换为
时的正常四舍五入将产生一个单位为的值的范围内−M到+M,包括在内(即,它不四舍五入到无穷大)float
通常,如果精度为p(有效位字段为p−1位),指数字段有w位,指数偏差为2w−1.−1,最大指数相同,且最大可表示有限值为(2)−21−p) •22瓦−1.−1 = (1−2.−p) •22瓦−1.是34028346638528859811704183484516925440,不是3.4028234664×10^38。埃里克,你能解释一下
2-2^-23
代表什么吗?我理解23是有效位,但我不确定为什么我们要提升到负幂,然后找到2的差异?这是因为周期左边的那个吗?我也由此得出结论,浮点数可以容纳更大的数字,但精确度较低。啊。。。我明白了,那是我引用的维基百科。也许我应该坐下来读一读,直到我完全理解。
_dec_tuple = (0, _coeffient_tuple, _exponent_dec) # (1, (8, 3, 8, 8, 6, 0, 6), 254)