不精确浮点常数的警告

2024-01-26

诸如“为什么 0.1+0.1+0.1+0.1+0.1+0.1+0.1+0.1 = 0.8 不是?“让我想到...

...最好让编译器警告浮点常量,它舍入到二进制浮点类型中最接近的可表示形式(例如 0.1 和 0.8 以基数 2 浮点舍入,否则它们需要无限量的空间来存储无限数量的数字)。

我查找了 gcc 警告,到目前为止没有发现任何用于此目的的警告(-Wall, -Wextra, -Wfloat-equal, -Wconversion, -Wcoercion(不支持或仅支持 C?),-Wtraditional(仅限 C)似乎没有做我想做的事)。

我在 Microsoft Visual C++ 编译器中也没有发现这样的警告。

我是否错过了隐藏或很少使用的选项?

有没有任何编译器有这种警告?

EDIT:此警告可能有助于教育目的,并可作为浮点新手的提醒。


编译器没有任何技术原因无法发出此类警告。然而,它们只对学生(在开始认真使用浮点运算之前应该学习浮点运算如何工作)和那些在浮点方面做得很好的人有用。不幸的是,大多数浮点工作都很粗糙。人们把数字扔到计算机上,不太关心计算机是如何工作的,他们接受得到的任何结果。

默认情况下必须关闭该警告才能支持大量现有浮点代码。如果它可用,我会在 Mac OS X 数学库中为我的代码打开它。当然,库中有些地方我们依赖于浮点值的每一位,例如我们使用扩展精度算术的地方,并且值是跨多个浮点对象表示的(例如,我们会有一个一个对象的高位为 1/π,另一个对象的 1/π 减去第一个对象,第三个对象的 1/π 减去前两个对象,得到大约 150 位的 1/π)。一些此类值在源文本中以十六进制浮点表示,以避免编译器转换十进制数字时出现任何问题,并且我们可以轻松转换任何剩余数字以避免新的编译器警告。

然而,我怀疑我们能否说服编译器开发人员相信有足够多的人会使用此警告,或者它会捕获足够多的错误以使其值得花费时间。考虑 libm 的情况。假设我们通常为所有常量写出精确的数字,但有一次写了一些其他数字。这个警告会发现错误吗?嗯,有什么bug吗?无论如何,数字很可能会准确地转换为我们想要的值。当在打开此警告的情况下编写代码时,我们可能会考虑如何执行浮点计算,并且我们编写的值是适合我们目的的值。例如,它可能是我们计算的某个极小极大多项式的系数,并且无论是近似以十进制表示还是转换为某种可精确表示的十六进制浮点数字,该系数都尽可能好。

因此,此警告很少会捕获错误。也许它会捕获我们错误输入数字的情况,意外地将额外的数字插入到十六进制浮点数字中,导致它超出了可表示的有效数。但这种情况很少见。在大多数情况下,我们使用的数字要么简单又短,要么是从计算它们的软件中复制和粘贴的。在某些情况下,我们会手动输入特殊值,例如0x1.ffffffffffffffp0。当额外的“f”插入该数字时发出警告可能会在编译期间捕获错误,但该错误几乎肯定会在测试中很快被捕获,因为它极大地改变了特殊值。

因此,这样的编译器警告几乎没有什么用处:很少有人会使用它,而且对于使用它的人来说,它捕获的错误也很少。

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

