【问题标题】:Float modulo operator that includes the upper value包含上限值的浮点取模运算符
【发布时间】:2013-08-30 05:53:20
【问题描述】:

我需要一个没有 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 怎么办?

谢谢

【问题讨论】:

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


    【解决方案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
    

    【讨论】:

      【解决方案2】:
      value = (expression) ? (if true) : (if false);
      

      示例:

      BOOL result = value ? YES : NO; 
      

      【讨论】:

      【解决方案3】:

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

      如果需要这样的转换,请使用标准库中的函数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具有相同的符号。积分 部分存储在iptr指向的位置。

      【讨论】:

      • 感谢您为我提供解决方案的提示。
      猜你喜欢
      • 2021-02-20
      • 1970-01-01
      • 2012-03-19
      • 2011-02-24
      • 2019-01-05
      • 1970-01-01
      • 2020-09-17
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多