浮点数和最大值的数值限制

时间:2017-02-23 02:10:32

标签: c++

在真实情况下,c ++ std::numeric_limits<float>::lowest() 等于std::numeric_limits<float>::max()否定

1 个答案:

答案 0 :(得分:2)

如果浮点表示使用signed magnitude,则

std::numeric_limits<float>::lowest()将等于std::numeric_limits<float>::max()的负数,因为最大值和最小值将具有相同的有效数(忽略符号位)和指数,两者都包含其最大值。然后,符号位将确定该数字是正数还是负数,并且不会影响其大小。 (另一个观点是,底层表示将能够表示正零和负零。)IEEE 754使用带符号的幅度表示,因此这是您在实践中最有可能遇到的情况。

但是,替代表示是使用two's complement有效数字。二进制补码的一个性质是最大负值的值大于最大正值,因此对于使用二进制补码有效数的浮点表示,std::numeric_limits<float>::lowest()等于std::numeric_limits<float>::max()的负数。使用二进制补码有效位和浮点格式的实际系统的一个例子是大约1970年的IBM 1130

现在,cppreference.com确实声明了:

  

虽然对于基本的C ++浮动类型不适用,但可能存在第三方浮点类型T std::numeric_limits<T>::lowest() != -std::numeric_limits<T>::max()

但我不确定该声明的基础是什么,因为C ++ 11标准第18.3.2.4段仅指明lowest()是:

  

有限值x,使得y中没有其他有限值y < x

     

对于is_bounded != false

的所有专精都有意义

它还在脚注中注明:

  

lowest()是必要的,因为并非所有浮点表示都具有最小(最负)的值   最大(最正)有限值的负值。

因此,似乎C ++实现可以使用双补码浮点表示,并且std::numeric_limits<float>::lowest()不等于std::numeric_limits<float>::max()的负数。