C 中 DBL_EPSILON 和 Machine-Epsilon 的混淆

2024-01-18

Machine-Epsilon 似乎有两个定义:

  1. 将实数舍入到下一个浮点数时的最大相对误差。
  2. 满足 1.0 + machine_eps != 1.0 的最小正数

首先,我不明白这两者是如何关联的。 根据我的理解,第二个 DBL_EPSILON 不符合定义 2:

以下程序打印:

DBL_EPSILON:            2.220446049250313080847e-16
DBL_EPSILON / 2:        1.110223024625156540424e-16
1.0 + DBL_EPSILON:      1.000000000000000222045e+00
1.0 + DBL_EPSILON / 2:  1.000000000000000000000e+00

m_eps                   2.220446049250313080847e-16
m_eps -1u               2.220446049250312834328e-16

1.0 + m_eps -1u         1.000000000000000222045e+00

(m_eps -1u < DBL_EPSILON):     True
(m_eps -1u == DBL_EPSILON/2):  False

m_eps -1u应该是一个更小的数字,但非常接近DBL_EPSILON。和 定义 2) 应该1.0 + m_eps -1u不评价为1.0?为什么有必要 划分DBL_EPSILON为此加2?

#include <stdout.h>
#include <stdint.h>
#inlcude <float.h>

union Double_t {
    double f;
    int64_t i;
};

int main(int argc, char *argv[])
{
    union Double_t m_eps;

    printf("DBL_EPSILON: \t\t%.*e\n", DECIMAL_DIG, DBL_EPSILON);
    printf("DBL_EPSILON / 2: \t%.*e\n", DECIMAL_DIG, DBL_EPSILON / 2);

    printf("1.0 + DBL_EPSILON: \t%.*e\n", DECIMAL_DIG, 1.0 + DBL_EPSILON);
    printf("1.0 + DBL_EPSILON / 2: \t%.*e\n", DECIMAL_DIG, 1.0 + DBL_EPSILON / 2);

    m_eps.f = DBL_EPSILON;
    printf("\nm_eps \t\t\t%.*e\n", DECIMAL_DIG, m_eps.f);

    m_eps.i -= 1;
    printf("m_eps -1u\t\t%.*e\n", DECIMAL_DIG, m_eps.f);
    printf("\n1.0 + (m_eps -1u)\t\t%.*e\n", DECIMAL_DIG, 1.0 + m_eps.f);

    printf("\n(m_eps -1u < DBL_EPSILON): %s\n",
            (m_eps.f < DBL_EPSILON) ? "True": "False"
            );

    printf("(m_eps -1u == DBL_EPSILON/2): %s\n",
            (DBL_EPSILON/2 == m_eps.f) ? "True": "False"
            );
    return 0;
}

错误的定义DBL_EPSILON,您引用的“最小正数使得 1.0 + machine_eps != 1”正在浮动。您甚至可以在标准库和 StackOverflow 上的其他精美答案中找到它。当在标准库中找到时,它位于注释中的值附近,该值显然与注释不对应,但对应于正确的定义:

DBL_EPSILON:这个是1和最小的差值 浮点数类型double大于 1。(正确的定义取自 GNU C 库)

C99 标准是这样表述的:

1 与给定浮点类型可表示的大于 1 的最小值之间的差值 b^(1−p)

这可能是您感到困惑的原因。忘记错误的定义。我写了一篇关于这个的咆哮here http://blog.frama-c.com/index.php?post/2013/05/09/FLT_EPSILON(这非常像你的问题)。


当舍入结果是普通浮点数时,问题中的另一个定义“将实数舍入到下一个浮点数时的最大相对误差”是正确的。将实数舍入为有限浮点数会生成实值 1/2 ULP 以内的浮点数。对于普通浮点数,此 1/2 ULP 绝对误差转换为相对误差,该误差可能介于 DBL_EPSILON/2 和 DBL_EPSILON/4 之间,具体取决于浮点数在其内部的位置。binade http://en.wikipedia.org/wiki/Binade.

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

