相关疑难解决方法(0)

剪辑数字最有效/优雅的方式?

给定一个实数(n),这个实数可以是(上)的最大值,这个实数可以是(更低)的最小值,我们怎样才能最有效地剪切n,使它保持在低位和高位之间?

当然,使用一堆if语句可以做到这一点,但那很无聊!更紧凑,优雅/有趣的解决方案呢?

我自己的快速尝试(C/C++):

float clip( float n, float lower, float upper )
{
    n = ( n > lower ) * n + !( n > lower ) * lower;
    return ( n < upper ) * n + !( n < upper ) * upper;
}
Run Code Online (Sandbox Code Playgroud)

我确信还有其他更好的方法可以做到这一点,这就是为什么我把它放在那里......!

c++ algorithm math logic

47
推荐指数
7
解决办法
6万
查看次数

将值转换为c ++范围内的值,使用boost或std进行优化

我想验证一个数组的所有elemnent.如果元素低于某个值,则按最小值进行交换,如果该值高于某个值,则按最大值进行交换.

但我不知道如何优化它.为了做到这一点,我逐个元素,逐个元素,但它没有优化,它在非常大的数组中花费了大量的CPU时间.

这是我的代码示例:

#include <iostream> 
#include <math.h>
const int MAX = 10;
int main ()
{
    float minVal = 2.0;
    float maxVal = 11.0;

    float vElem[] = {-111111.0/0.0, 10.0, 90.0, 8.0, -7.0,
                    -0.6, 5.0, 4.0, 33.0, 222222222.0/0};

    for(int i=0; i<MAX; i++){
            if(isinf(vElem[i])==-1 || vElem[i]<minVal) vElem[i] = minVal;
            if(isinf(vElem[i])==1 || vElem[i]>maxVal || isnan(vElem[i])) vElem[i] = maxVal;

            std::cout << vElem[i]<< std::endl;
    }
}
Run Code Online (Sandbox Code Playgroud)

c++ optimization boost std

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

x86装配 - 夹紧rax优化到[0 ..极限)

我正在编写一个简单的汇编程序,当然,它的目的是尽可能快.但是,位于最嵌套循环中的某个部分看起来并不"正确",我相信有可能提出更聪明,更快速的实现,甚至可能不使用条件跳转.代码实现了一个简单的事情:

if rax < 0 then rax := 0 else if rax >= r12 then rax := r12 - 1

这是我天真的实施:

cmp rax, 0
jge offsetXGE
   mov rax, 0
   jmp offsetXReady
offsetXGE:
   cmp rax, r12
   jl offsetXReady
   mov rax, r12
   dec rax
offsetXReady:
Run Code Online (Sandbox Code Playgroud)

任何想法都是受欢迎的,即使是那些使用MMX和一些掩盖技巧的想法.

编辑:回答评论中的一些问题 - 是的,我们可以假设r12> 0但rax可能是负数.

optimization x86 assembly nasm

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

将整数限制为边界

我试图确保int x大于或等于0但小于1080(在这种情况下是屏幕尺寸).

我想出了这个

int x = 123;
x = std::min(std::max(x, 0), 1080);
Run Code Online (Sandbox Code Playgroud)

这看起来很难看.有没有更好的方法来实现这一目标?

c++ max min clamp

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

标签 统计

c++ ×3

optimization ×2

algorithm ×1

assembly ×1

boost ×1

clamp ×1

logic ×1

math ×1

max ×1

min ×1

nasm ×1

std ×1

x86 ×1