【问题标题】:How to parse the division of two very large numbers into a double?如何将两个非常大的数字除法解析为双精度数?
【发布时间】:2020-06-08 17:25:13
【问题描述】:

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

输出坐标通常很小,在 0-1000 范围内。我该如何解析这些数字,然后除以它们,获得双打?是否有任何标准库方法可以做到这一点,或者我应该使用 boost 库之类的东西?

【问题讨论】:

  • Boost 有一个多精度库,可以处理非常大的整数。另一种选择可能是在该数字中插入一个小数点并将它们解析为双精度数。如果在同一个地方插入(从右数),除法结果是一样的(直到四舍五入)。
  • @DanielLangr 尝试将它们解析为双精度数会丢失精度,从而在转换后的数字中产生错误。
  • @1201ProgramAlarm 如果除法的结果不能由相关数据类型准确表示,您总是会失去一些精度。
  • 也许看看GMP
  • (a) 显示示例。显示您拥有的最大分子和最大分母。如果您有任何关于数字可能有多大的信息,除了您已经拥有的数据,请显示出来。 (b) 你需要输出坐标有多精确?如果它们只是 0 到 1000 的数字,并且它们是像素坐标,所以它们是整数,那么 double 具有足够的精度,几乎所有商都将映射到正确的像素。但如果它们用于其他用途,准确性如何影响计算?

标签: c++ double int64


【解决方案1】:

如果你将两个大数的比例作为字符串,你可以缩短字符串:

"194725681173571753193674"除以"635482929374729202"等于

"1947256811735717" 除以"6354829293" 至少为 9 位(我只是删除了两边相同数量的数字)。根据所需的精度,这可能是最简单的解决方案。只需在转换为 long long 之前删除数字即可。

【讨论】:

  • 不错!很聪明。
【解决方案2】:

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

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

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

没有,除了基本的构建块,例如用于存储数组的向量。

还是应该使用 boost 库之类的东西?

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2014-12-06
    • 2020-12-23
    • 2021-10-13
    • 1970-01-01
    • 2012-10-21
    • 2010-11-27
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多