如何对浮点数设置绝对最大或最小值?我想通过迭代并捕获最大值来查找数组的最大/最小值。
浮点数还有正无穷和负无穷,我应该使用它们吗?如果是这样,我在代码中如何表示?
注:- "hard code" 可以翻译为“硬编码”或“直接写入代码”,根据语境选择合适的翻译。 - "array" 可以翻译为“数组”。
如何对浮点数设置绝对最大或最小值?我想通过迭代并捕获最大值来查找数组的最大/最小值。
浮点数还有正无穷和负无穷,我应该使用它们吗?如果是这样,我在代码中如何表示?
注:<limits>
中定义的std::numeric_limits
来查找类型的最小值或最大值(只要该类型存在特化)。你也可以使用它来检索无穷大(并在负无穷大前面放置一个-
)。#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>
中),这些函数可以更好地用于查找数组中的最大或最小值。
-FLT_MAX
(或-DBL_MAX
)表示最大幅度的负数,使用FLT_MAX
(或DBL_MAX
)表示正数。这为您提供了可能的浮点(或双精度)值的范围。FLT_MIN
,因为它对应于可以用浮点表示的最小幅度的正数,而不是可表示为浮点数中最小的负数值。
FLT_MIN
和FLT_MAX
分别对应于std::numeric_limits<float>::min()
和std::numeric_limits<float>::max()
。FLT_MIN
]对应于可以用浮点数表示的最小幅度正数,但这是不正确的。它是最小的正常数字。还有次正常数。" - nibotFLT_TRUE_MIN
来获得实际上最小的浮点数,它对应于std::numeric_limits<float>::denorm_min()
。 - Chris DoddFLT_MAX
的值是否根据平台而变化? - lpares12没有必要将数组初始化为最小或最大值来查找其中的最小或最大值:
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;
}
提供示例代码的缺点在于——我看到其他人已经提出了同样的想法。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。
std::numeric_limits<T>::max()
,将您的最大值初始化为std::numeric_limits<T>::min()
肯定是一个合理的选择。 - Jerry Coffin要手动查找数组的最小值,您无需知道浮点数的最小值:
float myFloats[];
...
float minimum = myFloats[0];
for (int i = 0; i < myFloatsSize; ++i)
{
if (myFloats[i] < minimum)
{
minimum = myFloats[i];
}
}
同样的代码也适用于最大值。
我建议您将“最大和最小值”变量初始化为数组中的第一个数字,而不是无穷大。
numeric_limits<T>::lowest()
函数,它返回该类型可能的最小(负)值,以解决这个问题。 - Cornstalksstd::numeric_limits<float>::min()
不是可以表示的最小正数值;它是可以表示的最小规范化单精度浮点数。0和这个数字之间还有次规范化数字。特别地,std::numeric_limits<float>::min()
的值为1.17549e-38
,但可以表示的最小次规范化浮点数是nextafterf(0.0f, 1.0f) == 1.4013e-45f
。 - nibot