为什么我无法在标准机器学习中比较实数?

2023-12-15

  1. 为什么不1.0 = 2.0工作?不是real平等类型?

    它给出了错误:

    Error: operator and operand don't agree [equality type required]
      operator domain: ''Z * ''Z
      operand:         real * real
      in expression:
        1.0 = 2.0
    
  2. 为什么模式中的实数不能像这样工作?

    fun fact 0.0 = 1.0
      | fact x = x * fact (x - 1.0)
    

    它给出了错误:

    Error: syntax error: inserting  EQUALOP
    

为什么不1.0 = 2.0工作?不是real平等类型?

编号 类型变量''Z表示操作数为=必须具有相等类型。

为什么模式中的实数不起作用 [...]?

模式匹配隐式依赖于相等性测试。神秘的错误消息syntax error: inserting EQUALOP表示 SML/NJ 解析器不允许在需要模式的情况下使用浮点文字,因此程序员无法收到更有意义的类型错误。

详细说明,

From http://www.smlnj.org/doc/FAQ/faq.txt:

问:real 是相等类型吗?

答:SML '90 和 SML/NJ 0.93 中有,但 SML '97 和 SML/NJ 110 中没有。 所以1.0 = 1.0将导致类型错误,因为“=”要求参数具有相等性 类型。此外,真正的文字不能在模式中使用。

From http://mlton.org/PolymorphicEquality:

无法比较的一种地面类型是真实的。所以,13.0 = 14.0类型不正确。一个可以用Real.==比较实数是否相等,但请注意,这与多态相等具有不同的代数性质。

例如,Real.== (0.1 + 0.2, 0.3) is false.

From http://sml-family.org/Basis/real.html:

决定 real 是否应该是相等类型,如果是,那么相等意味着什么,也是有问题的。 IEEE 指定在比较中忽略零的符号,并且如果任一参数为 NaN,则相等性计算结果为 false。

这些限制让 SML 程序员感到不安。前者意味着 0 = ~0 为真,而 r/0 = r/~0 为假。后者意味着诸如 r = r 为假这样的异常,或者对于参考单元 rr,我们可以有 rr = rr 但不能有 !rr = !rr。我们接受零的无符号比较,但认为应该保留相等性、结构相等性以及 而不是 o = 的等价性的自反属性。

简而言之:不要使用相等性来比较实数。执行一个ε检验。我建议阅读有关的文章http://floating-point-gui.de/errors/comparison。总之:

  • 不检查实数是否相同,而是检查差异是否非常小。

  • 差值的误差范围 (delta) 与通常称为epsilon.

  • 不要将差异与固定值进行比较epsilon:

    fun nearlyEqual (a, b, eps) = Real.abs (a-b) < eps
    
  • 不要只是比较relative与差异epsilon:

    fun nearlyEqual (a, b, eps) = abs ((a-b)/b) < eps
    
  • 留意边缘情况:

    • When b = 0.0它提高了Div。 (交换a and b提供对称的边缘情况。)

    • When a and b位于零的两侧,返回false即使它们是尽可能小的非零数。

    • 结果不可交换。有些情况下nearlyEqual (a, b, eps)没有给出相同的结果nearlyEqual (b, a, eps).

该指南提供了通用解决方案;翻译成标准机器学习看起来像:

fun nearlyEqual (a, b, eps) =
    let val absA = Real.abs a
        val absB = Real.abs b
        val diff = Real.abs (a - b)
    in Real.== (a, b) orelse
     ( if Real.== (a, 0.0) orelse
          Real.== (b, 0.0) orelse
          diff < Real.minNormalPos
       then diff < eps * Real.minNormalPos
       else diff / Real.min (absA + absB, Real.maxFinite) < eps )
    end

它还继续警告一些边缘情况:

在某些情况下,上述方法仍然会产生意外结果(特别是,当一个值接近零时比它恰好为零时要严格得多),并且它开发的一些要通过的测试可能指定了不适当的行为对于某些应用程序。在使用它之前,请确保它适合您的应用程序!

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

