可以在不损失重要性的情况下转换为二进制并返回十进制的最高有效十进制数字精度是 6 还是 7.225?

2024-01-11

我遇到过两种不同的浮点数精度公式。

⌊(N-1) log10(2)⌋ = 6 decimal digits (Single-precision)

and

N log10(2) ≈ 7.225 decimal digits (Single-precision)

Where N = 24有效位(单精度)

第一个公式位于“的第 4 页顶部”二进制浮点运算的 IEEE 标准 754 http://www.cs.berkeley.edu/~wkahan/ieee754status/IEEE754.PDF” 写的,W·卡汉教授.

第二个公式可以在维基百科文章“单精度浮点格式 http://en.wikipedia.org/wiki/Single-precision_floating-point_format” 部分下IEEE 754 单精度二进制浮点格式:binary32.

对于第一个公式,W. Kahan 教授说

如果十进制字符串至多 6 sig。十二月转换为 Single,然后转换回相同数量的 sig。十二月, 那么最终的字符串应该与原始字符串匹配。

对于第二个公式,维基百科说

...the total precision is 24 bits (equivalent to log10(224) ≈ 7.225 decimal digits).

两个公式的结果(6 和 7.225 十进制数字)是不同的,我希望它们是相同的,因为我假设它们都表示最高有效的十进制数字,可以转换为浮点二进制,然后再转换回来转换为十进制,其有效小数位数与开始时的位数相同。

为什么这两个数字不同,可以转换为二进制并返回十进制而不丢失重要性的最高有效十进制数字精度是多少?


这些谈论的是两个略有不同的事情。

The 7.2251 digits is the precision with which a number can be stored internally. For one example, if you did a computation with a double precision number (so you were starting with something like 15 digits of precision), then rounded it to a single precision number, the precision you'd have left at that point would be approximately 7 digits.

6位数字说的是可以保持的精度through从一串十进制数字到浮点数,然后返回到另一个十进制数字字符串的往返转换。

所以,假设我从一个像这样的数字开始1.23456789作为字符串,然后将其转换为 float32,然后将结果转换回字符串。当我完成此操作后,我可以期望 6 位数字完全匹配。不过,第七位数字可能会被四舍五入,所以我不一定期望它匹配(尽管它可能是原始字符串的+/-1。

例如,考虑以下代码:

#include <iostream>
#include <iomanip>

int main() {
    double init = 987.23456789;
    for (int i = 0; i < 100; i++) {
        float f = init + i / 100.0;
        std::cout << std::setprecision(10) << std::setw(20) << f;
    }
}

这会生成如下表:

     987.2345581         987.2445679         987.2545776         987.2645874
     987.2745972         987.2845459         987.2945557         987.3045654
     987.3145752          987.324585         987.3345947         987.3445435
     987.3545532          987.364563         987.3745728         987.3845825
     987.3945923          987.404541         987.4145508         987.4245605
     987.4345703         987.4445801         987.4545898         987.4645386
     987.4745483         987.4845581         987.4945679         987.5045776
     987.5145874         987.5245972         987.5345459         987.5445557
     987.5545654         987.5645752          987.574585         987.5845947
     987.5945435         987.6045532          987.614563         987.6245728
     987.6345825         987.6445923          987.654541         987.6645508
     987.6745605         987.6845703         987.6945801         987.7045898
     987.7145386         987.7245483         987.7345581         987.7445679
     987.7545776         987.7645874         987.7745972         987.7845459
     987.7945557         987.8045654         987.8145752          987.824585
     987.8345947         987.8445435         987.8545532          987.864563
     987.8745728         987.8845825         987.8945923          987.904541
     987.9145508         987.9245605         987.9345703         987.9445801
     987.9545898         987.9645386         987.9745483         987.9845581
     987.9945679         988.0045776         988.0145874         988.0245972
     988.0345459         988.0445557         988.0545654         988.0645752
      988.074585         988.0845947         988.0945435         988.1045532
      988.114563         988.1245728         988.1345825         988.1445923
      988.154541         988.1645508         988.1745605         988.1845703
     988.1945801         988.2045898         988.2145386         988.2245483

If we look through this, we can see that the first six significant digits always follow the pattern precisely (i.e., each result is exactly 0.01 greater than its predecessor). As we can see in the original double, the value is actually 98x.xx456--but when we convert the single-precision float to decimal, we can see that the 7th digit frequently would not be read back in correctly--since the subsequent digit is greater than 5, it should round up to 98x.xx46, but some of the values won't (e.g,. the second to last item in the first column is 988.154541, which would be round down instead of up, so we'd end up with 98x.xx45 instead of 46. So, even though the value (as stored) is precise to 7 digits (plus a little), by the time we round-trip the value through a conversion to decimal and back, we can't depend on that seventh digit matching precisely any more (even though there's enough precision that it will a lot more often than not).


