我如何初始化一个浮点数的最大/最小值?

我如何硬编码一个浮点数或双精度的绝对最大值或最小值? 我想通过迭代和捕获最大值来search数组的最大/最小值。

花车也有积极和消极的无限,我应该使用这些呢? 如果是这样,我怎么表示在我的代码?

您可以使用<limits>定义的std::numeric_limits来查找types的最小值或最大值(只要该types存在专门化)。 你也可以用它来检索无穷大(把负无穷大放在前面)。

 #include <limits> //... std::numeric_limits<float>::max(); std::numeric_limits<float>::min(); std::numeric_limits<float>::infinity(); 

如注释中所述, min()返回可能的最低正值。 换句话说,可以表示的最接近于0的正值。 可能的最低值是最大可能值的负值。

当然, std::max_element和min_element函数(在<algorithm>定义)可能是find数组中最大或最小值的更好select。

您可以使用-FLT_MAX (或-DBL_MAX )作为最大幅度负数, FLT_MAX (或DBL_MAX )作为正数。 这给你可能的float(或double)值的范围。

你可能不想使用FLT_MIN ; 它对应于可以用浮点数表示的最小幅度正数,而不是用浮点数表示的最负数值。

FLT_MINFLT_MAX对应于std::numeric_limits<float>::min()std::numeric_limits<float>::max()

没有真正的需要初始化到最小/最大可能findarrays中的最小/最大:

 double largest = smallest = array[0]; for (int i=1; i<array_size; i++) { if (array[i] < smallest) smallest = array[i]; if (array[i] > largest0 largest= array[i]; } 

或者,如果你不止一次地这样做:

 #include <utility> template <class iter> std::pair<typename iter::value_type, typename iter::value_type> find_extrema(iter begin, iter end) { std::pair<typename iter::value_type, typename iter::value_type> ret; ret.first = ret.second = *begin; while (++begin != end) { if (*begin < ret.first) ret.first = *begin; if (*begin > ret.second) ret.second = *begin; } return ret; } 

提供示例代码的缺点 – 我看到其他人已经提出了相同的想法。

请注意,虽然标准有一个min_element和max_element,使用这些将需要扫描数据两次,这可能是一个问题,如果数组是大的。 最近的标准已经通过添加一个std::minmax_element解决这个std::minmax_element ,它和上面的find_extrema一样(在一次传递中查找集合中的最小和最大元素)。

编辑:解决在无符号数组中find最小非零值的问题:当无符号值达到极限时观察无符号值“环绕”。 要find最小的非零值,我们可以从中减去一个来比较。 任何零值将“绕回”到该types的最大可能值,但其他值之间的关系将被保留。 完成之后,我们显然会将其添加到我们find的值。

 unsigned int min_nonzero(std::vector<unsigned int> const &values) { if (vector.size() == 0) return 0; unsigned int temp = values[0]-1; for (int i=1; i<values.size(); i++) if (values[i]-1 < temp) temp = values[i]-1; return temp+1; } 

注意这仍然使用第一个元素作为初始值,但是我们仍然不需要任何“特殊情况”代码 – 因为这将代表最大的可能值,任何非零值都会比较小。 结果将是最小的非零值,或者当且仅当该向量不包含非零值时为0。

要手动查找数组的最小值,您不需要知道float的最小值:

 float myFloats[]; ... float minimum = myFloats[0]; for (int i = 0; i < myFloatsSize; ++i) { if (myFloats[i] < minimum) { minimum = myFloats[i]; } } 

和最大值类似的代码。

我可以build议你初始化“到目前为止的最大和最小”variables不是无穷大,而是数组中的第一个数字?