相关疑难解决方法(0)

如何在循环中添加代码使其更快?

我有一个带内循环的简单函数 - 它缩放输入值,在查找表中查找输出值,并将其复制到目标.(ftol_ambient是我从网上复制的一种技巧,用于将float快速转换为int).

for (i = 0;  i < iCount;  ++i)
{
    iScaled = ftol_ambient(*pSource * PRECISION3);
    if (iScaled <= 0)
        *pDestination = 0;
    else if (iScaled >= PRECISION3)
        *pDestination = 255;
    else
    {
        iSRGB = FloatToSRGBTable3[iScaled];
        *pDestination = iSRGB;
    }
    pSource++;
    pDestination++;
}
Run Code Online (Sandbox Code Playgroud)

现在我的查找表是有限的,并且浮点数是无限的,因此有可能出现一个一个错误.我用一些代码创建了一个函数副本来处理这种情况.请注意,唯一的区别是添加了2行代码 - 请忽略丑陋的指针转换.

for (i = 0;  i < iCount;  ++i)
{
    iScaled = ftol_ambient(*pSource * PRECISION3);
    if (iScaled <= 0)
        *pDestination = 0;
    else if (iScaled >= PRECISION3)
        *pDestination = 255;
    else
    {
        iSRGB = …
Run Code Online (Sandbox Code Playgroud)

c++ optimization visual-c++-6 visual-c++

22
推荐指数
2
解决办法
1811
查看次数

使用浮点常数进行设置和检查

我知道这里有很多关于为什么浮点相等比较通常是一个坏主意的问题。我理解浮点表示问题、舍入问题、将浮点无声地提升为双精度、依赖位级别算术的危险等。但在我看来,这应该没问题,而且我发现的任何问题似乎都没有涵盖这一点:

static const float MARKER = -500.0f; // some value well outside the range of valid values
std::vector<float> some_floats = {MARKER, 0.5f, 100.0f, 9.5f, MARKER, 0.f};
for (size_t i = 0; i< some_floats.size(); ++i) {
    if (some_floats[i] == MARKER) {             
       std::cout << i << std::endl;
    } else {
       // do some math
    }
}
Run Code Online (Sandbox Code Playgroud)

输出如预期:

0
4
Run Code Online (Sandbox Code Playgroud)

如果我-Wfloat-equal启用了(在 gcc 中,但在其他编译器中类似),它会将比较行标记为危险: comparing floating point with == or != is unsafe。这里几乎所有的答案都说不要使用 == 或 !=, period。但我不明白为什么这里有问题。我只设置该常量一次,然后在其他使用它的地方重复使用它,并且永远不会对该常量进行任何操作(例如算术)。我错过了什么吗?0.0f即使没有设置为常数,又怎么样?

c++ floating-point

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