1. That basically means 7 digits, and the 8th digit will be a little more accurate than nothing, but not a whole lot--for example, if we were converting from a double of 1.2345678, the .225 digits of precision mean that the last digit would be with about +/- .775 of the what started out there (whereas without the .225 digits of precision, it would be basically +/- 1 of what started out there).

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

可以在不损失重要性的情况下转换为二进制并返回十进制的最高有效十进制数字精度是 6 还是 7.225? 的相关文章

  • sqlite3-ruby gem:无法构建 gem 本机扩展

    Update 看看这个后续问题 Windows 上的 Gem 更新 它坏了吗 https stackoverflow com questions 134581 gem update on windows is it broken 在 Win
  • 由于 play-services-base-17.1.0.aar 转换错误,无法构建项目

    所以基本上我已经快一年没有打开我的 Android Studio 项目了 这次是打开和构建它的时候了 更新 Android Studio 和项目的所有插件后 我终于遇到了这个错误 Execution failed for task app
  • ListItem 附加自定义值

    我在asp net中使用dropdownlist 它有代表下拉列表项目的ListItem集合 每个ListItem只有两个字段来保存数据 Value和Text字段 但这些还不够 我想保存更多数据对于每个项目 假设附加字段中有 Text1 和
  • java8 Collectors.toMap() 限制?

    我正在尝试使用java8Collectors toMap on a Stream of ZipEntry 这可能不是最好的想法 因为在处理过程中可能会发生异常 但我想这应该是可能的 我现在收到一个我不明白的编译错误 我猜是类型推理引擎 这是
  • 将带有星号的注册表项传递给测试路径

    我想通过以下方式运行此注册表路径Test Path在 PowerShell 中 但它包含一个星号 该星号在注册表中有效 但在 Windows 路径中无效 问题是 当我通过它时 Test Path将星号视为通配符 因此这需要非常非常长的时间
  • 如何从 Magento One Page Checkout 获取发布数据?

    为了在 Magento Checkout 中添加客户评论字段 我在相应的模板文件中添加了一个文本字段 并使用如下观察器将评论添加到订单中 comment strip tags Mage app gt getRequest gt getPar
  • 如何将变量插入 PHP 数组?

    我在网上查了一些答案 但都不是很准确 我希望能够做到这一点 id result id info array id Example echo info 0 这有可能吗 您需要的是 不推荐 info array id Example varia
  • javax.persistence.Table.indexes()[Ljavax/persistence/Index 中的 NoSuchMethodError

    我有一个 Play Framework 应用程序 并且我was使用 Hibernate 4 2 5 Final 通过 Maven 依赖项管理器检索 我决定升级到 Hibernate 4 3 0 Final 成功重新编译我的应用程序并运行它
  • 如何获得 JavaScript 阶乘程序的循环来显示所使用的工作?

    你好 我面临着用 JavaScript 编写一个程序的挑战 尽管我对它不太了解 但它要求用户输入一个数字 然后计算该数字的阶乘 我使用了已经提出的问题并设法使计算正常工作 但无法获得所需的输出 我必须在以下输出中获取它 而不使用任何花哨的库
  • 用javascript调用外部网页(跨域)

    我正在尝试使用以下网络服务来验证提要这个问题 https stackoverflow com questions 11996430 check if a url is a valid feed 但浏览器不允许我向另一台服务器发送 ajax
  • 如何将十六进制字符串转换为无符号长整型?

    我有以下十六进制值 CString str str T FFF000 如何将其转换为unsigned long 您可以使用strtol作用于常规 C 字符串的函数 它使用指定的基数将字符串转换为 long long l strtol str
  • 在Python中停止ThreadPool中的进程

    我一直在尝试为控制某些硬件的库编写一个交互式包装器 用于 ipython 有些调用对 IO 的影响很大 因此并行执行任务是有意义的 使用 ThreadPool 几乎 效果很好 from multiprocessing pool import
  • Jackson 将单个项目反序列化到列表中

    我正在尝试使用一项服务 该服务为我提供了一个带有数组字段的实体 id 23233 items name item 1 name item 2 但是 当数组包含单个项目时 将返回该项目本身 而不是包含一个元素的数组 id 43567 item
  • 我可以将 MongoDB 与实体框架一起使用吗?

    实体框架有可能支持MongoDB数据库吗 有人写过实体框架MongoDB Provider吗 简短的回答 不 这肯定是可能的 但不合理 MongoDB 是文档数据库 不支持集合之间的任何物理关系 EF 非常适合 SQL MySQL 等关系数
  • 不区分大小写的字符串比较 C++ [重复]

    这个问题在这里已经有答案了 我知道有一些方法可以进行忽略大小写的比较 其中涉及遍历字符串或一个good one https stackoverflow com questions 11635 case insensitive string
  • Biopython 可以执行 Seq.find() 来解释歧义代码吗

    我希望能够在 Seq 对象中搜索考虑歧义代码的子序列 Seq 对象 例如 以下内容应该是正确的 from Bio Seq import Seq from Bio Alphabet IUPAC import IUPACAmbiguousDNA
  • 使用 VBA 通过 Access 导航网页/操作 IE

    你好 StackOverflow 社区 我有一个关于使用 Access VBA 操作 IE 的问题 本质上 我正在尝试编写代码 使用 IE 打开特定网页 在该页面中搜索特定链接 目标链接的名称将取决于用户的情况 通过以编程方式单击该链接导航
  • JQuery 删除和内存泄漏

    我正在开发一个游戏 我看到了很多内存消耗 我使用jquery animate 动画完成后 我 remove 元素 我的问题是 从 dom 树中删除一个元素后 对象还存在记忆中吗 Javascript 是一种垃圾收集语言 这意味着当没有代码保
  • OpenCV SIFT 描述符关键点半径

    我正在深入研究OpenCV的SIFT描述符提取的实现 https github com Itseez opencv blob master modules nonfree src sift cpp 我发现了一些令人费解的代码来获取兴趣点邻域
  • 窗口未定义 - Next.js 13 - 服务器组件中的客户端组件 - [重复]

    这个问题在这里已经有答案了 Leaflet 被导入到一个导入到客户端组件的文件中 那么为什么服务器运行它并抛出此错误呢 它实际上在重试后确实有效 并最终使网站正常运行 我尝试在内部使用动态导入useEffect 没有骰子 Reference

随机推荐

  • 如何在 MATLAB 中将字符串和矩阵写入 .txt 文件?

    我需要将数据写入 MATLAB 中的 txt 文件 我知道如何写字符串 fprintf or矩阵 dlmwrite 但我需要可以同时完成这两个任务的东西 我将在下面举一个例子 str This is the matrix mat1 23 4
  • PaintWorklet 无法在锚标记内工作

    当 Paint Worklet 放置在锚标记内时 它无法工作 示例站点 https codepen io lonekorean pen aYoJPv https codepen io lonekorean pen aYoJPv 上面的例子
  • gulp 被不规则地杀死

    我在运行 gulp 时遇到问题 因为它在任务期间会自行终止 我什么也没干 gt gulp build 11 25 34 Using gulpfile app app base frontend gulpfile js 11 25 34 St
  • GRPC服务发现

    给定一个地址GRPC http www grpc io 服务于 例如 ipv4 127 0 0 1 25000 是否有任何标准化查询或工具可以用来发现服务能够接收哪些 GRPC 请求 例如我正在寻找类似的东西 magic grpc serv
  • 使用 TCPDF 将现有 PDF 与动态生成的 PDF 合并

    我正在使用 TCPDF 生成 PDF 文档 我的要求是在动态生成的PDF的最后一页合并现有的PDF内容 到目前为止 解决您问题的最佳方法是使用FPDI https github com Setasign FPDI https github
  • 何时使用:Java 8+ 接口默认方法与抽象方法

    Java 8 允许默认实现接口中的方法 称为默认方法 http java dzone com articles introduction default methods 我很困惑什么时候会使用那种interface default meth
  • Spring Batch - 同时执行作业的多个实例

    我有一个澄清 我们是否可以同时运行一个作业的多个实例 目前 我们在任何给定时间都有一个作业实例 如果可能的话 请告诉我该怎么做 是的你可以 Spring Batch 根据 JobParameters 来区分作业 因此 如果您始终将不同的 J
  • Firebase 身份验证在 iOS 上使用 Capacitor Ionic

    我正在使用 Angular Fire 在 Ionic Capacitor 上进行 Firebase 身份验证 它在网络和 Android 上运行良好 但在 IOS 上不行 当我检查应用程序网络活动时 我意识到应用程序能够从 firebase
  • .Net UpdatePanel 和 javascript 已禁用

    这可能听起来 或者实际上是 一个愚蠢的问题 但我需要找到最好的方法来继续我正在进行的项目 我有一个多页网络表单 使用多视图控件 该多视图位于更新面板控件中 到目前为止一切都运行良好 我的问题是关于禁用 JavaScript 的用户 我注意到
  • Datagrid 中不同组合框的不同值

    请耐心等待 因为我是 WPF 的新手 我有一个包含组合框的数据网格
  • Pandas groupby 和聚合输出应包括所有原始列(包括未聚合的列)

    我有以下数据框并想要 记录分组依据month Sum QTY SOLDand NET AMT每个独特的UPC ID 每月 将其余列也包含在结果数据框中 我认为我可以做到这一点的方法是创建一个month列来聚合D DATES 然后求和QTY
  • 在 C# 字符串中转义双引号

    我试图逃避 and 在我的字符串中是这样的 text Replace Replace 但结果为text arash moeen 结果是 arash moeen 我怎样才能解决这个问题 只需使用 对于逐字字符串 text Replace th
  • 修补 nant 0.91 以使用 mono 4.0

    The Nant http nant sourceforge net 不支持单声道4 但幸运的是有 我下载了补丁 我也下载了source http nant sourceforge net nightly latest 我解压源代码并将补丁
  • 加载 FXML 时将参数传递给控制器​​[重复]

    这个问题在这里已经有答案了 我有一个登录屏幕 我想将登录 ID 从 LoginController 传递到 MainController 这样我就可以访问一些功能来更改密码等 我像这样加载控制器 FXMLLoader fxmlLoader
  • ValueError:不支持的格式字符'

    我从这里得到了以下大部分代码 使用python脚本生成pdf latex https stackoverflow com questions 8085520 generating pdf latex with python script u
  • 基于 Git 的内容管理? [关闭]

    Closed 这个问题不符合堆栈溢出指南 help closed questions 目前不接受答案 我正在寻找一个 Ruby CMS 或插件 可以提供和编辑位于 Git 存储库中的内容 我厌倦了将我的内容放在数据库中 用户 设置 评论 都
  • 致命错误:找不到类“PHPExcel_Shared_String”

    我已将 PHPExcel 用于我的 codeigniter 应用程序 它在本地主机中运行良好 但是当我将其托管到服务器时 出现以下错误 致命错误 在 xx xx xx 中找不到类 PHPExcel Shared String Third p
  • 为什么我的规则不能用简单的代数方程求解 X?

    我是 Prolog 新手 所以请保持温柔 这是我的规则 solve X A B A is 7 X 2 B is 3 X 4 显然 这里的正确答案是6 5 如果我把它交给 Prolog 它会证实 solve 6 5 yes 然而 如果我要求
  • Python解析日期字符串为date

    我正在尝试在 Python 中解析日期时间字符串 输入值的形式为 February 19 1989 到目前为止我一直在努力 datetime datetime strptime February 19 1989 B d y 但我总是出错 解
  • 可以在不损失重要性的情况下转换为二进制并返回十进制的最高有效十进制数字精度是 6 还是 7.225?

    我遇到过两种不同的浮点数精度公式 N 1 log10 2 6 decimal digits Single precision and N log10 2 7 225 decimal digits Single precision Where