繁体   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