我有一个double价值f,并想要一个稍微大一点(或更小)的方法来获得一个新的值,该值尽可能接近原始值但仍严格大于(或小于)原始值.
它不必靠近最后一位 - 更重要的是,我所做的任何改变都能保证产生不同的值,而不是回到原始值.
给定一个任意有限的浮点数,有没有办法确定下一个可表示的浮点数?例如,给定1.0f,根据定义,下一个最大可表示的数字是1.0f + std :: numeric_limits <float> :: epsilon().有没有一种方法可以合成任何值的epsilon - 而不仅仅是1.0f - 而不需要依赖于对机器如何表示浮点值的位置和/或显式知识?
标题是不言自明的,输入给出双倍值,我想添加/减少可能的最小量.
考虑一个"正常"的实数,TREAL x在C++(不低于正常,而不是为NaN /无限)(TREAL= float,double,long double)
是很好的解决方案下面找到一个和下一个x从一个浮点点?
TREAL xprev = (((TREAL)(1.)) - std::numeric_limits<TREAL>::epsilon()) * x;
TREAL xnext = (((TREAL)(1.)) + std::numeric_limits<TREAL>::epsilon()) * x;
Run Code Online (Sandbox Code Playgroud)
非常感谢你.
我正在尝试编写一个函数,该函数接受一个 32 位浮点数(已从 32 位二进制字符串转换而来)并以 32 位二进制返回先前可表示的浮点数。到目前为止,我已经从二进制转换为向下浮动,但是我在理解如何找到下一个可表示的 IEEE 754 值时遇到了麻烦。你不能只减去可能的最小可表示值(000 0000 0000 0000 0000 0001)吗?另外,在找到最接近的可表示二进制值之前从 IEEE 754 转换为 Float 有什么好处(如果有的话)?
到目前为止,我只有一个将浮点数转换为简单精度 32 位二进制的函数。我会包括我的代码,但这是给学校的,所以我觉得把它放在网上/获得明确的更正和建议是不确定的。
c floating-point representation ieee-754 floating-point-precision
我的输入浮点值为0.0f <=值<1.0f(注意小于1).
当将该值乘以更大的范围时,浮点精度自然会降低,这意味着该值可能会超出等效范围.
例如,如果我开始使用如下值:
0.99999983534521f
然后将它乘以100,我得到:
100.000000000000f
哪个没问题,但是如何将浮点表示减少到最接近的浮点值仍然小于100?
我发现了这个小手工技巧:
union test
{
int integer;
float floating;
};
test value;
value.floating = 1.0f;
printf("%x\n", value.integer);
Run Code Online (Sandbox Code Playgroud)
然后我取出那个十六进制值并将其减少一个十六进制数字,然后明确地设置它:
unsigned int almost_one = 0x3f7fffff;
float value = 1.0f;
if (value >= 1.0f) std::memcpy(&value, &almost_one, sizeof(float));
Run Code Online (Sandbox Code Playgroud)
这适用于这个特定的值,但是我可以使用更通用的方法吗?
我希望有一个神奇的指令,我不知道我可以用它来实现这个目标!
编辑:这里有很多答案,std :: nextafter看起来就像我追求的那样.不幸的是我还不能使用C++ 11数学库,所以这对我不起作用.为了节省复杂的事情,我将用C++ 11标记这个问题并接受Mike的答案.
我已经为C++ 03开始了一个新问题:替代C++ 11的std :: nextafter和std :: nexttoward for C++ 03?