2024-05-14 17:26:31 发布
网友
我想了解如何舍入例如一个ieeefloat32与23位一个减少尾数一(即20,19)。 用Python逐步解决是可取的。你知道吗
下面是一个仅使用基本Python和标准math模块的答案。你知道吗
math
from math import frexp, ldexp def roundbits(fval, nbits): """Return the floating-point value `fval` rounded to `nbits` bits in the significand.""" significand, exponent = frexp(fval) scale = 2.0 ** nbits newsignificand = round(significand * scale) / scale return ldexp(newsignificand, exponent)
这是解释。要将值舍入到其浮点表示的有效位中的nbits位,首先获取有效位的位,对其进行缩放,使最高有效位紧跟在小数点之后,其他位紧跟其后。这就是frexp函数的作用。接下来,将该有效位乘以2**nbits,这将把我们想要的位数放在基数点之前,而不想要的位数放在基数点之后。(对于nbits的合理值,缩放值和乘法都将精确地进行。)然后我们将该值四舍五入到最接近的整数,这将删除不需要的位。然后将该值除以2**nbits,将最高有效位移回小数点之后。最后,使用新的有效位和旧的指数生成一个浮点数,这就是ldexp函数所做的。你知道吗
nbits
frexp
2**nbits
ldexp
这个例程保持简单,所以它忽略了一些边缘情况。如果所需的位数是负数、零或大于Python在其浮点值中所能存储的位数,该怎么办?Python通常使用double类型,即对整个浮点数使用64位,对有效位使用53位(显式存储52位),但这并不能保证。我将把错误检查留给你。你知道吗
如果你用
for n in range(1, 52): print(n, roundbits(pi, n))
它使用pi,二进制到53位
pi
11.00100100001111110110101010001000100001011010001100001000110100
结果是
1 4.0 2 3.0 3 3.0 4 3.25 5 3.125 6 3.125 7 3.15625 8 3.140625 9 3.140625 10 3.140625 11 3.140625 12 3.1416015625 13 3.1416015625 14 3.1416015625 15 3.1416015625 16 3.1416015625 17 3.1416015625 18 3.1415863037109375 19 3.1415939331054688 20 3.1415939331054688 21 3.141592025756836 22 3.1415929794311523 23 3.141592502593994 24 3.1415927410125732 25 3.1415926218032837 26 3.1415926814079285 27 3.141592651605606 28 3.141592651605606 29 3.141592651605606 30 3.1415926553308964 31 3.1415926534682512 32 3.1415926534682512 33 3.1415926534682512 34 3.141592653701082 35 3.1415926535846666 36 3.1415926535846666 37 3.1415926535846666 38 3.1415926535846666 39 3.1415926535919425 40 3.1415926535883045 41 3.1415926535901235 42 3.1415926535901235 43 3.1415926535896688 44 3.141592653589896 45 3.1415926535897825 46 3.1415926535897825 47 3.1415926535897825 48 3.1415926535897967 49 3.1415926535897967 50 3.141592653589793 51 3.141592653589793
下面是一个仅使用基本Python和标准
math
模块的答案。你知道吗这是解释。要将值舍入到其浮点表示的有效位中的
nbits
位,首先获取有效位的位,对其进行缩放,使最高有效位紧跟在小数点之后,其他位紧跟其后。这就是frexp
函数的作用。接下来,将该有效位乘以2**nbits
,这将把我们想要的位数放在基数点之前,而不想要的位数放在基数点之后。(对于nbits
的合理值,缩放值和乘法都将精确地进行。)然后我们将该值四舍五入到最接近的整数,这将删除不需要的位。然后将该值除以2**nbits
,将最高有效位移回小数点之后。最后,使用新的有效位和旧的指数生成一个浮点数,这就是ldexp
函数所做的。你知道吗这个例程保持简单,所以它忽略了一些边缘情况。如果所需的位数是负数、零或大于Python在其浮点值中所能存储的位数,该怎么办?Python通常使用double类型,即对整个浮点数使用64位,对有效位使用53位(显式存储52位),但这并不能保证。我将把错误检查留给你。你知道吗
如果你用
它使用
pi
,二进制到53位结果是
相关问题 更多 >
编程相关推荐