Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/python-3.x/15.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 3.x 创建有符号32位浮点最大值十进制的编程方法(Python3) 问题陈述和背景_Python 3.x_Floating Point_Decimal - Fatal编程技术网

Python 3.x 创建有符号32位浮点最大值十进制的编程方法(Python3) 问题陈述和背景

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(

我正在编写一个函数,它是一个包含单个浮点值的字符串,例如“3.14159”

我想做的是评估这个浮点数是否在有符号32位浮点数的边界内(也是64位的,但现在让我们先忘掉它)

由于浮点精度问题,我想使用
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
(维基)

我觉得我好像错过了什么。。。也许现在已经太晚了

阅读资料:

实际上是:3.4028234664×10^38

请尝试查找以下数字:

2^128= 340282366920938463463374607431768211456

10^38= 1000000000000000000000000

…有符号32位浮点的边界

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(含),或
  • 该数字在转换为
    float
    时的正常四舍五入将产生一个单位为的值的范围内−M到+M,包括在内(即,它不四舍五入到无穷大)
在后一种情况下,在“四舍五入到最近”模式中,您想要的限制是2128− 2104 + 2103 = 2128 − 2103=340282357973736616375395458142568448,独家。如果指数范围保持不变,那么下一个可表示数字的“半步”,即2103,是舍入到最近值方法在向下舍入和向上舍入之间变化的地方。如果恰好在该点上出现平局,它将舍入具有偶数有效位的数字,该位将向上。因此,您希望排除它,因此间隔是独占的,而不是包含的


通常,如果精度为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)