【发布时间】: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具有足够的精度,几乎所有商都将映射到正确的像素。但如果它们用于其他用途,准确性如何影响计算?