相关疑难解决方法(0)

如何以最小增量(或接近它)改变浮点数?

我有一个double价值f,并想要一个稍微大一点(或更小)的方法来获得一个新的值,该值尽可能接近原始值但仍严格大于(或小于)原始值.

它不必靠近最后一位 - 更重要的是,我所做的任何改变都能保证产生不同的值,而不是回到原始值.

c c++ floating-point

47
推荐指数
3
解决办法
7691
查看次数

生成下一个最大或最小可表示的浮点数而不会产生比特错误

给定一个任意有限的浮点数,有没有办法确定下一个可表示的浮点数?例如,给定1.0f,根据定义,下一个最大可表示的数字是1.0f + std :: numeric_limits <float> :: epsilon().有没有一种方法可以合成任何值的epsilon - 而不仅仅是1.0f - 而不需要依赖于对机器如何表示浮点值的位置和/或显式知识?

c++ floating-point

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

15
推荐指数
2
解决办法
4952
查看次数

C++ next float with numeric_limits/epsilon?

考虑一个"正常"的实数,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)

非常感谢你.

c++ floating-point limits epsilon

4
推荐指数
2
解决办法
1729
查看次数

使用 C 查找下一个 IEEE 754 可表示数(朝向 -INF)?

我正在尝试编写一个函数,该函数接受一个 32 位浮点数(已从 32 位二进制字符串转换而来)并以 32 位二进制返回先前可表示的浮点数。到目前为止,我已经从二进制转换为向下浮动,但是我在理解如何找到下一个可表示的 IEEE 754 值时遇到了麻烦。你不能只减去可能的最小可表示值(000 0000 0000 0000 0000 0001)吗?另外,在找到最接近的可表示二进制值之前从 IEEE 754 转换为 Float 有什么好处(如果有的话)?

到目前为止,我只有一个将浮点数转换为简单精度 32 位二进制的函数。我会包括我的代码,但这是给学校的,所以我觉得把它放在网上/获得明确的更正和建议是不确定的。

c floating-point representation ieee-754 floating-point-precision

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

在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
查看次数