首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何在给定整数和小数位的情况下创建一个浮点数?

如何在给定整数和小数位的情况下创建一个浮点数?
EN

Stack Overflow用户
提问于 2018-02-21 00:17:41
回答 1查看 100关注 0票数 2

如何在给定整数和小数位置的情况下生成浮点数?

例如:

代码语言:javascript
复制
int decimal = 1000;
int decimal_position = 3;
float value = 1.000;

我已经通过使用超能力做到了这一点,但效率不高。

代码语言:javascript
复制
decimal/pow(10, decimal_position)
EN

回答 1

Stack Overflow用户

发布于 2018-02-25 02:42:30

如何在给定整数和小数位置的情况下生成浮点数?

我已经通过使用超能力做到了这一点,但效率不高。

代码语言:javascript
复制
float value = decimal/pow(10, decimal_position);

它的范围取决于decimal_position的范围。

使用0 <= decimal_position < 8,代码可以使用表查找。

代码语言:javascript
复制
const float tens[8] = { 1.0f, 0.1f, ..., 1.0e-7f };
float value = decimal*tens[decimal_position];

然而,要处理所有产生有限值的int decimalint decimal_position,使用float powf(float )而不是double pow(double)应该是第一选择。

代码语言:javascript
复制
//                    float power function
float value = decimal/powf(10.0f, decimal_position);

如果不是所需的最佳值,代码可以*。这稍微不太精确,因为0.1f不是精确的数学0.1。然而,*通常比/更快。

代码语言:javascript
复制
float value = decimal*powf(0.1f, decimal_position);

对于较小的decimal_position值,可以进行循环以避免powf()

代码语言:javascript
复制
if (decimal_position < 0) {
  if (decimal_position > -N) {
    float ten = 1.0f;
    while (++decimal_position < 0) ten *= 10.0f;
    value = decimal*ten;
    while (++decimal_position < 0) value /= 10.0f;  // or value *= 0.1f;
  } else {
    value = decimal*powf(10.0f, -decimal_position);
  }
} else {
  if (decimal_position < N) {
    float ten = 1.0f;
    while (decimal_position-- > 0) ten *= 10.0f;
    value = decimal/ten;
  } else {
    value = decimal/powf(10.0f, decimal_position);  // alternate: *powf(0.1f, ...
  }
}

powf()相比,部分处理器可能会从使用pow()中受益,但我发现powf()通常更快。

当然,如果int decimalint decimal_position是这样的,那么整数答案是可能的:

代码语言:javascript
复制
// example, assume 32-bit `int`
if (decimal_position <= 0 && decimal_position >= -9) {
  const long long[10] = {1,10,100,1000,..., 1000000000};
  value = decimal*i_ten[-decimal_position];
} else {
  value = use above code ... 

或者,如果abs(decimal_position) <= 19和FP计算成本很高,请考虑:

代码语言:javascript
复制
unsigned long long ipow10(unsigned expo) {
  unsigned long long ten = 10;
  unsigned long long y = 1;
  while (expo > 0) {
    if (expo % 2u) {
      y = ten * y;
    }
    expo /= 2u;
    x *= ten;
  }
  return y;
}

if (decimal_position <= 0) {
  value = 1.0f*decimal*ipow10(-decimal_position);
} else {
  value = 1.0f*decimal/ipow10(decimal_position);
}

或者如果abs(decimal_position) <= 27 ..。

代码语言:javascript
复制
if (decimal_position <= 0) {
  value = scalbnf(decimal, -decimal_position) * ipow5(-decimal_position);
} else {
  value = scalbnf(decimal, -decimal_position) / ipow5(decimal_position);
}
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/48889655

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档