通过浮点计算将浮点转换为十进制

2024-06-22

我正在尝试转换浮点双精度值x精确到 12 位(正确舍入)有效数字的十进制。我假设x介于 10^110 和 10^111 之间,其十进制表示形式为x.xxxxxxxxxxxE110。而且,只是为了好玩,我尝试仅使用浮点运算。

我得到了下面的伪代码,其中所有操作都是双精度操作,符号1e98是最接近数学 10^98 的双精度数,并且1e98_2是最接近数学减法 10^98- 的结果的双精度数1e98。符号fmadd(X * Y + Z)用于与操作数进行融合乘加运算X,Y, Z.

  y = x * 2^-1074;    // exact
  q = y / 1e98;       // q is denormal and the significand of q interpreted
                      // as an integer is our candidate for the 12 decimal
                      // digits of x

  r = fmadd(q * 1e98 - y);  // close to 1e98 * (error made during the division)

  // If 1e98_2 >= 0, we divided by a number that was smaller than we wished
  // The correct answer may be q or q+1.

  if (r and 1e98_2 have opposite signs)
  {
    return the significand of q;
  }

  s = copysign(2^-1074, r);
  r1 = abs(r);
  r2 = abs(1e98_2);

  h = 1e98 * 0.5 * 2^-1074;

  Set rounding mode to downwards

  r3 = fmadd(r2 * q + r1);

  if (r3 < h)
  {
    return the significand of q;
  }
  else
  {
    return significand of (q + s)
  }

对于上述伪代码中的混乱,我深表歉意,但对我来说还不是很清楚,因此有以下问题:

  1. 第一个 fmadd 是否按预期工作(计算 1e98 *(除法期间发生的错误))?

  2. 标志。我无法说服自己他们是对的。但我也无法说服自己他们是错的。

  3. 关于该算法可能产生错误结果的频率有什么想法(也许是争论)吗?

  4. 如果它确实有效,那么如果将“q = y / 1e98”更改为“q = y * 1e-98”(保持所有其他指令相同),该算法是否有可能继续工作?

我没有测试过这个算法。我没有任何带有 fmadd 指令的计算机,尽管我希望找到一台计算机以便我可以执行上述命令。


Let y/d是精确的操作,并且q=rnd(y/d)将结果四舍五入到最接近的浮点数。
那么真实误差乘以 d 就是rt=(rnd(y/d)-y/d)*d=q*d-y我们用 fmadd 执行的操作是r=rnd(q*d-y)
Why q*d-y是精确的(fmadd 没有最终舍入)解释起来不太清楚,但可以这么说q*d位数有限(<nbits(q)+nbits(d)), 的指数y是那个q*d(+/- 1) 并且由于错误是|rt|<0.5*ulp(q)*d,这意味着首先nbits(q)正在消失……这回答了问题 1。

So q*1e98 - y = r, 在哪里|r|*2^1074 <= 0.5e98 < 5*10^98(第二个不等式是幸运的)

q*(10^98) - y = r + (10^98-1e98)*q where |10^98-1e98|*q*2^1074 <= 0.5e95(假设至少 15 位精度,log(2^53)/log(10) > 15)

所以你问是否|q*(10^98)-y|*2^1074>5*10^97

你有一个近似值|q*(10^98)-y|这是r+1e98_2*q

Since |r| < 5*10^98, and |r+(10^98-1e98)*q|<|r|如果符号相反,我认为问题 2 的答案是肯定的。但我不太确定 1e98_2 是否

If r and 1e98_2有相同的符号,它可能会超过5*10^97,因此您进一步处理讨论r3 = 1e98_2*q + r versus h=0.5e98*2^-1074

对于问题 3,乍一看,我认为有两件事可能导致算法失败:

  • 1e98_2不准确(10^98-1e98-1e98_2 = -3.6e63大约)

  • and h is not ht=0.5*10^98*2^-1074但正如我们上面看到的,要小一些。

真正的错误r3t大约是(1e98_2-3e63)*q + r < r3(只有 >0 时的情况才让我们感兴趣,因为 1e98_2>0)。

