我有一个输入浮点值,它是 0.0f <= value < 1.0f(注意小于一)。
当将此值乘以更大的范围时,浮点精度自然会降低,这意味着该值可能会超出等效范围。
例如,如果我从以下值开始:
0.99999983534521f
然后乘以 100,我得到:
100.000000000000f
这很好,但是我如何将浮点表示减少为仍然小于 100 的最接近的浮点值?
我发现了这个小技巧:
union test
{
int integer;
float floating;
};
test value;
value.floating = 1.0f;
printf("%x\n", value.integer);
然后我取那个十六进制值并将它减少一个十六进制数字,然后像这样明确地设置它:
unsigned int almost_one = 0x3f7fffff;
float value = 1.0f;
if (value >= 1.0f) std::memcpy(&value, &almost_one, sizeof(float));
这对于这个特定值很有效,但是我可以使用更通用的方法吗?
我希望有一个我不知道的魔法指令可以用来实现这一目标!
编辑:这里有一组很棒的答案,std::nextafter 看起来就像我所追求的。不幸的是,我还不能使用 C++11 数学库,所以这对我不起作用。为了避免复杂的事情,我将用 C++11 标记这个问题,并在下面接受 Mike 的回答。
我为 C++03 提出了一个新问题:C++11 的 std::nextafter 和 C++03 的 std::nexttoward 的替代方案?