[英]How to get exact binary representation of big numbers in c/c++?
我正在嘗試在C / C ++和Java中將大數轉換為二進制,但如果我采用普通的十進制形式輸入,例如998446744073709551615
輸出是正確的,但是如果我將使用科學記數法ex: 1.7334e+32
則二進制表示形式會出錯。
我已經在C / C ++和Java中從double和BigDecimals從二進制進行了測試。
在C / C ++測試中將字符串轉換為Long Double: https : //ideone.com/EeOyNP
在Java測試中將字符串轉換為大十進制: https : //ideone.com/OAvx7q
問題在於用64 bits
以上的數字表示的數字沒有以科學的記號表示。
查看下面的輸出。
C / C ++代碼的輸出:
輸入= 998446744073709551615預期二進制= 1101100010000000111011011001111011110011001010110011111111111111111111111
輸出:成功解析strtold(C樣式):9.98447e + 20二進制:1101100010000000111011011001111011110011001010110100000000000000000000
stringstream解析的stringstream(C ++樣式):9.98447e + 20 Binary:1101100010000000111011011001111011110011001010110100000000000000000000
showBitDiff統計信息:總位70位49位匹配21位不匹配
Java代碼的輸出:
小數字符串部分:
decimalString:998446744073709551615科學計數法:9.984467440737096E20
十進制字符串基數信息:
二進制:1101100010000000111011011001111011110011001010110011111111111111111111十進制:998446744073709551615十六進制:0x36203B67BCCACFFFFF位長度:70指數字符串部分:
exponentString:9.984467440737096E20指數字符串基數信息:
二進制:1101100010000000111011011001111011110011001010110100001011110100000000十進制:998446744073709600000十六進制:0x36203B67BCCAD0BD00位長度:70兩個BigInts不相等
如何解決此問題並在C / C ++中正確表示大數字? 我不想要Java解決方案,我只是將Java用於測試目的,因為它具有針對非常大的任意數字的bigDecimal類,謝謝。
如果您首先轉換為double以指數形式表示小數,那當然是錯誤的。 看看https://en.wikipedia.org/wiki/Floating-point_arithmetic 。 TLDR; 如果數字比州(2 ^ 128)多得多,您將有空白。 那就是從一開始就為double設計的。 如果您需要實際數字的精確表示,請不要將其轉換為浮點表示。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.