【问题标题】:Convert float to int and limit it to -1 <-> 1将 float 转换为 int 并将其限制为 -1 <-> 1
【发布时间】:2014-03-28 15:48:25
【问题描述】:

听起来很简单,但我需要一种方法来将 int 限制在这个范围内而不会溢出。 或将其限制为 0 - 1 对于所有可能的浮点输入值。没有比较。

限制浮动也是可以接受的,但要快。

更新:找到范围 0 - 1 的解决方案

int i = (int)f;
i = (((i + (i-1))%2)+1)/2;  

无需对措辞不佳的问题投反对票。
不知道它将如何在该范围的上半部分附近发挥作用。

【问题讨论】:

  • float f; int i; ... i = (int)f; if(i &lt; -1 || i &gt; 1) printf("Error");
  • 或者“我们不知道你想要什么”
  • 为什么是位操作标签?
  • 帖子不清楚0.0和1.0之间的值是否会变成0、1或两者之一。

标签: c integer


【解决方案1】:

这将值限制为 0-1

float f;
int i = (f>=1);

如果你想从集合 {-1,0,1} 中得到结果,试试

float f;
int i = (f>=1)-(f<=1);

如果要进行某种舍入,可以切换到其他阈值

【讨论】:

  • 没有比较语句
  • 为什么没有比较?比较便宜,这是免费的
  • 如果你不想比较,你需要这个:i=((-!!((*(int*)&amp;(f))&amp;(-1UL&gt;&gt;1)))&amp;(-((*(int*)&amp;(f))&gt;&gt;(sizeof(int)*CHAR_BIT-1))))|(!!(*(int*)&amp;(f))&amp;(-1UL&gt;&gt;1))
  • 我猜是因为它是 A) 作业 b) 过去的论文或 c) 面试问题的 1 个或多个
  • 好吧,我可以说我们在工作中一直这样做,而且比提取符号位或做其他废话要快得多
猜你喜欢
  • 1970-01-01
  • 2013-07-14
  • 1970-01-01
  • 2018-05-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-05-05
相关资源
最近更新 更多