在真实情况下,c ++ std::numeric_limits<float>::lowest()
不等于std::numeric_limits<float>::max()
的否定?
答案 0 :(得分:2)
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()
的负数。