将 float 和 double 值与 delta 进行比较?

2024-04-21

据我了解,必须仔细比较浮点类型的值,以避免固有浮点错误的问题。这可以通过将值与错误阈值进行比较来改进。

例如,以下解决方案比简单的解决方案更有用x == y test:

static float CompareRelativeError(float x, float y) {
    return Math.Abs(x - y) / Math.Max(Math.Abs(x), Math.Abs(y));
}
static bool CompareAlmostEqual(float x, float y, float delta) {
    return x == y || CompareRelativeError(x, y) < delta;
}

// apologies if this is a poor example
if (CompareAlmostEqual(1f/10f, 0.1f)) { ... }

上述解决方案源自以下资源:在Java中直接比较2个float/double安全吗? https://stackoverflow.com/questions/6786254/is-it-safe-when-compare-2-float-double-directly-in-java/6786286#answer-6786580

虽然我还没有找到任何文献来证实这一点,但对我来说,这对于类似的比较来说似乎也是如此x > y。例如,如果x and y本质上是平等的,怎么可能一个比另一个大呢……

static bool CompareGreater(float x, float y, float delta) {
    return x > y && !CompareAlmostEqual(x, y, delta);
}

因此以下内容适用于x >= y:

static bool CompareGreaterOrEqual(float x, float y) {
    return x >= y;
}

我的假设正确吗?


相等性测试正是 delta(或 epsilon)技术用于浮点值的原因。

例如我们希望 3 等于 2.999999……达到一定的精度。

So your CompareGreaterOrEqual当定义为以下方法时,方法是不够的:

static bool CompareGreaterOrEqual(float x, float y) {
    return x >= y;
}

它应该是:

static bool CompareGreaterOrEqual(float x, float y, float delta) {
    return x >= y || CompareAlmostEqual(x, y, delta);
}

Note: x >= y在第一次测试中可能只是x > y因为 delta 比较考虑了相等性:

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

将 float 和 double 值与 delta 进行比较? 的相关文章