C 中 DBL_EPSILON 和 Machine-Epsilon 的混淆 的相关文章

  • 在 Vulkan 中,图形队列系列与当前队列系列分离是否有益?

    据我所知 队列系列可能支持呈现到屏幕但不支持图形 假设我有一个同时支持图形和呈现的队列系列 以及另一个仅支持呈现的队列系列 我应该为两个进程使用第一个队列系列 还是应该将第一个队列系列委托给图形 将后者委托给呈现 或者这两种方法之间没有明显
  • C# 静态类型不能用作参数

    public static void SendEmail String from String To String Subject String HTML String AttachmentPath null String Attachme
  • 捕获 .aspx 和 .ascx 页面中的异常

    问题说明了一切 请看以下示例代码 ul li li ul
  • 关于逻辑/算法的想法以及如何防止线程写入 Sql Server 中的竞争

    我有以下逻辑 public void InQueueTable DataTable Table int incomingRows Table Rows Count if incomingRows gt RowsThreshold async
  • C# 中的 Stack<> 实现

    我最近一直在实现递归目录搜索实现 并且使用堆栈来跟踪路径元素 当我使用 string Join 连接路径元素时 我发现它们被颠倒了 当我调试该方法时 我查看了堆栈 发现堆栈内部数组中的元素本身是相反的 即最近 Push 的元素位于内部数组的
  • 在 C++ 代码中转换字符串

    我正在学习 C 并开发一个项目来练习 但现在我想在代码中转换一个变量 字符串 就像这样 用户有一个包含 C 代码的文件 但我希望我的程序读取该文件并插入将其写入代码中 如下所示 include
  • 在 Mono 中反序列化 JSON 数据

    使用 Monodroid 时 是否有一种简单的方法可以将简单的 JSON 字符串反序列化为 NET 对象 System Json 只提供序列化 不提供反序列化 我尝试过的各种第三方库都会导致 Mono Monodroid 出现问题 谢谢 f
  • Selenium - C# - Webdriver - 无法找到元素

    在 C 中使用 selenium 我试图打开浏览器 导航到 Google 并找到文本搜索字段 我尝试下面的 IWebDriver driver new InternetExplorerDriver C driver Navigate GoT
  • 使用 C# 和 ASP.NET 在电子邮件附件中发送 SQL 报告

    我正在尝试使用 ASP NET 和 C 从 sql reportserver 2008 作为电子邮件附件发送报告 到目前为止我学会了如何获取 PDF 格式的报告 http weblogs asp net srkirkland archive
  • C# 根据当前日期传递日期时间值

    我正在尝试根据 sql server 中的两个日期获取记录 Select from table where CreatedDate between StartDate and EndDate我通过了5 12 2010 and 5 12 20
  • 来自嵌入图像的 BitmapSource

    我的目标是在 WPF 窗口上重写 OnRender 方法中绘制图像 someImage png 它是嵌入资源 protected override void OnRender System Windows Media DrawingCont
  • 测量进程消耗的 CPU 时钟

    我用 C 语言编写了一个程序 它是作为研究结果创建的程序 我想计算程序消耗的确切 CPU 周期 精确的循环次数 知道我怎样才能找到它吗 The valgrind tool cachegrind valgrind tool cachegrin
  • 保证复制省略是否适用于函数参数?

    如果我理解正确的话 从 C 17 开始 这段代码现在要求不进行任何复制 Foo myfunc void return Foo auto foo myfunc no copy 函数参数也是如此吗 下面的代码中的副本会被优化掉吗 Foo myf
  • 如何防止 Blazor NavLink 组件的默认导航

    从 Blazor 3 1 Preview 2 开始 应该可以防止默认导航行为 https devblogs microsoft com aspnet asp net core updates in net core 3 1 preview
  • Xamarin Forms Binding - 访问父属性

    我无法访问页面的 ViewModel 属性以便将其绑定到 IsVisible 属性 如果我不设置 BindingContext 我只能绑定它 有没有办法可以在设置 BindingContext 的同时访问页面的 viewmodel root
  • C++ 指针引用混淆

    struct leaf int data leaf l leaf r struct leaf p void tree findparent int n int found leaf parent 这是 BST 的一段代码 我想问一下 为什么
  • 如何高效计算连续数的数字积?

    我正在尝试计算数字序列中每个数字的数字乘积 例如 21 22 23 98 99 将会 2 4 6 72 81 为了降低复杂性 我只会考虑 连续的数字 http simple wikipedia org wiki Consecutive in
  • 如何从 Windows Phone 7 模拟器获取数据

    我有一个 WP7 的单元测试框架 它在手机上运行 结果相当难以阅读 因此我将它们写入 XDocument 我的问题是 如何才能将这个 XML 文件从手机上移到我的桌面上 以便我可以实际分析结果 到目前为止 我所做的是将 Debugger B
  • 如何为有时异步的操作创建和实现接口

    假设我有数百个类 它们使用 计算 方法实现公共接口 一些类将执行异步 例如读取文件 而实现相同接口的其他类将执行同步代码 例如将两个数字相加 为了维护和性能 对此进行编码的好方法是什么 到目前为止我读到的帖子总是建议将异步 等待方法冒泡给调
  • 如何在 ASP.NET Core 中注入泛型的依赖关系

    我有以下存储库类 public class TestRepository Repository

