Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/127.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 如何解决数值限制定义不一致的问题<;T>;::min()?_C++_Standard Library - Fatal编程技术网

C++ 如何解决数值限制定义不一致的问题<;T>;::min()?

C++ 如何解决数值限制定义不一致的问题<;T>;::min()?,c++,standard-library,C++,Standard Library,数字限制特征应该是获取各种类型信息的一种通用方法,以便能够执行以下操作 template<typename T> T min(const std::vector<T>& vect) { T val = std::numeric_limits<T>::min(); for(int i=0 ; i<vect.size() ; i++) val = max(T, vect[i]); return val; }

数字限制特征应该是获取各种类型信息的一种通用方法,以便能够执行以下操作

template<typename T>
T min(const std::vector<T>& vect)
{
    T val = std::numeric_limits<T>::min();

    for(int i=0 ; i<vect.size() ; i++)
        val = max(T, vect[i]);

    return val;
}
模板
最小温度(常数标准::向量和向量)
{
T val=std::numeric_limits::min();
对于(int i=0;i而言,解决方法是

double val = -std::numeric_limits<double>::max();
double val=-std::numeric_limits::max();

当然,这并不能解释numerics_limits::min()的奇怪行为,这可能是因为整数有不同的最小/最大边界(min=-2^n,max=2^n-1)但不适用于双精度。

您可以使用Boost库。库数值转换提供了一个称为bounds的类,可以一致使用

参见文档。

min()的行为并不奇怪,它返回
FLT\u min
DBL\u min
INT\u min
(或它们各自的值),取决于您的专业类型。因此,您的问题应该是为什么
FLT\u MIN
DBL\u MIN
的定义与
INT\u MIN
不同

不幸的是,我不知道后一个问题的答案

我的怀疑是,它的定义是出于实际目的。对于整数,您通常关心溢出/下溢,其中最小值和最大值成为关注点


对于浮点数,存在一种不同的下溢,即计算可能会导致大于零的值,但小于该浮点数类型的最小可表示小数。了解最小可表示浮点数可以解决此问题。另请参阅Wikipedia文章le关于数字。

空向量的最小值的定义是有争议的。如果向量为空,则没有最小元素

您更愿意使用:

intmain()
{
std::向量v;
std::generate_n(std::back_inserter(v),1000,std::rand);
std::vector::iterator it=std::min_元素(v.begin(),v.end());
如果(it==v.end())
{

我不确定其基本原理,但这是预期行为。好吧,从某种意义上说,这就是约瑟蒂斯(大概是标准)对它的描述

最小值():“最小有限值(最小值 浮点的标准化值 具有非规范化的类型

尽我所能,如果类型不是整数(
numeric\u limits::is\u integer
)并且具有非规范化(
numeric\u limits::has\u denorm
min()
将返回该类型可表示的最小值。否则,它将返回最小值,可能为负值

要获得更一致的接口,请查看库。特别是。下面是一个代码片段:

cout << "lowest float:" << boost::numeric::bounds<float>::lowest();
cout << "lowest int:  " << boost::numeric::bounds<int>::lowest();
我经常发现,当我需要boost::numeric/conversion或boost::integer中的一种时,我需要两者。

numeric\u limits::min
返回了最低的负数,所有浮点数类型,当我用Sun CC&g++尝试时,返回了最小的正数

我想这是因为“最小值”和“最小值”对浮点数的含义不同,不过有点奇怪

Sun CC和g++都产生相同的结果:

短路:最小值:-32768最大值:32767

内部:最小值:-2147483648最大值:2147483647

无符号整数:最小值:0最大值:4294967295

长:最小值:-2147483648最大值:2147483647

浮动:最小值:1.17549e-38最大值: 3.40282e+38

双:最小值:2.22507e-308最大值: 1.79769e+308

长双精度:最小值:3.3621e-4932最大值: 1.18973e+4932

无符号短路:最小值:0最大值:65535

无符号整数:最小值:0最大值:4294967295

无符号长:最小值:0最大值:429496729

模板
void showMinMax()
{

cout这是一个旧线程,但有一个更新的答案:

C++11在
std::numeric_limits
()


因此,您现在可以调用std::numeric\u limits::lowest()
以获取可表示的最小负值。

是std::numeric\u limits::max()==-std::numeric\u limits::min()?我不这么认为-正如我所写的,我认为对于32位数据类型,min=-2^31,max=2^31-1。这表示最大的负/正int值-gcc证实了这一点:“min:-2147483648,max:2147483647”不,我的代码是double,而不是int。对于double类型,行为不同(min给出最小的正双倍值)-这是OP的问题所在。因此,获得最大负值(预期的min行为)的解决方法是该代码。当然,这不适用于所有类型或模板,仅适用于特殊的双类型情况。Boost bounds(1.38)是关于最低
的:“返回最小有限值,当T是整数类型时,它相当于numeric_limits::min(),当T是浮点类型时,它相当于-numeric_limits::max()。”奇怪的是,numeric_limits::min在这里返回一个非常小的正数(g++3.4.5)。这可能取决于版本/OS/Implementation。您的示例中有两个错误。1.函数应称为max(),因为它计算最大元素。2.行“val=max(T,vect[i])”应为“val=max(val,vect[i])”。
cout << "lowest float:" << boost::numeric::bounds<float>::lowest();
cout << "lowest int:  " << boost::numeric::bounds<int>::lowest();
boost::uint_t<20>::fast fastest20bits; // fastest unsigned integer that 
                                       // can hold at least 20 bits.
boost::int_max_value_t<100000>::least  // smallest integer that can store
                                       // the value 100000.
template<typename T>
void showMinMax()
{
    cout << "min: " << numeric_limits<T>::min() << endl;
    cout << "max: " << numeric_limits<T>::max() << endl;
    cout << endl;
}

int main()
{
cout << "short:";
showMinMax<short>()
...etc...etc..