随机推荐

  • Google OR-Tools TSP 返回几个解决方案

    我最近一直致力于使用 Google 的 OR Tools 寻找最佳路线以外的内容 我找到了一个仓库中的示例 https github com google or tools blob master examples dotnet cshar
  • 测量缩放画布上的文本

    我一直在努力处理文本测量和缩放画布 当画布未缩放时 getTextBounds 和measureText 可提供准确的结果 但是 当缩放画布时 这两种方法都无法提供与打印文本的实际大小相匹配的结果 为了进行测试 我使用以下 onDraw 方
  • `typedef typename Foo::Bar Bar' 的模板声明

    我在声明模板类型时遇到了很大的困难 如下所示 include
  • 自 iOS 7 发布以来,将不会为添加到配置文件的设备安装临时 iOS .ipa 文件

    我有一个 iOS 应用程序 我已经开发了一段时间了 最初 iOS 开发帐户中有大约 8 台设备 广告版本是通过 Hockey App 准备和分发的 没有任何问题 最近 我们添加了更多设备 但由于某种原因 临时版本不会安装在这些设备上 但继续
  • 如何实现让 UITableView 设置其单元格的插图而不在整个表格上设置插图?

    我有一个UITableViewCell内容延伸到其所有边缘 我在多个表格中使用此单元格 其中需要不同的插图 即一个表格将其从左侧插入 8 个点 另一个表格将其插入 20 个点 我想缩进父级中的单元格UITableView代码 也许cellF
  • 使用 Shopify 管理 API 创建产品

    我第一次开始使用 React 和 Node js 构建私有 Shopify 应用程序 该应用程序的目的是监听 添加到购物车 按钮 单击该按钮后 它应该使用 Shopify 产品 API 在 Shopify 后端中创建自定义产品 我在基本 J
  • 如何从 Github 隐藏 .env 文件

    我在 Rails 项目中使用 dotenv 来存储 API 密钥 我的 gemfile 中有 dotenv gem 在应用程序的根目录中创建了一个 env 并在其中列出了我的 API 密钥 但是 当我推送到 github 时 我注意到 en
  • IE 未在 TLS 相互身份验证中发送客户端证书

    我正在尝试与第三方 API 建立 TLS 相互身份验证 客户端证书配置良好 当我尝试通过 Chrome 访问端点 url 时 它工作正常 Chrome 要求在消息框中确认证书 当我这样做时 页面会显示其内容 当我尝试使用 IE 执行同样的操
  • Routes.rb vsrack-rewrite vs nginx/apache 重写规则

    我的应用程序的前一个版本中的遗留 URL 有数十条重写规则 我看到三个选择 只需在路由文件 config routes rb 中添加 匹配 行 Use 机架重写 https github com jtrupiano rack rewrite
  • 用于展平嵌套列表的递归生成器

    我是一名编程新手 在理解我的 Python 教科书 Magnus Lie Hetland 的 Beginning Python 中的示例时遇到了一些困难 该示例是一个递归生成器 旨在展平嵌套列表的元素 具有任意深度 def flatten
  • Apple 听写 - 在应用程序中使用

    有什么方法可以在本机 Apple 应用程序中利用 Apple 的听写语音转文本功能吗 你的问题有点模糊 最好先知道你尝试使用或做什么 或者你想要实现什么目标 更常见的是关键字识别 API 但可以用于此目的的语音识别 API 是张开耳朵 ht
  • iOS Storyboard:ViewController 外部和场景顶部的视图(第一响应者和退出框之间)

    我很难理解为什么你可以把UIViews之外的UIViewController在故事板上 以及它的用例可能是什么 例如 在故事板上我可以添加UIToolbar UIAcitivtyIndicator and UIProgressView那是在
  • 如何在类模板中使用文件范围的命名空间声明?

    C 10 介绍文件范围的命名空间 https learn microsoft com en us dotnet csharp language reference proposals csharp 10 0 file scoped name
  • 安卓蓝牙无法连接

    我遇到这个问题已经有一段时间了 但一直无法解决 我有一个 Android 应用程序 它将所有配对的设备放在列表视图中 当您单击列表项之一时 它将发起连接到该蓝牙设备的请求 我可以毫无问题地获取设备列表及其地址 问题是 一旦我尝试连接 我就会
  • 如何在 AWS 上设置无密码 ssh

    如何在 AWS 集群上的节点之间设置无密码 ssh 以下设置无密码身份验证的步骤已针对 Centos 和 Ubuntu 进行了彻底测试 假设 您已经可以访问您的 EC2 机器 可能正在使用 pem 密钥 或者您拥有具有 root 权限的 u
  • Windows 7 为软件开发人员带来哪些好处? [关闭]

    很难说出这里问的是什么 这个问题是含糊的 模糊的 不完整的 过于宽泛的或修辞性的 无法以目前的形式得到合理的回答 如需帮助澄清此问题以便重新打开 访问帮助中心 help reopen questions 我正在尝试将我的开发计算机升级到 W
  • 如何重置 JSESSIONID

    当用户进行身份验证时重置会话 cookie 被认为是一种良好的安全实践 如何用 Java 做到这一点 到目前为止我的尝试是成功的 但我想知道是否有更好的方法 public static HttpSession resetSessionId
  • 车把模板的文件扩展名

    我更改了车把模板的扩展名 并在调用 handlebarjs 编译函数的函数中引用了相同的扩展名 它工作得很好 没有任何问题 但我很好奇是否还有其他人尝试过 如果您认为这可能会因任何原因导致问题 请告诉我 出于某种原因 我觉得扩展名 hand
  • Java 中搜索和排序算法的高效实现

    有没有人有关于常见搜索和排序算法的一组 Java 代码实现的良好参考 剥猫皮的方法有很多种 很容易在网上找到各种算法的 Java 代码 但是 Java 中是否有实现这些不同算法的最有效方法的列表 例如有http www algorithmi
  • 将 float 和 double 值与 delta 进行比较?

    据我了解 必须仔细比较浮点类型的值 以避免固有浮点错误的问题 这可以通过将值与错误阈值进行比较来改进 例如 以下解决方案比简单的解决方案更有用x y test static float CompareRelativeError float