【问题标题】:CLI/C++ How to store more than 15 digit float number?CLI/C++ 如何存储超过 15 位的浮点数?
【发布时间】:2011-12-04 01:45:51
【问题描述】:

对于一个学校项目,我有一个简单的程序,可以比较 20x20 的照片。我放了 20 张照片,然后放了第 21 张照片,与现有的 20 张照片进行比较,然后弹出答案,我插入了哪张照片(或者哪一张最相似)。问题是,我的老师要我使用最近邻算法,所以我计算每张照片的距离。我让一切正常,但问题是,如果照片太相似,我很难说哪一张更接近我的那一张。例如,我用 2 张不同的照片得到这些距离(嗯,它们几乎是一样的):

0 distance: 1353.07982026191
1 distance: 1353.07982026191

已经是 15 位数字了,我使用的是 double 类型。我读到long double 是一样的。是否有任何“简单”的方法来存储超过 15 位数字并对其进行数学运算?

我用欧几里得距离计算距离 我只是需要更精确,否则我可能不会通过这里的限制,我应该和我的老师谈谈我无法比较这种相似的照片?

【问题讨论】:

  • 您不需要取平方根,因为您可以只比较平方差,以获得相同的答案。此外,您当然不需要超过 15 个有效数字:如果两张图片的精度相同,则将它们视为同样接近。

标签: c++ visual-studio floating-point c++-cli euclidean-distance


【解决方案1】:

我认为你需要这个:gmplib.org

在这个网站上也有一个如何安装这个库的指南。

还有关于浮动的文章:http://gmplib.org/manual/C_002b_002b-Interface-Floats.html#C_002b_002b-Interface-Floats

【讨论】:

    【解决方案2】:

    也许您可以使用代数方法。

    让我们假设您正在尝试计算矢量 x 是否更接近 ab。你需要计算的是

    的符号

    d2(x, a) - d2(x , b)

    变成了(为简洁起见,我将省略一些段落)

    然后

    仅包含应该非常相似的值之间的差异。对如此小的值求和应该比在聚合上产生更好的精度。

    【讨论】:

    • 关于我最后一句话的注释:您实际上是在添加两个相同大小的数字(-> 精度没有损失),并乘以一个可能小得多的数字(-> 机器上的精度没有损失使用 IEEE 表示)。
    猜你喜欢
    • 2021-09-02
    • 1970-01-01
    • 2018-01-04
    • 1970-01-01
    • 2012-03-13
    • 2019-02-10
    • 1970-01-01
    • 1970-01-01
    • 2012-01-20
    相关资源
    最近更新 更多