为什么我无法在标准机器学习中比较实数? 的相关文章

  • 二进制浮点加法算法

    我试图理解二进制级别的 IEEE 754 浮点加法 我遵循了一些在网上找到的示例算法 并且大量测试用例与经过验证的软件实现相匹配 我的算法目前只处理正数 但是 我没有得到与此测试用例的匹配 0000100011110011011001001
  • 整数转浮点数

    这段代码的工作原理 posToXY Float gt Float gt Integer posToXY a b do let y a b round y 但这不起作用 posToXY Integer gt Integer gt Intege
  • 为什么 FLT_MIN 等于 0?

    limits h指定非浮点数学类型的限制 例如INT MIN and INT MAX 这些值是可以使用 int 表示的最大负值和最大正值 In float h 有定义FLT MIN and FLT MAX 如果您执行以下操作 NSLog f
  • Python 中的舍入浮点问题

    我遇到了 np round np around 的问题 它没有正确舍入 我无法包含代码 因为当我手动设置值 而不是使用我的数据 时 返回有效 但这是输出 In 177 a Out 177 0 0099999998 In 178 np rou
  • 不同编程语言中的浮点数学

    我知道浮点数学充其量可能是丑陋的 但我想知道是否有人可以解释以下怪癖 在大多数编程语言中 我测试了 0 4 到 0 2 的加法会产生轻微的错误 而 0 4 0 1 0 1 则不会产生错误 两者计算不平等的原因是什么 在各自的编程语言中可以采
  • Javascript 浮点乘以 100 仍然有错误

    我有一个货币字段的文本输入 我在字段中输入 33 91 并在尝试使用 乘以 100 技术时得到以下结果 var curWth parseInt trans withdraw index val 100 3390 var curWth par
  • 什么是浮点推测以及它与编译器的浮点模型有何不同

    英特尔 C 编译器提供两个控制浮点的选项 fp 推测 快速 安全 严格 关闭 fp model 精确 快速 严格和源 双 扩展 我想我明白 fp model 的作用 但什么是 fp 推测以及它与 fp 模型有何关系 我还没有找到任何解释这一
  • C++ 中的双精度型数字

    尽管内部表示有 17 位 但 IEE754 64 位 浮点应该正确表示 15 位有效数字 有没有办法强制第 16 位和第 17 位为零 Ref http msdn microsoft com en us library system dou
  • 查找公因数以将浮点数列表转换为整数列表

    我有一个来自其他函数的浮点数列表 我所知道的是 在理想世界中存在一个共同因素 可用于将每一项相乘以获得整数列表 可能存在一些小的数值噪声 1e 14 例如 2 3333333333333335 4 666666666666667 1 0 1
  • 在 Haskell 中将字符串转换为整数/浮点数?

    data GroceryItem CartItem ItemName Price Quantity StockItem ItemName Price Quantity makeGroceryItem String gt Float gt I
  • 如何指定 set precision 舍入

    当流到 std 输出时 我可以指定 set precision 对双精度值进行舍入吗 ofile lt lt std setprecision 12 lt lt total run time TIME lt lt n Output 0 75
  • 为什么多次相加0.1仍然无损?

    我知道0 1十进制数不能用有限的二进制数精确表示 解释 http www exploringbinary com why 0 point 1 does not exist in floating point so double n 0 1会
  • 是否可以强制浮点数的指数或有效数匹配另一个浮点数(Python)?

    这是我前几天试图解决的一个有趣的问题 是否可以强制一个的有效数或指数float与另一个人一样float在Python中 出现这个问题是因为我试图重新调整一些数据 以便最小值和最大值与另一个数据集匹配 然而 我重新调整后的数据略有偏差 大约小
  • 是否有一个函数可以检索某个范围内可用的不同值的数量?

    我正在制作的应用程序中使用双精度浮点变量 我标准化了一些值范围 从 例如 我有很多范围 48 0 to 48 0 to 0 0 to 1 0 使用这个简单的函数 double ToNormalizedParam double nonNorm
  • 在c#中打印0.1的增量

    我目前正在阅读 Steve McConnell 的 Code Complete 特别是第 295 页有关浮点数的内容 当我运行以下代码时 double nominal 1 0 double sum 0 0 for int i 0 i lt
  • 最Pythonic的方式来打印*最多*一些小数位[重复]

    这个问题在这里已经有答案了 我想格式化浮点数列表 最多保留 2 位小数 但是 我不需要尾随零 也不想要尾随小数点 所以 举例来说 4 001 gt 4 4 797 gt 4 8 8 992 gt 8 99 13 577 gt 13 58 T
  • JavaScript 中的 ParseFloat 函数

    当我添加两个文本框值时1 001 and 0 001然后我做了一个parseFloat I get 1 0019999999 我要它1 002 你能帮助我吗 JavaScriptNumber http www w3schools com j
  • 如何在 OpenCV 中将 Float Mat 写入文件

    我有一个矩阵 Mat B 480 640 CV 32FC1 包含浮点值 我想将此矩阵写入一个可以打开的文件Notepad https en wikipedia org wiki Windows Notepad or 微软Word https
  • Kotlin 中 Float 和 Double 类型的最小值和最大值

    找出确切的内容很简单min and max值Int and LongKotlin 中的整数 有符号 32 位整数 Int MIN VALUE 2147483648 Int MAX VALUE 2147483647 有符号 64 位整数 Lo
  • 为什么 Go 中只有 int 而没有 float?

    在 Go 中 有这样的类型int这可能相当于int32 or int64取决于系统架构 我可以声明一个整数变量而不用担心它的大小 var x int 为什么没有这个类型float 这相当于float32 or float64取决于我的系统架

随机推荐