我會假設你已經有某種BIGNUM師/模功能一起工作,因爲實施這樣的事情是一個完整的噩夢。
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
爲好,這將是一個LOT更快。也就是說,將64個最高有效位複製到一個unsigned long
,將其轉換爲double
,然後乘以2.0乘以有效位數減去64的冪(我說的是有效位,因爲必須跳過任何前導零)
因此,如果您有150個有效位,將頂部64複製到unsigned long
,將其轉換爲double
,然後乘以std::pow(2.0, 150-64)
〜7.73e + 25得到結果。如果你只有40位有效位,右邊的零填充它仍然有效。將40位複製到unsigned long
的MSB,將其轉換爲double
,然後乘以std::pow(2.0, 40-64)
〜5.96e-8得到結果!
編輯
奧利查爾斯沃思張貼在Double Dabble一個鏈接到維基百科頁面吹滅第一算法我展示出來的水。我不覺得傻。
「二進制到十進制轉換」或類似的搜索堆棧溢出。但請注意,一般來說,每個十進制數字都依賴於每個二進制數字。 –
這個問題比你想象的要難得多。我會說使用一個bignum庫來完成任務,或者放棄。否則,你必須實施並做大量的bidnum劃分和模數來得到答案。允許舍入嗎?如果允許舍入,那麼很容易將其轉換爲「double」。 –
@MooingDuck它不能那麼辛苦,可以嗎?你之前嘗試過嗎? –