Math 将一个浮点数封装在一个没有C++语句的数字系统之间?

Math 将一个浮点数封装在一个没有C++语句的数字系统之间?,math,range,Math,Range,若要在数字系统中包装数字,请将索引与重复集相关联,其中第0个索引始终为0。例如,从0到4的索引集表如下所示 INDEX: 0,1,2,3,4,5,6,7,8,9,10,11,12 RESULT:0,1,2,3,4,0,1,2,3,4,0,1,2,3 你可以看到这类似于一个模数,直到你做了负数,例如,范围-3到3,关系看起来像 INDEX | RESULT -9|-2 -8|-1 -7|0 -6|1 -5|2 -4|3 -3|-3

若要在数字系统中包装数字,请将索引与重复集相关联,其中第0个索引始终为0。例如,从0到4的索引集表如下所示

 INDEX: 0,1,2,3,4,5,6,7,8,9,10,11,12
 RESULT:0,1,2,3,4,0,1,2,3,4,0,1,2,3
你可以看到这类似于一个模数,直到你做了负数,例如,范围-3到3,关系看起来像

INDEX | RESULT
    -9|-2
    -8|-1
    -7|0
    -6|1
    -5|2
    -4|3
    -3|-3
    -2|-2
    -1|-1
     0|0
     1|1
     2|2
     3|3
     4|-3
     5|-2
     6|-1
等等,等等

这也适用于一组小数。 我想写一个函数,它可以为一个范围包装一个浮点,但为了优化它,我不想使用IF语句或循环。我希望有一个数学解决方案,这样处理它是直接的,快速的,而不会中断处理器序列

如何实施这样的制度


任何关于这方面的指导都会很棒

假设我们得到了开放范围a0,a1,其中a00和输入数是x,我将开始试验

x' = ((x/a0) - floor(x/a0))*a0 // negative x
x' = ((x/a1) - floor(x/a1))*a1 // positive x
现在唯一的问题是如何决定在没有分支if语句的情况下使用哪一个。我将使用二进制位操作浮点值的整数表示。符号位为MSB,浮点为32位。因此,首先获取float的符号值,然后将其转换为0或1:

无符号整数*px=无符号整数*&x; 浮点a=unsigned intpx[0]>>31; 注意,unsigned int必须等于或小于相同的位宽,但要使用正确的位移位,即“粗略”而不是“浮点”。我通常使用DWORD来表示这种类型,但并非所有编译器都知道这种类型,它也应该在windows.h btw中定义。现在,只需使用它在两个等式之间进行选择。当我用C++将所有内容组合在一起时:

浮子包装浮子x、浮子a0、浮子a1 { 浮动a; a=x/a0;a0*=a-floora;//x=0 unsigned int*px=unsigned int*&x;//px是x的整数表示形式
a=无符号整数像素[0]>>31;//a=0代表x>=0,a=1代表x欢迎来到Stack Overflow。请花点时间阅读并参考“您可以在这里问什么和如何问”中的资料。谢谢。我以前来过这里,但由于问题接收不好,我倾向于删除我的帐户。必须问有效的问题。我问过,但这些问题通常都很深奥,或者说很简单,所以会被删除Ownvoted好吧,我把你链接到相关材料上阅读。
   x   |    x'
---------------
 -6.25 |  -0.25
 -6.00 |   0.00
 -5.75 |  -2.75
 -5.50 |  -2.50
 -5.25 |  -2.25
 -5.00 |  -2.00
 -4.75 |  -1.75
 -4.50 |  -1.50
 -4.25 |  -1.25
 -4.00 |  -1.00
 -3.75 |  -0.75
 -3.50 |  -0.50
 -3.25 |  -0.25
 -3.00 |   0.00
 -2.75 |  -2.75
 -2.50 |  -2.50
 -2.25 |  -2.25
 -2.00 |  -2.00
 -1.75 |  -1.75
 -1.50 |  -1.50
 -1.25 |  -1.25
 -1.00 |  -1.00
 -0.75 |  -0.75
 -0.50 |  -0.50
 -0.25 |  -0.25
---------------
  0.00 |   0.00
---------------
  0.25 |   0.25
  0.50 |   0.50
  0.75 |   0.75
  1.00 |   1.00
  1.25 |   1.25
  1.50 |   1.50
  1.75 |   1.75
  2.00 |   2.00
  2.25 |   2.25
  2.50 |   2.50
  2.75 |   2.75
  3.00 |   0.00
  3.25 |   0.25
  3.50 |   0.50
  3.75 |   0.75
  4.00 |   1.00
  4.25 |   1.25
  4.50 |   1.50
  4.75 |   1.75
  5.00 |   2.00
  5.25 |   2.25
  5.50 |   2.50
  5.75 |   2.75
  6.00 |   0.00
  6.25 |   0.25