【发布时间】:2017-03-16 13:50:33
【问题描述】:
我目前正在用 C 语言做一些 2D 几何,主要是线相交。这些线有各种各样的斜率:从 0.001 到 1000(例子,我什至不知道)。
到目前为止,我一直在使用浮点数,不必担心值是非常小(然后浮点会将 0,0011 存储为 1e-3 且不进行四舍五入)还是非常高(然后将存储 1001如 1e3),在这两种情况下,相关的精度损失都很少。
但现在我想尝试不使用浮点数,使用整数。如何在我的计算中保持精度?我可以有一个标志告诉我斜坡是大还是小,然后考虑十分之一的大斜坡和十倍的小斜坡,这样对于小斜坡来说四舍五入是没有问题的,在大斜坡的情况下也没有溢出.但这感觉很头疼。
基本上,我仍然需要能够区分 0.2 和 0.4 的斜率,并且在事物的溢出侧还有 1000 和 2000 的斜率(假设整数在 1000 处溢出 - 这里问题较少)。
还有其他想法吗?
【问题讨论】:
-
除了存储上升和运行之外?
-
使用
double并忍受不精确?为什么需要超过 15 位小数有效数字的准确度?这样的精度足以测量从这里到冥王星的距离(以厘米为单位)。 -
在做计算几何时,总会有不精确的情况,因为总会有无理数。
-
@DavidBowling 注意:所有整数和有限浮点值都是有理数。确实,许多 int/float 计算与数学结果不同。
-
@chux——当然。我的观点是,通常(在 R^n 中)进行计算几何必须涉及无理数。例如,斜率 m = √2 的线不能以斜率截距形式或使用没有无理数的方向向量(即参数形式)表示。使用理性点的子集是避免这些困难的一种方法,但代价是限制了调查对象。我认为在这里管理不精确是不可避免的。虽然我认为这最终是一个目标问题。
标签: c floating-point integer precision computational-geometry