是否保证浮点:
(a <= b) 暗示 !(b > a)!(a <= b) 暗示 b > a我目前正在处理跨语言,但如果需要,你可以假设一个float或double一个C,C++或C#.假设没有NaN参与.
我认为IEEE的规则适用于此.我不确定他们的订购规则是否意味着上述内容.
我特别关注的是,a并且b并不总是相同的变量,而是相同的值.它们总是来自完全相同的计算.但是,由于比较是在不同的代码位置完成的,我不能保证它们是否总是存储/截断的形式(最终可能具有扩展的精度).
因为我正在寻找保证,答案应包括提供这些保证的参考,或正式/强烈暗示保证.
我的输入浮点值为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?