找到最接近的浮点值小于C中的特定整数值?
作者:互联网
我的输入浮点值为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:Alternative to C++11’s std::nextafter and std::nexttoward for C++03?开始了一个新问题
解决方法:
I’m hoping there’s a magic instruction I’m not aware of that I can use to achieve this!
如果你有一个C 11(或C99)标准库,那么来自< cmath>的std :: nextafter(value,0.0f) (或来自< math.h>的nextafter)将为您提供小于值的最大可表示值.
它在第一个参数之后,在第二个参数的方向上给出“下一个”不同的值;所以这里,下一个明显的值接近于零.
标签:c,c11,floating-point,floating-accuracy 来源: https://codeday.me/bug/20191003/1845646.html