在 C++ 中,我有一个 bigint 类,它可以保存任意大小的整数。
我想将大浮点数或双精度数转换为 bigint。我有一个工作方法,但它有点黑客。我使用 IEEE 754 数字规范来获取输入数字的二进制符号、尾数和指数。
这是代码(这里忽略符号,这并不重要):
float input = 77e12;
bigint result;
// extract sign, exponent and mantissa,
// according to IEEE 754 single precision number format
unsigned int *raw = reinterpret_cast<unsigned int *>(&input);
unsigned int sign = *raw >> 31;
unsigned int exponent = (*raw >> 23) & 0xFF;
unsigned int mantissa = *raw & 0x7FFFFF;
// the 24th bit is always 1.
result = mantissa + 0x800000;
// use the binary exponent to shift the result left or right
int shift = (23 - exponent + 127);
if (shift > 0) result >>= shift; else result <<= -shift;
cout << input << " " << result << endl;
它可以工作,但它相当丑陋,我不知道它的便携性如何。有一个更好的方法吗?有没有一种不那么丑陋、便携的方法来从浮点数或双精度数中提取二进制尾数和指数?
感谢您的回答。对于后代,这是使用 frexp 的解决方案。由于循环,它的效率较低,但它适用于浮点数和双精度数,不使用 reinterpret_cast 或依赖于浮点数表示的任何知识。
float input = 77e12;
bigint result;
int exponent;
double fraction = frexp (input, &exponent);
result = 0;
exponent--;
for (; exponent > 0; --exponent)
{
fraction *= 2;
if (fraction >= 1)
{
result += 1;
fraction -= 1;
}
result <<= 1;
}