【问题标题】:Function to scale float values to (0-100) in C在 C 中将浮点值缩放到 (0-100) 的函数
【发布时间】:2012-04-23 07:40:46
【问题描述】:

我正在尝试将浮点变量转换为 0 到 100 之间的整数值。浮点数始终为正。相应的整数值应反映浮点值与 32 位浮点数最大值相比的大小,例如0.0 转换为 0 和 3.402823466 E + 38 转换为 100,以及介于两者之间的任何其他值。

这是我目前所拥有的,但我一直得到 -1 作为任何非零输入的输出。

int convFloat(float x){
    int y;
    y = (int) (x/3.4e38) * 100;
    return y;
}

我在这里做错了什么?

【问题讨论】:

  • 你需要除以3.4e36。这样就不需要乘以 100,也不会冒中间结果的风险。

标签: c floating-point integer scale


【解决方案1】:

这个:

y = (int) (x/3.4e38) * 100;
//  ^--------------^
//  cast (x/3.4e38)to int

应该是:

y = (int) ((x/3.4e38) * 100);
//  ^----------------------^
//  cast ((x/3.4e38) * 100)to int

【讨论】:

  • 好的,是的,但是为什么 OP 得到 -1 而不是 0?
  • 这没有真正的帮助。快速进行一些测试,它基本上对所有输入都产生 0,这确实没有任何改进。
  • @JerryCoffin - 缩放适用于非常大的数字,因此对于许多数字确实会得到 0,但在 E36-E38 范围内,缩放会导致其他数字。
  • 强制转换为 int 操作是否正确?你可以像 C 中那样将浮点数转换为 int 吗?
  • 科学记数法看起来很奇怪。该操作“似乎”是非线性的,因为它只为小范围的指数生成非零值,但当然不是。宇宙学家和亚原子物理学家忘记了“正常”数字——如果你派天文学家去杂货店买六个橙子,他/她会拿回一百万。
【解决方案2】:
((union { float f; uint32_t u; }){ val }.u>>23&255)*100/255

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-03-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-03-06
    相关资源
    最近更新 更多