打印非常长的二进制表示的整数值
Print the integral value of a very long binary representation
假设您有一个很长的二进制(>64位),它表示一个无符号整型值,并且您想要打印实际的数字。我们讨论的是c++,因此假设您从一个bool[]或std::vector
现在,我怀疑,你必须对它进行块计算,以获得一些中间结果,这些结果足够小,可以存储-最好是以10为基数,如x·10k。我能算出从这一点开始的集合数。但是因为没有块宽度对应于10的底数,我不知道怎么做。当然,您可以从任何其他块宽度开始,比如3,以x·(23)k的形式获得中间值,然后将其转换为以10为基数,但这将导致x·103·k·lg2显然具有浮点指数,这没有任何帮助。
不管怎样,我已经厌倦了这些数学废话,如果你能给我一个周到的建议,我会很感激的。你的真诚,阿明
我假设您已经有了某种大整数除法/模函数,因为实现这样的事情完全是一场噩梦。
class bignum {
public:
bignum(unsigned value=0);
bignum(const bignum& rhs);
bignum(bignum&& rhs);
void divide(const bignum& denominator, bignum& out_modulo);
explicit operator bool();
explicit operator unsigned();
};
std::ostream& operator<<(std::ostream& out, bignum value) {
std::string backwards;
bignum remainder;
do {
value.divide(10, remainder);
backwards.push_back(unsigned(remainder)+'0');
}while(value);
std::copy(backwards.rbegin(), backwards.rend(), std::ostream_iterator(out));
return out;
}
如果四舍五入是一个选项,那么将大多数二进制转换为double
应该是相当简单的,这将是一个许多更快。也就是说,将64位最高有效位复制到unsigned long
,将其转换为double
,然后乘以2.0的有效位数减去64的次方。(我说有效位,因为你必须跳过任何前导零)
因此,如果你有150位有效位,将前64位复制到unsigned long
,将其转换为double
,并将其乘以std::pow(2.0, 150-64)
~ 7.73e+25得到结果。如果你只有40位有效位,在右边填上0仍然有效。将40位复制到unsigned long
的MSB,将其转换为double
,并将其乘以std::pow(2.0, 40-64)
~ 5.96e-8即可得到结果!
Oli Charlesworth发布了一个链接到维基百科的Double Dabble页面,这将我展示的第一个算法打了个水花。
标题>- 我可以信任表示整数的浮点或双精度来保持精度吗
- 在 C++ 中将整数数组转换为位集表示形式的最佳方法?
- 如何更好地表示 6 个整数键而不是作为 6 维数组的索引?
- 浮点数中整数的精确表示形式
- 在C++中,将无符号整数转换为八进制表示,反之亦然的最佳方法是什么
- 给定一个整数,将其表示为平方和
- 整数文本太大,无法用任何整数类型表示--C++
- 运行时错误:有符号整数溢出:964632435 * 10 无法在类型 'int' 中表示
- 如何在以 256 为基数的唯一 xLen-digit 表示中写一个整数 x?
- 升序,三个整数表示C++
- 编译器C++如何在二进制代码中表示整数
- 使用具有整数表示和 ULP 的混叠正确比较双精度
- Excel 2010与Excel 2003中的整数表示法(C++插件)
- 将ColedateTime转换为tick或整数表示
- Codekata将数字从十六进制转换为十进制整数表示形式
- 获取boost::gregori::date的整数表示形式
- 如何得到GF(2^n)中元素的整数表示
- 如何将整数表示为二进制以便使用异或进行比较
- 安全派生指针的整数表示形式
- 指针的整数表示形式