我正在读一本书,作者说这if( a < 901 )比书更快if( a <= 900 ).
与此简单示例不完全相同,但循环复杂代码略有性能变化.我想这必须对生成的机器代码做一些事情,以防它甚至是真的.
是否有一种比使用if语句或三元运算符更有效的方法来钳制实数?我想为双打和32位修复点实现(16.16)做到这一点.我不是要求代码可以处理这两种情况; 它们将在不同的功能中处理.
显然,我可以这样做:
double clampedA;
double a = calculate();
clampedA = a > MY_MAX ? MY_MAX : a;
clampedA = a < MY_MIN ? MY_MIN : a;
Run Code Online (Sandbox Code Playgroud)
要么
double a = calculate();
double clampedA = a;
if(clampedA > MY_MAX)
clampedA = MY_MAX;
else if(clampedA < MY_MIN)
clampedA = MY_MIN;
Run Code Online (Sandbox Code Playgroud)
fixpoint版本将使用函数/宏进行比较.
这是在代码的性能关键部分完成的,所以我正在寻找一种尽可能有效的方法(我怀疑它会涉及位操作)
编辑:它必须是标准/便携式C,平台特定的功能在这里没有任何兴趣.此外,MY_MIN和MY_MAX我想要钳制的值相同(在上面的例子中加倍).
我最近补充说:
#define NOMINMAX
#include <Windows.h>
#include <algorithm>
Run Code Online (Sandbox Code Playgroud)
到我的main.cpp才能使用
std::max( x , x ); // x is just a placeholder and not actual anything
std::min( x , x );
Run Code Online (Sandbox Code Playgroud)
但我不能std::max()/std::min()在其他文件中使用.
error C2589: '(' : illegal token on right side of '::'
error C2059: syntax error : '::'
Run Code Online (Sandbox Code Playgroud)
我试图添加#define NOMINMAX我的其他文件,但失败了.什么是线索?
我问之前环顾四周,但我不明白答案在Visual C++上NOMINMAX可能出现问题
我正在做一些3D图形,我有一个开放的海洋.对于这个海洋,我有一个矩阵代表海洋的特定矩形分段的海洋状态(即波浪高度).其余的海洋是平坦的.我的问题是,我的受控海域,有波浪,位于开阔的平坦海域中间,我的网格边缘的不连续性会造成一些不好的瑕疵.我只为一个分段而不是整个海洋产生波浪的原因是因为我的噪音功能在整个海域计算成本过高(而且我知道最简单的解决方案是使用更便宜的噪声功能,如单纯噪声,但这不是一个选项).
说完我的问题非常简单.如果说我有一个大小为100x40的网格(也称为矩阵又名2d数组),并且我想找到位置120x33的值,我只想取最近的邻居,即100x33.因此,对于任何位于给定范围之外的数字,我希望该数字在给定范围内饱和.C或C++中是否有一个函数可以做到这一点?
编辑:位置参数的类型为float
我知道我可以用一些简单的if语句来做到这一点,但它似乎就像标准库所包含的那样.
我想验证一个数组的所有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) 我的钳位宏有问题,当我的值超过10且我的高超过17时,它停止工作.任何的想法?
#define CLAMP(value, low, high) (((value)<(low))?(low):(((value)>(high))?(high):(value)))
Run Code Online (Sandbox Code Playgroud) 我试图确保int x大于或等于0但小于1080(在这种情况下是屏幕尺寸).
我想出了这个
int x = 123;
x = std::min(std::max(x, 0), 1080);
Run Code Online (Sandbox Code Playgroud)
这看起来很难看.有没有更好的方法来实现这一目标?
我正在优化瓶颈代码:
int sum = ........
sum = (sum >> _bitShift);
if (sum > 32000)
sum = 32000; //if we get an overflow, saturate output
else if (sum < -32000)
sum = -32000; //if we get an underflow, saturate output
short result = static_cast<short>(sum);
Run Code Online (Sandbox Code Playgroud)
我想将饱和条件写为一个"if condition",或者甚至更好,没有"if condition"来使这段代码更快.我不需要精确饱和值为32000,任何类似的值如32768都是可以接受的.
根据此页面,ARM中有一个饱和指令.在x86/x64中有类似的东西吗?
我想知道是否有一些内置的钳位方法可以钳制一个范围之间的值,比如在 (0,1) 之间?
clamp(a) = a if a is in (0,1)
a < 0 a = 0
a > 1 a = 1
Run Code Online (Sandbox Code Playgroud) 我已经编写了一个名为的实用程序nostd::clip,可以x在a floor和a 之间剪切提供的值ceiling:
namespace nostd {
template<class T>
auto clip(T floor, T x, T ceiling) -> T
{
return std::min(ceiling, std::max(floor, x));
}
}
Run Code Online (Sandbox Code Playgroud)
是否有一些功能std可以完成相同的工作,我可以用它代替?也许在C ++ 17中?