相关疑难解决方法(0)

浮点比较是否连续?如果!(a <= b)是(b> a)保证?

是否保证浮点:

  • (a <= b) 暗示 !(b > a)
  • !(a <= b) 暗示 b > a

我目前正在处理跨语言,但如果需要,你可以假设一个floatdouble一个C,C++或C#.假设没有NaN参与.

我认为IEEE的规则适用于此.我不确定他们的订购规则是否意味着上述内容.

我特别关注的是,a并且b并不总是相同的变量,而是相同的值.它们总是来自完全相同的计算.但是,由于比较是在不同的代码位置完成的,我不能保证它们是否总是存储/截断的形式(最终可能具有扩展的精度).

因为我正在寻找保证,答案应包括提供这些保证的参考,或正式/强烈暗示保证.

floating-point ieee-754

2
推荐指数
1
解决办法
164
查看次数

在C++中查找最接近的浮点值小于特定的整数值?

我的输入浮点值为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?

c++ floating-point floating-accuracy c++11

1
推荐指数
1
解决办法
1691
查看次数

标签 统计

floating-point ×2

c++ ×1

c++11 ×1

floating-accuracy ×1

ieee-754 ×1