因此,当真实误差 r3t 低于真实 tie ht 时,误差 r3 的近似值落在近似 tie h 之上可能会导致不正确的舍入。是否可能?如果可以,您的问题 3 出现的频率是多少?

为了减轻上述不平等风险,您尝试截断 r3 的大小,因此r3 <= 1e98_2*q + r。我对错误界限进行真正的分析感到有点累......

所以我扫描了一个错误,我发现的第一个失败示例是 1.0000000001835e110 (我假设正确舍入到最接近的双精度,但实际上是 1000000000183.499999841537998211209154249426305282256955264919632918469 57919215885146546696544423465444842668032e98)。

在这种情况下,r and 1e98_2具有相同的符号,并且

  • (x/1e98) > 1000000000183.50000215

  • q因此有效数字被四舍五入为1000000000184

  • r3>h (r3*2^1074大约是。 5.000001584620017e97) 并且我们错误地增加了q+s,当它应该是q-s, 绝对是一个错误.

我的答案是:

  1. yes, r=fmadd(q * 1e98 - y)正好是 1e98*(除法时出错),但我们不关心除法,它只是提供一个猜测,重要的是减法是否准确。

  2. 是的,该符号是正确的,因为|r| < 5*10^98, and |r+(10^98-1e98)*q|<|r|如果符号相反。但我不太确定 1e98_2 是否

  3. 举第一个失败的例子(1.0000000001835e110 - 1.0e110)/1.0e110 ulp -> 1.099632e6,一个非常非常天真的猜想是说,一百万分之一的情况下,r3 会超过 h...所以一旦 q+s 纠正为 q-s,就会发生r3>h while r3t<ht无论如何,都比 1/1,000,000 小得多...感兴趣的范围内有超过 10^15 个双精度数,所以考虑这不是一个严肃的答案...

  4. 是的,上面的讨论只是关于猜测 q,与它的产生方式无关,并且 1. 中的减法仍然是准确的......

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

通过浮点计算将浮点转换为十进制 的相关文章