随机推荐

  • 无法使用mockito模拟私有方法

    我正在尝试使用 power mockito 来模拟私有方法 读完这篇文章后我得到了一些想法 并且遵循了相同的结构 example https stackoverflow com questions 28121177 mock private
  • 如何将音频流式传输到 OpenAL Sources 中?

    我刚刚开始使用 OpenAL 我已成功将 WAV 文件加载到其中 并成功播放它们 这很容易 现在 我需要能够将音乐流式传输到 OpenAL 中 而不是将整个文件加载到其中 虽然这对于声音效果等有好处 但正如您可能知道的那样 对于音乐来说可能
  • 在 Oracle SQL 中 Case 语句的 When 部分中使用别名

    我已经尝试查找一段时间了 是否可以使用前面在 select 语句中声明的别名 是否可以在 Oracle SQL 的 case 语句中稍后的 case 中使用它 我发现的大多数结果都是关于如何根据案例陈述创建别名 这不是同一个问题 一个简单的
  • 防止用户在 Azure Devops (VSTS) 中创建没有父项的工作项

    我想阻止用户直接创建工作项 任务 任务只能通过使用用户故事中的添加子选项来创建 而不能直接创建 是否可以 防止用户在 Azure Devops VSTS 中创建没有父项的工作项 有一个解决方法 但不是完整的解决方案 您可以检查它是否适合您
  • git push heroku master 说“一切都是最新的”,但该应用程序不是最新的

    我在 Heroku 上有一个运行旧代码的应用程序 我做了一个小改变并提交了改变 然后我跑了 git push heroku master 它会说 Fetching repository done Everything up to date
  • Ruby on Rails 领域平均水平如何?

    有没有一种简单的方法来获取集合中属性的平均值 例如 每个用户都有一个分数 给定一组用户 users 如何获得该组的平均分数 有类似 users average score 的东西吗 我想我在数据库字段中遇到过类似的东西 但我需要它为集合工作
  • 如何关闭 MFMailComposeViewController?

    我想从我的 Swift 应用程序发送一封电子邮件 它运行良好 它发送了电子邮件 然而 发送电子邮件后 布局并没有退出 我想在发送电子邮件后退出布局 当我按下 取消 删除草稿 或 保存草稿 按钮时 我也希望出现这种行为 这是我必须发送电子邮件
  • 如何在没有 SelectionStart 的情况下设置 TextBox 光标位置

    我有一个 Windows 窗体文本框 后台线程每秒更新其值 如果我将光标放在文本框中 它将在下次更新时丢失其当前位置 文本选择也是如此 我试着这样解决它 protected void SetTextProgrammatically stri
  • 单个页面中的两个 xmlHttpRequest

    我对 ajax 相当陌生 但我正在尝试使用 javascript 实现两个简单的调用来动态更改页面上的两个单独的 div 我一次使用一个调用没有问题 但是当我使用两个调用时 似乎第二个 xmlhttprequest 接管第一个调用并写入两个
  • 使用不完全模式匹配作为过滤器?

    假设我有以下代码 type Vehicle Car of string int Bike of string let xs Car family 8 Bike racing Car sports 2 Bike chopper 我可以在命令式
  • 如何禁止显示后续异常的父异常(原因)

    我知道raise from None并已阅读当我提出自己的异常作为响应时 如何更轻松地抑制以前的异常 https stackoverflow com questions 17091520 how can i more easily supp
  • 限制结果中的字段

    我正在使用 MongoDB v3 0 1 和 MongoDB Java 驱动程序 3 0 0 RC1 我有一个用户集合 其中包含 用户名 名字 姓氏 电子邮件 等字段 现在我想选择所有用户 但仅限于 用户名 名字 和 姓氏 字段 在 Mon
  • 如何在Windows Phone 7应用程序开发中动态显示图像?

    我想动态显示图像 即 如果每当单击特定图像更多 4 到 5 次 时 该图像就会消失 并且新图像可以填充此位置 我想在窗口中动态显示图像使用 silverlight 的电话 7 我知道这是一个很老的问题 但我有几分钟的空闲时间 每四次点击屏幕
  • 使用 Prism 更改 Xamarin Forms 中的页面过渡动画

    是否可以使用 Prism 的 INavigationService 更改 Xamarin Forms 中的页面过渡动画 我希望在 Android 上有淡入淡出动画 就像使用默认的 Xamarin Forms PushAsync PopAsy
  • 查询在 Oracle 11g 上有效,但在 Oracle 8i 上失败

    我在 Oracle 11g 中运行此查询没有问题 select case when seqnum 1 then 1 when seqnum cnt then 0 end as value1 case when seqnum 1 then t
  • Python 字符串格式化:填充负数

    我想将整数格式化为字符串 以便在没有符号的情况下 它们将被零填充以具有至少两位数字 例如我想要 1 1 10 10 to be 01 01 10 10 具体来说 我想要负数 3 和非负数 2 具有不同的最小字符串长度 简单的数字填充详情he
  • 子 span 元素脱离父元素,flexbox / margin - 填充问题

    我阅读了类似问题的帖子 但仍然无法使其正常工作 当有大文本时 我试图使用文本省略号 JSFiddle https jsfiddle net heyrohit bxrpduxu fixIssue align items center thum
  • 具有多个/许多伪选择器/匹配的本机 Javascript querySelectorAll()

    如何在本机 Javascript querySelectorAll 中放置许多伪选择器 示例 我想搜索 id 以 id starting 开头并以 id ending 结尾的元素 找不到现有问题 因此自己制作并回答 对于 Native Ja
  • 我应该如何排列这些“有用”的分数?

    在我网站上的用户生成的帖子下 我有一个类似亚马逊的评级系统 Was this review helpful to you Yes No 如果有投票 我会在该行上方显示结果 如下所示 5 of 8 people found this repl
  • C 中 DBL_EPSILON 和 Machine-Epsilon 的混淆

    Machine Epsilon 似乎有两个定义 将实数舍入到下一个浮点数时的最大相对误差 满足 1 0 machine eps 1 0 的最小正数 首先 我不明白这两者是如何关联的 根据我的理解 第二个 DBL EPSILON 不符合定义