numpy float8、float16、float32、float64和float128可以包含多少位数字?

xa9qqrwz  于 2023-05-17  发布在  其他
关注(0)|答案(2)|浏览(392)

Numpy's dtype documentation只为每个浮点类型显示“x 位指数,y 位尾数”,但我不能准确地将其转换为小数点前后的数字。有没有简单的公式/表格可以查到这个?

l7mqbcuq

l7mqbcuq1#

这并不像通常预期的那么简单。对于尾数的准确性,通常有两个值:
1.给定一个十进制表示的值,如果从十进制转换为所选的二进制格式并返回(默认舍入),可以保证保留多少位十进制数字。
1.给定一个二进制格式的值,如果将值转换为十进制格式并转换回原始二进制格式(同样,使用默认舍入)以使原始值保持不变,则需要多少个十进制数字。
在这两种情况下,十进制表示被视为独立于所使用的指数,没有前导和尾随零(例如,0.0123e4、1.23e2、1.2300e2、123、123.0、123000.000e-3都是3位数)。
对于32位二进制浮点数,这两个大小分别为6和9个十进制数字。在C中<float.h>,它们是FLT_DIG和FLT_DECIMAL_DIG。(奇怪的是32位float在大多数数字中保留了7位十进制数字,但也有例外。)在C++中,分别查看std::numeric_limits::digits 10和std::numeric_limits::max_digits10。
对于64位二进制浮点数,它们分别是15和17(DBL_DIG和DBL_DECIMAL_DIG;和std::numeric_limits::{digits10,max_digits10})。
它们的通式(thx2@MarkDickinson)

  • ${format}_DIG(digits10):floor((p-1)*log10(2))
  • ${format}_DECIMAL_DIG(max_digits10):ceil(1+p*log10(2))

其中p是尾数中的位数(包括标准化IEEE 754情况下的隐藏位数)。
另外,在C++ numeric limits页面上有一些数学解释的注解:
标准的32位IEEE 754浮点类型有一个24位小数部分(23位写入,一位隐含),这可能表明它可以表示7位小数(24 * std::log 10(2)为7.22),但相对舍入误差是不均匀的,一些具有7位小数位的浮点值无法转换为32位浮点数并返回:最小的正例是8.589973e9,在往返之后变为8.589974e9。这些舍入误差在表示中不能超过一位,digits 10的计算公式为(24-1)*std::log 10(2),即6.92。向下舍入得到值6。
在注解中查找16位和128位浮点数的值(但请参阅下面的真实的128位浮点数)。
对于指数,这更简单,因为每个边界值(最小归一化,最小反归一化,最大表示)都是精确的,并且可以容易地获得和打印。
@PaulPanzer建议使用numpy. finfo。它给出这些值中的第一个({format}_DIG);也许这就是你要找的东西:

>>> numpy.finfo(numpy.float16).precision
3
>>> numpy.finfo(numpy.float32).precision
6
>>> numpy.finfo(numpy.float64).precision
15
>>> numpy.finfo(numpy.float128).precision
18

但是,在大多数系统上(我的系统是x86-84上的Ubuntu 18.04),float 128的值令人困惑;它实际上是用于具有64位有效数80位x86“扩展”浮点数;真实的IEEE 754 float 128有112个有效位,所以real值应该在33左右,但是numpy在这个名字下提供了另一种类型。详情请参见here:一般来说,float 128是numpy一种错觉。
UPD 3:你提到了float8-在IEEE 754集中没有这样的类型。人们可以想象这种类型用于一些完全特定的目的,但它的范围对于任何普遍的用途来说都太窄了。

tjjdgumg

tjjdgumg2#

为了保持简单。

  • 通常,随着数值大小的增加或减少,精度的小数位数会减少 *

一般来说

Data-Type | Precision
----------------------
float16   | 3 to 4
float32   | 6 to 9
float64   | 15 to 17
float128  | 18 to 34
  • 如果你明白了别忘了给答案投赞成票 *
    按位属性:

float16:1个符号位,5个指数位,10位有效数(小数部分)。
float32:1个符号位、8个指数位和23位有效数(小数部分)。
float64:1个符号位、11个指数位和52个分数位。
float128:1个符号位、15个指数位和112个分数位。

相关问题