不精确浮点常数的警告 的相关文章

  • 以文化中立的方式将字符串拆分为单词

    我提出了下面的方法 旨在将可变长度的文本拆分为单词数组 以进行进一步的全文索引处理 删除停止词 然后进行词干分析 结果似乎不错 但我想听听关于这种实现对于不同语言的文本的可靠性的意见 您会建议使用正则表达式来代替吗 请注意 我选择不使用 S
  • WCF RIA 服务 - 加载多个实体

    我正在寻找一种模式来解决以下问题 我认为这很常见 我正在使用 WCF RIA 服务在初始加载时将多个实体返回给客户端 我希望两个实体异步加载 以免锁定 UI 并且我想利用 RIA 服务来执行此操作 我的解决方案如下 似乎有效 这种方法会遇到
  • 用于检查类是否具有运算符/成员的 C++ 类型特征[重复]

    这个问题在这里已经有答案了 可能的重复 是否可以编写一个 C 模板来检查函数是否存在 https stackoverflow com questions 257288 is it possible to write a c template
  • Asp.NET WebApi 中类似文件名称的路由

    是否可以在 ASP NET Web API 路由配置中添加一条路由 以允许处理看起来有点像文件名的 URL 我尝试添加以下条目WebApiConfig Register 但这不起作用 使用 URIapi foo 0de7ebfa 3a55
  • OleDbDataAdapter 未填充所有行

    嘿 我正在使用 DataAdapter 读取 Excel 文件并用该数据填充数据表 这是我的查询和连接字符串 private string Query SELECT FROM Sheet1 private string ConnectStr
  • 堆栈溢出:堆栈空间中重复的临时分配?

    struct MemBlock char mem 1024 MemBlock operator const MemBlock b const return MemBlock global void foo int step 0 if ste
  • C++ OpenSSL 导出私钥

    到目前为止 我成功地使用了 SSL 但遇到了令人困惑的障碍 我生成了 RSA 密钥对 之前使用 PEM write bio RSAPrivateKey 来导出它们 然而 手册页声称该格式已经过时 实际上它看起来与通常的 PEM 格式不同 相
  • while 循环中的 scanf

    在这段代码中 scanf只工作一次 我究竟做错了什么 include
  • 转发声明和包含

    在使用库时 无论是我自己的还是外部的 都有很多带有前向声明的类 根据情况 相同的类也包含在内 当我使用某个类时 我需要知道该类使用的某些对象是前向声明的还是 include d 原因是我想知道是否应该包含两个标题还是只包含一个标题 现在我知
  • 如何在 C 中调用采用匿名结构的函数?

    如何在 C 中调用采用匿名结构的函数 比如这个函数 void func struct int x p printf i n p x 当提供原型的函数声明在范围内时 调用该函数的参数必须具有与原型中声明的类型兼容的类型 其中 兼容 具有标准定
  • 什么时候虚拟继承是一个好的设计? [复制]

    这个问题在这里已经有答案了 EDIT3 请务必在回答之前清楚地了解我要问的内容 有 EDIT2 和很多评论 有 或曾经 有很多答案清楚地表明了对问题的误解 我知道这也是我的错 对此感到抱歉 嗨 我查看了有关虚拟继承的问题 class B p
  • 使用 x509 证书签署 json 文档或字符串

    如何使用 x509 证书签署 json 文档或字符串 public static void fund string filePath C Users VIKAS Desktop Data xml Read the file XmlDocum
  • GCC 如何运行其他程序?

    也许标题并没有那么准确地表达问题 我知道当我跑步时gcc foo cGCC 调用其他为其完成所有工作的子程序 使 gcc 主程序只是一个接口 但这到底是如何完成的呢 是否使用system or exec或者其他一些功能 我之所以想知道这个是
  • 向现有 TCP 和 UDP 代码添加 SSL 支持?

    这是我的问题 现在我有一个 Linux 服务器应用程序 使用 C gcc 编写 它与 Windows C 客户端应用程序 Visual Studio 9 Qt 4 5 进行通信 是什么very在不完全破坏现有协议的情况下向双方添加 SSL
  • 混合 ExecutionContext.SuppressFlow 和任务时 AsyncLocal.Value 出现意外值

    在应用程序中 由于 AsyncLocal 的错误 意外值 我遇到了奇怪的行为 尽管我抑制了执行上下文的流程 但 AsyncLocal Value 属性有时不会在新生成的任务的执行范围内重置 下面我创建了一个最小的可重现示例来演示该问题 pr
  • 是否可以在 .NET Core 中将 gRPC 与 HTTP/1.1 结合使用?

    我有两个网络服务 gRPC 客户端和 gRPC 服务器 服务器是用 NET Core编写的 然而 客户端是托管在 IIS 8 5 上的 NET Framework 4 7 2 Web 应用程序 所以它只支持HTTP 1 1 https le
  • C# 模拟VolumeMute按下

    我得到以下代码来模拟音量静音按键 DllImport coredll dll SetLastError true static extern void keybd event byte bVk byte bScan int dwFlags
  • IEnumreable 动态和 lambda

    我想在 a 上使用 lambda 表达式IEnumerable
  • C# - OutOfMemoryException 在 JSON 文件上保存列表

    我正在尝试保存压力图的流数据 基本上我有一个压力矩阵定义为 double pressureMatrix new double e Data GetLength 0 e Data GetLength 1 基本上 我得到了其中之一pressur
  • Windows 和 Linux 上的线程

    我在互联网上看到过在 Windows 上使用 C 制作多线程应用程序的教程 以及在 Linux 上执行相同操作的其他教程 但不能同时用于两者 是否存在即使在 Linux 或 Windows 上编译也能工作的函数 您需要使用一个包含两者的实现

随机推荐