随机推荐

  • Ajax Jquery 调用重定向

    我是 ajax 的新手 我知道有人已经遇到过这个问题 我有一个基于 Spring MVC 构建的遗留应用程序 它有一个拦截器 过滤器 可以将用户重定向到登录 每当没有会话时页面 public class SessionCheckerInte
  • 哪个 Python 模块适合列表中的数据操作?

    我有一个 x y 和 z 坐标序列 需要对其进行操作 它们位于三个元组的一个列表中 例如 x1 y1 z1 x2 y2 z2 我需要加法 乘法和对数来处理我的数据 我想研究一个像 awk 语言一样强大的模块 我不确定你到底在追求什么 您可以
  • JasmineNodeOpts - 打印量角器测试结果

    背景 我使用 Jasmine 作为 Protractor 的测试框架 我一直在使用茉莉花规格记者 https www npmjs com package jasmine spec reporter用于报告 昨天我稍微改变了我的jasmine
  • 我的 32 位头痛现在变成了 64 位偏头痛?!? (或 64 位 .NET CLR 运行时问题)

    从在 64 位 JIT 下运行与 32 位 JIT 下运行 NET 应用程序切换到在 32 位 JIT 下运行时 在性能 内存等方面发生了哪些不寻常的 意想不到的后果 我对好的事情感兴趣 但对人们遇到的令人惊讶的坏问题更感兴趣 我正在编写一
  • 如何在 ggmap 中旋转地图视图?

    我希望将 ggmap 对象内的视图从默认的 up true North 旋转到我选择的自定义角度 但在 ggmap 或 get map 中找不到该选项 目前 我有以下代码 map1 lt get map location c 78 8722
  • 使用 msiexec 卸载应用程序时是否有 GUID 的替代方案?

    目前 我们在运行包含 msiexec 的卸载脚本时使用 GUID 来识别应用程序 我遇到的问题是每次安装最新版本的应用程序时 GUID 都会发生变化 所以我想知道是否有其他方法可以识别使用 msiexec 运行的应用程序 首先 应用程序新版
  • 在 flutter 中用 2 张图像设计背景

    我想创建一个新的无状态小部件类 它由 2 个图像 顶部 底部 和一条线 由函数定义 例如 x x 500 宽度 如果不应该绘制的话可以为 0 和颜色 分隔两个图像 对于每个像素 如果像素的 y 位置大于结果f x width 2底部的一个像
  • 如何将列表拆分为大小相等的块?

    如何将任意长度的列表拆分为大小相等的块 See also How to iterate over a list in chunks https stackoverflow com q 434287 To chunk strings see
  • Spring-SAML:传入的 SAML 消息无效

    我在将我的应用程序与 SAML 集成时遇到问题 以下是我的错误 org springframework security saml SAMLProcessingFilter attemptAuthentication Incoming SA
  • 使用 uWSGI 部署 Pylon

    我们正在尝试将我们的内联网迁移到 Pylons 我的老板正在尝试设置 Pylons 以在 Apache 后面使用 uWSGI 以便他可以设置多个独立的应用程序 然而 他在设置方面遇到了困难 uWSGI 的 C 源代码中存在一些明显的代码问题
  • 通过Shell脚本执行CQL?

    我正在尝试从 shell 脚本执行 CQL 命令 我能够连接到 cqlsh 我使用的 CQL 版本是 1 1 18 但无法将查询发送到 cql 有什么想法或建议如何继续进行吗 我是否需要连接到 Cassandra 并使用 shell 脚本执
  • 如何找出哪个依赖项导致特定库被下载?

    运行我的 SBT 项目时 控制台输出中有一行 info downloading http repository nexus content groups public org jboss netty netty 3 2 3 Final ne
  • iOS MDM 证书到期

    我正在创建 MDM 服务器 并已成功完成所有步骤 并且能够在设备上安装配置文件 在设备上安装的 mobileconfig 文件中 我们传递 SSL 证书 APNS 证书和配置文件信息 1 如果服务器上的SSL证书更改了怎么办 我想很多人没有
  • 如何在点击时触发/重新加载 Masonry 插件

    因为我有不同的选项卡 砌体不会加载隐藏的项目 所以当我单击新选项卡时 图像会彼此堆叠 我知道这个问题之前已被问过 并通过单击选项卡用触发砌体回答 但是如何我这样做不会弄乱第一个选项卡 目前正在调用砌体 function container
  • pandas 数据框 - 选择行并清除内存?

    我有一个大的 pandas 数据框 大小 3 GB x read table big table txt sep t header 0 index col 0 因为我在内存限制下工作 所以我对数据帧进行了子集化 rows calculate
  • 如何使用 HTML 表单发送隐藏的 PHP 变量

    我只是想如何使用 HTML 表单设置和发送 PHP 变量 从 first php 到 secondary php 实际上我的第一个代码看起来是这样的
  • Fluent nhibernate 自动映射集合

    我正在尝试使用 FNHib 自动映射来映射我的集合 我想解决的问题是 1 我希望项目中的所有集合都通过私有字段进行映射 我怎么能在全球范围内这么说呢 2 有没有什么方法可以自动映射双向关系 而无需显式覆盖我的每个实体 类 Organizat
  • 读取 JSON 文件错误

    我尝试用 Java 读取 JSON 文件 代码是 public static void main String args throws Exception InputStream is new FileInputStream j txt S
  • 如何防止插件执行有害代码

    我目前正在为我的学士论文开发一个非常模块化和基于插件的框架 主要思想是 我的应用程序结构中有一个名为plugins您可以在其中放置已编译的插件 例如 dll 文件 符合特殊接口IPlugin 然后 应用程序使用用户选择的插件执行任务 因此
  • 通过浮点计算将浮点转换为十进制

    我正在尝试转换浮点双精度值x精确到 12 位 正确舍入 有效数字的十进制 我假设x介于 10 110 和 10 111 之间 其十进制表示形式为x xxxxxxxxxxxE110 而且 只是为了好玩 我尝试仅使用浮点运算 我得到了下面的伪代