簡體   English   中英

如何在C / C ++中獲得大數字的精確二進制表示形式?

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM