包含上限值的浮点模运算符

时间:2013-08-30 05:53:21

标签: ios objective-c c if-statement glsles

我需要一个没有if-else语句的高效glsl代码。 目前算法是这样的:

lowp float a;
if (a > 1.0) 
   a -= 1.0;
else if (a < 0.0) 
   a += 1.0;

它与浮点模运算符类似:

a = mod(a,1.0);

if a == 1,应return 1,而不是0

如果没有if-else,如何做到这一点?

由于

3 个答案:

答案 0 :(得分:1)

value = (expression) ? (if true) : (if false);

示例:

BOOL result = value ? YES : NO; 

答案 1 :(得分:1)

我不明白你的代码与你提到的浮点模运算符的关系。这样的运算符将浮点数转换为整数;你的代码没有。

如果需要进行此类转换,请使用标准库中的函数modff

#include <math.h>
float a, dummy;
...
a = modff(a, &dummy);

如果您不想进行任何此类转换,@ devnull的答案是正确重写您的代码。如果另外你想“包括上限值”,例如有1个映射到1,那么你有点麻烦,因为这将涉及检查浮点数是否是整数。为了便于移植,我建议再次使用modff

<强>概要

float modff(float x, float *iptr);

-lm链接。

<强>描述

modf()函数将参数x分解为一个组成部分和一个 小数部分,每个部分与x具有相同的符号。积分 part存储在iptr指向的位置。

答案 2 :(得分:1)

这是一个可以做你需要的数学表示 - 不使用分支语句

对于[-1,2.0]

之间的输入
a = a + 1 - max(trunc(a), ceil(a))

Input   Output
0.3     0.3
-0.3    0.7
0.7     0.7
1.3     0.3
1.7     0.7
1       1.0