IEEE floating point exponents are stored as unsigned integers, using a pre-defined exponent bias to offset the exponent.

指数偏差似乎始终等于numeric_limits<T>::max_exponent - 1,其中T是浮点类型。

我没有任何文档说明这始终是正确的,但是我当然对非IEEE浮点格式也没有任何想法。

对于以下功能,必须知道这一点:

  • frexp
  • ilogb
  • logb

  • c++是否有规范,或者我必须假定numeric_limits<T>::max_exponent - 1吗?

    最佳答案

    C++并未定义偏差,因此您无需使用frexpilogblogb即可知道偏差。这些函数都使用并返回数学指数,而不是有偏指数。 (但是,对于frexp,指数按比例缩放,以使有效数位于[1/2,1)中,而不是IEEE-754的常规[1,2,1]。)1

    仅当您要修改浮点数的内部表示形式时才需要使用偏见,在这种情况下,您的代码取决于实现。 IEEE-754将偏差定义为2k-p-1-1,其中k是以位为单位的存储宽度(例如32或64),而p是以位为单位的精度(数学有效位的位数,例如常见的floatdouble类型为24或53,这比包含有效数字的主要编码的字段的宽度大一)。因此,对于通用的32位格式,偏差为232-24-1-1 = 27-1 =127。C++实现可以使用非IEEE-754格式。

    笔记

    1如果frexpilogb/logb的指数不同,则说它是数学的还是有偏的意味着什么?显然,有一个相对于其测量指数的基点,那么如何使其无偏呢?对于frexpilogblogb,每个函数的结果仅取决于数字的。无论使用floatdouble还是frexp变体,您都将获得相同的结果。仅数学值很重要。相反,当您查看浮点值的内部表示形式时,指数将根据数据的格式而有所不同。 floatdouble具有不同的偏见。

    关于c++ - 有浮点指数偏差的规范吗?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/50118504/

    10-14 09:23