如何在给定整数和小数位的情况下生成浮点?
例如:
int decimal = 1000;
int decimal_position = 3;
float value = 1.000;
我通过使用权力来实现这一目标但效率不高
decimal/pow(10, decimal_position)
答案 0 :(得分:1)
您可以使用几个整数乘法和一个浮点除法来完成此操作:
int decimal = 1000;
int decimal_position = 3;
int offset = 1, i;
for (i=0; i<decimal_position; i++) {
offset *= 10;
}
float value = (float)decimal / offset;
请注意,这可以假设decimal_position
为非负数且10 decimal_position 适合int
。
答案 1 :(得分:0)
如何在给定整数和小数位置的情况下生成浮点数?
我通过使用权力实现了这一点,但效率不高
float value = decimal/pow(10, decimal_position);
取决于decimal_position
的范围。
使用0 <= decimal_position < 8
,代码可以使用表格查找。
const float tens[8] = { 1.0f, 0.1f, ..., 1.0e-7f };
float value = decimal*tens[decimal_position];
然而,为了处理导致有限值的所有int decimal
和int decimal_position
,使用float powf(float )
而不是double pow(double)
应该是首选。
// float power function
float value = decimal/powf(10.0f, decimal_position);
如果不是最佳值,则代码可以*
。这稍微不那么精确,因为0.1f
不完全是数学0.1。但*
通常比/
更快。
float value = decimal*powf(0.1f, decimal_position);
对powf()
decimal_position
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, ...
}
}
选择处理器可能会因使用pow()
与powf()
而受益,但我更快地发现powf()
。
当然,如果int decimal
和int decimal_position
是可能的整数答案:
// 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数学费用昂贵,请考虑:
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
...
if (decimal_position <= 0) {
value = scalbnf(decimal, -decimal_position) * ipow5(-decimal_position);
} else {
value = scalbnf(decimal, -decimal_position) / ipow5(decimal_position);
}