其他分享
首页 > 其他分享> > 找到最接近的浮点值小于C中的特定整数值?

找到最接近的浮点值小于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