C++ C或C+中是否有函数+;“去做”;饱和;关于整数
我正在做一些3D图形,我有一个开阔的海洋。对于这个海洋,我有一个矩阵,表示海洋特定矩形部分的海况(即波高)。海洋的其余部分是平的。我的问题是我的被控制的海,那里有波浪,被定位在开放的平坦海的中间,并且在我的网格边缘的不连续性导致一些坏的工件。我之所以只为一个部分而不是整个海洋生成波,是因为我的噪声函数在整个海洋上的计算成本太高了(我知道最简单的解决方案是使用像单纯形噪声这样更便宜的噪声函数,但这不是一个选项) 话虽如此,我的问题其实相当简单。如果说我有一个大小为100x40的网格(又名矩阵又名2d数组),我想找到位置120x33的值,我只想取最近的邻居,即100x33。所以对于任何一个在给定范围外的数,我希望这个数饱和,在给定范围内。C或C++中有没有这样做的功能?< /P> 编辑:位置参数为float类型 我知道我可以用一些简单的if语句来实现这一点,但它看起来就像是标准库包含的东西。Min和Max noC++ C或C+中是否有函数+;“去做”;饱和;关于整数,c++,c,C++,C,我正在做一些3D图形,我有一个开阔的海洋。对于这个海洋,我有一个矩阵,表示海洋特定矩形部分的海况(即波高)。海洋的其余部分是平的。我的问题是我的被控制的海,那里有波浪,被定位在开放的平坦海的中间,并且在我的网格边缘的不连续性导致一些坏的工件。我之所以只为一个部分而不是整个海洋生成波,是因为我的噪声函数在整个海洋上的计算成本太高了(我知道最简单的解决方案是使用像单纯形噪声这样更便宜的噪声函数,但这不是一个选项) 话虽如此,我的问题其实相当简单。如果说我有一个大小为100x40的网格(又名矩阵又名2
x = std::min(100,x);
y = std::min(40,y);
模板
T饱和(T值、T最小值、T最大值){
返回标准::min(标准::max(val,min),max);
}
(编程语言-C-支持嵌入式处理器的扩展)为饱和数据类型指定一个类型限定符。我从未尝试在任何编译器中使用它,但它包含在
VC++2003及以后版本支持饱和算法。或者如果您喜欢复杂的定义
#define DERIVE_MAX (100)
//Saturate X at +/-DERIVE_MAX
#define SAT(x) ( ((x) > DERIVE_MAX) ? DERIVE_MAX : ( (-(x) > DERIVE_MAX) ? (-DERIVE_MAX) : (x) ) )
现在有了,形式是。我只晚了七年:)有支持饱和的SSE指令。这需要在汇编中编码吗?我还可以指定范围吗?还是说它只是饱和到原始数据类型的范围?我认为任何现代机器都应该能够毫无困难地完成整个sea。我的软件()是这样做的,尽管它在本质上有些不同,它试图真实地模拟物理。@david:他们可以,他们确实这样做了,但我通过一些MATLAB代码获得了网络中的海洋光谱,ATM没有编译,所以运行速度比本机C慢大约100倍,在MATLAB中,对于整个海洋来说,这更难实时完成。如果您对如何在MATLAB中使用38个叠加的正弦函数实时快速(200Hz)计算具有1k个数据点的网格有任何想法,我很乐意听到。@codenoob最明显的技巧是只计算t0处的触发函数,然后计算t1、t2等。使用加法公式。这样,您只需执行FP multiply/add,而不执行trig。这是根据默认条件运算符if实现的。如果val已在基本类型T.MMX intrinsics链接的/overflow下受到影响,则将不起作用dead@EricJohnson:这并不奇怪,因为这篇文章已经超过6年了。我不打算维护超过2000个答案张贴链接!提供了搜索MSDN或Google所需的关键术语。VS2010和VS2015的归档文档—尽管不再进行很好的分类。我也想象在2017年。
\u Sat\u acum
/\u Sat\u Fract
gcc不支持x86、ARM、ARM64或AVR的定点类型:(我没有在Godbolt上尝试任何其他ISA,但我假设MIPS/PowerPC/RISC-V也没有gcc支持。没有说明它们支持哪些目标。哦,clang使用-ffixed point
)支持它们!但是对于x86,它只做加法,没有实际饱和,只是包装。。但是对于RISC-V,有很多指导能做某事的名词(?)
#define DERIVE_MAX (100)
//Saturate X at +/-DERIVE_MAX
#define SAT(x) ( ((x) > DERIVE_MAX) ? DERIVE_MAX : ( (-(x) > DERIVE_MAX) ? (-DERIVE_MAX) : (x) ) )