如何将两个非常大的数相除成双?

问题描述 投票:0回答:2

我有一个采用多边形作为输入的几何算法。但是,我应该用作输入文件的文件以一种非常特殊的方式存储了多边形的坐标。每个文件由一行,即逆时针的顶点序列组成。每个顶点都由其x和y坐标表示,每个坐标均写为两个整数int / int的商。但是,这些整数非常大。我编写了一个程序,使用函数long long将它们从字符串解析为std::stoll。但是,输入文件中的某些数字似乎大于2^64

输出坐标通常很小,范围为0-1000。我该如何解析这些数字,然后将它们除以得到双精度数?是否有任何标准的库方法可以执行此操作,还是应该使用boost库之类的方法?

c++ double int64
2个回答
0
投票

我相信您可以将输入直接解析为长整型。但是,这种方法会引入精度误差。如果精度很重要,请避免这种情况。

精确结果的一般解决方案是用整数数组表示大整数,其中一个整数表示低位字节,下一个整数表示较大字节,等等。这通常称为任意精度算术。

是否有任何标准的库方式可以做到这一点

否,除了用于存储数组的向量之类的基本构造块。

或者我应该使用Boost库之类的东西吗?

这通常是一个很好的起点。 Boost恰好为此提供了一个库。


0
投票

如果您使用两个大数字作为字符串的比率,则可以缩短字符串:

["194725681173571753193674"除以​​"635482929374729202"与]相同>

"1947256811735717"除以​​"6354829293"到至少9位数字(我刚刚在两边都删除了相同数量的数字)。根据所需的精度,这可能是最简单的解决方案。只需删除数字,然后再转换成long long。

© www.soinside.com 2019 - 2024. All rights reserved.