如何计算转换规范 %.*f 的精度以保持浮点值的精度?

2023-12-25

注:此问题源自this https://stackoverflow.com/a/19897395/1778275 answer.

如何计算转换规范的精度%.*f保持浮点值的精度?

注意:这里的“保持精度”是指读回打印值后(例如,通过strtod or by scanf)结果值等于(NaN 除外)原始值(用于带有转换规范的打印%.*f).


至往返double(二进制浮点)值到十进制文本通过"%.*f"并回到相同的值需要最多DBL_DECIMAL_DIG(通常为 17 个)重要的 digits.

DBL_DECIMAL_DIGITS
小数位数 n,这样任何具有 p 基数 b 位的浮点数都可以四舍五入为具有 n 位小数位的浮点数,并且可以在不更改值的情况下再次舍入,
C23dr § 5.2.4.2.2 24

Any value magnitude >= 10DBL_DECIMAL_DIG - 1 printed with "%.0f" will print at least DBL_DECIMAL_DIG digits. It is only values smaller than that may require some digits after the decimal point.

int prec = DBL_DECIMAL_DIG - log10(fabs(x));
if (prec < 0) {
  prec = 0;
}
printf("%.*f\n", prec, x);

  • 需要护理int prec = DBL_DECIMAL_DIG - log10(fabs(x))因为非常接近 10 的幂的值可能会产生计算错误,从而导致差一错误。最好进行舍入,并且可能会产生 +1 精度。

  • Select double数值可以很容易地用更少的数字来表示。可以尝试逐步降低精度。

  • 无穷大、NaN 和零可能需要特殊处理。

  • 价值观关于-DBL_TRUE_MIN可能需要最长的string。这是关于2 /* "-0." */ - DBL_MIN_10_EXP + DBL_DECIMAL_DIG + 1 /* \0 */.


要找到最佳的最小格式精度:

#include <float.h>
#include <math.h>
#include <stdio.h>
#include <stdlib.h>

// Buffer size needed for all `double`
#define BUF_N (3 /* "-0." */ - DBL_MIN_10_EXP + DBL_DECIMAL_DIG + 1 /* \0 */)

// Untested code.  Grandparent duty calls.
// Needs review for off-by-1 errors.
int round_trip_precision_min(double x) {
  if (!isfinite(x) || x == 0.0) {
    return 0;
  }
  char buf[BUF_N + 10];  // 10 extra for margin
  int prec = (int) (DBL_DECIMAL_DIG - lround(log10(fabs(x))));
  if (prec < 0) {
    prec = 0;
  }
  // Try with less precision
  while (prec > 0) {
    sprintf(buf, "%.*f", prec - 1, x);
    if (atof(buf) != x) {
      break;
    }
    prec--;
  }
  return prec;
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何计算转换规范 %.*f 的精度以保持浮点值的精度? 的相关文章

  • EF Core Group By 翻译支持条件总和

    听说 EF Core 2 1 将支持翻译小组 我感到非常兴奋 我下载了预览版并开始测试它 但发现我在很多地方仍然没有得到翻译分组 在下面的代码片段中 对 TotalFlagCases 的查询将阻止翻译分组工作 无论如何 我可以重写这个以便我
  • C 编程 - 文件 - fwrite

    我有一个关于编程和文件的问题 while current NULL if current gt Id Doctor 0 current current gt next id doc current gt Id Doctor if curre
  • “构建”构建我的项目,“构建解决方案”则不构建

    我刚刚开始使用VS2010 我有一个较大的解决方案 已从 VS2008 成功迁移 我已将一个名为 Test 的控制台应用程序项目添加到解决方案中 选择构建 gt 构建解决方案不编译新项目 选择构建 gt 构建测试确实构建了项目 在失败的情况
  • 以文化中立的方式将字符串拆分为单词

    我提出了下面的方法 旨在将可变长度的文本拆分为单词数组 以进行进一步的全文索引处理 删除停止词 然后进行词干分析 结果似乎不错 但我想听听关于这种实现对于不同语言的文本的可靠性的意见 您会建议使用正则表达式来代替吗 请注意 我选择不使用 S
  • 在结构中使用 typedef 枚举并避免类型混合警告

    我正在使用 C99 我的编译器是 IAR Embedded workbench 但我认为这个问题对于其他一些编译器也有效 我有一个 typedef 枚举 其中包含一些项目 并且我向该新类型的结构添加了一个元素 typedef enum fo
  • 在哪里可以找到列出 SSE 内在函数操作的官方参考资料?

    是否有官方参考列出了 GCC 的 SSE 内部函数的操作 即 头文件中的函数 除了 Intel 的 vol 2 PDF 手册外 还有一个在线内在指南 https www intel com content www us en docs in
  • 用于登录 .NET 的堆栈跟踪

    我编写了一个 logger exceptionfactory 模块 它使用 System Diagnostics StackTrace 从调用方法及其声明类型中获取属性 但我注意到 如果我在 Visual Studio 之外以发布模式运行代
  • 在 Windows 窗体中保存带有 Alpha 通道的单色位图会保存不同(错误)的颜色

    在 C NET 2 0 Windows 窗体 Visual Studio Express 2010 中 我保存由相同颜色组成的图像 Bitmap bitmap new Bitmap width height PixelFormat Form
  • 在 ASP.NET 5 中使用 DI 调用构造函数时解决依赖关系

    Web 上似乎充斥着如何在 ASP NET 5 中使用 DI 的示例 但没有一个示例显示如何调用构造函数并解决依赖关系 以下只是众多案例之一 http social technet microsoft com wiki contents a
  • 使用 Bearer Token 访问 IdentityServer4 上受保护的 API

    我试图寻找此问题的解决方案 但尚未找到正确的搜索文本 我的问题是 如何配置我的 IdentityServer 以便它也可以接受 授权带有 BearerTokens 的 Api 请求 我已经配置并运行了 IdentityServer4 我还在
  • 如何在整个 ASP .NET MVC 应用程序中需要授权

    我创建的应用程序中 除了启用登录的操作之外的每个操作都应该超出未登录用户的限制 我应该添加 Authorize 每个班级标题前的注释 像这儿 namespace WebApplication2 Controllers Authorize p
  • 如何在 C 中调用采用匿名结构的函数?

    如何在 C 中调用采用匿名结构的函数 比如这个函数 void func struct int x p printf i n p x 当提供原型的函数声明在范围内时 调用该函数的参数必须具有与原型中声明的类型兼容的类型 其中 兼容 具有标准定
  • 垃圾收集器是否在单独的进程中运行?

    垃圾收集器是否在单独的进程中启动 例如 如果我们尝试测量某段代码所花费的进程时间 并且在此期间垃圾收集器开始收集 它会在新进程上启动还是在同一进程中启动 它的工作原理如下吗 Code Process 1 gt Garbage Collect
  • 如何从两个不同的项目中获取文件夹的相对路径

    我有两个项目和一个共享库 用于从此文件夹加载图像 C MainProject Project1 Images 项目1的文件夹 C MainProject Project1 Files Bin x86 Debug 其中有project1 ex
  • 通过指向其基址的指针删除 POD 对象是否安全?

    事实上 我正在考虑那些微不足道的可破坏物体 而不仅仅是POD http en wikipedia org wiki Plain old data structure 我不确定 POD 是否可以有基类 当我读到这个解释时is triviall
  • 将控制台重定向到 .NET 程序中的字符串

    如何重定向写入控制台的任何内容以写入字符串 对于您自己的流程 Console SetOut http msdn microsoft com en us library system console setout aspx并将其重定向到构建在
  • 如何将服务器服务连接到 Dynamics Online

    我正在修改内部管理应用程序以连接到我们的在线托管 Dynamics 2016 实例 根据一些在线教程 我一直在使用OrganizationServiceProxy out of Microsoft Xrm Sdk Client来自 SDK
  • C# - OutOfMemoryException 在 JSON 文件上保存列表

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

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

    Closed 这个问题正在寻求书籍 工具 软件库等的推荐 不满足堆栈溢出指南 help closed questions 目前不接受答案 有没有一种方法可以使用 NET 技术来录制屏幕 无论是桌面还是窗口 我的目标是免费的 我喜欢小型 低

随机推荐

  • 使用 @font-face 时,SVG 文本边框因浏览器而异?

    我试图通过使用 getBBox 方法获取边界框来根据文本的宽度和高度放置 SVG 文本元素 如果文本使用网络安全字体 则在不同浏览器中效果相当好 但如果使用 font face 和自定义网络字体设置文本样式 则在 Firefox Mac 和
  • JavaScript:推入对象内的数组?

    问题 如何将一个数组推入对象内的另一个数组 示例编码 var myObj arrayOne arrayTwo var arrayLetters A B obj arrayOne push arrayLetters RESULT arrayO
  • 在 JTable 中的单元格上方显示工具提示

    当用户在单元格中输入错误的值时 我需要在单元格上方 或下方 显示工具提示 参见下图 我有一个工具提示 但我需要一个点来将其显示在正确的位置 所以我想获取一个单元格位置 你知道如何得到这个吗 但是 如果您有更好的解决方案来实现这种行为 我愿意
  • Keras 拟合在第一个 epoch 结束时冻结

    我目前正在尝试使用 Keras 微调 VGG16 网络 我开始对猫和狗的数据集进行一些调整 然而 在当前的配置下 训练似乎在第一个时期被阻止 from keras import applications from keras preproc
  • 编译器 vs 解释器 vs 转译器

    在我参加的 ReactJS 会议中 演讲者使用了一个术语转译器对于一些代码转换 移植的发生 过去 我听说过编译器和解释器这两个术语 我在将用户编写的语言代码转换为计算机系统上可运行的形式的上下文中使用过 转译器对我来说是新的 转译器与编译器
  • SolrJ 和自动提交

    我正在使用 SolrJ API 将文档添加到 Solr 4 3 核心 我注意到我在我使用的库存 solrconfig 中将自动提交设置为 15 秒 如下所示
  • Rails - 通过 Active Storage 上传文件后在视图中显示图像

    我有一个正在进行中的项目5 1 2我正在尝试在其上实现活动存储 按照几个在线教程 我可以设置活动存储 并且可以看到保存在其中的数据active storage blobs and active storage attachments tab
  • 类型系列扩展无法按描述工作

    On 类型族的 Haskell wiki 页面 http www haskell org haskellwiki GHC Type families 有以下示例列表 type family F a type instance F Int I
  • git hook 获取合法提交消息(#123 好消息)

    我需要确保提交消息是合法的 否则拒绝它 提交消息应该类似于 123修复丢失的括号 我想确保它以哈希开头 有一个整数 没有 123a 并且消息至少有 10 个单词 很高兴有 消息不会连续完全相同 我正在使用这个 Trac 插件进行更改集 它更
  • 从传入 ASPX url 路由到 ASP.NET MVC 控制器操作

    我有一个 url Review aspx reviewId 3 我希望将此 url 路由到 MVC 控制器 操作 Review 3 有任何想法吗 没关系 像这样的简单路线是有效的 routes MapRoute Reviews Old Ro
  • Tcl 扩展:扩展的 ClientData 的生命周期

    重要的本机扩展将需要每个解释器的数据 动态分配的结构 我目前正在使用Tcl SetAssocData 有一个对应的密钥 扩展名和适当的删除例程 以防止此内存泄漏 然而 Tcl PkgProvideEx 也允许记录这样的 信息 该信息可以通过
  • 如何使用 PHP 和 sqlsrv 驱动程序清理输入?

    我正在开发一个使用 sqlsrv 驱动程序的 PHP MSSQL 项目 阻止 SQL 注入攻击的最佳方法是什么 我需要类似 mysql real escape string 的东西 但用于 sqlsrv 驱动程序 如果你像这样使用它 引用是
  • 使用 moment.js 如何给出持续时间的特定格式

    给定来自 API 的秒数持续时间duration seconds 86485 1天0小时1分1秒 我打算使用 moment js 将其转换为格式化的持续时间 如下所示 1 d hh mm ss 1d 00 01 01 2 d d hh h
  • Angular UI Router - 继承状态下的视图

    edit 根据 actor2019的回答 我想更新我的问题以更好地解释问题 Using Angular UI 路由器 https github com angular ui ui router v0 0 2 我已经将应用程序设置为在主 页面
  • 实体和DTO的区别

    DTO 和实体有什么区别 详细来说 这些是我的问题 DTO 应该有哪些字段 例如我的实体类是 Entity public class MyFirstEntity implements Serializable Id GeneratedVal
  • 使用 IN6ADDR_SETV4MAPPED 和双堆栈套接字

    这是一个延续将 IPv4 客户端连接到 IPv6 服务器 连接被拒绝 https stackoverflow com questions 16480729 connecting ipv4 client to ipv6 server conn
  • HTMLAgilityPack - 您需要将 UseIdAttribute 属性设置为 true 才能启用此功能

    我正在尝试将 HTMLAgilityPack 与 VS2008 Net 3 5 一起使用 即使我将 OptionUseIdAttribute 设置为 true 我也会收到此错误 尽管默认情况下它应该为 true Error Message
  • 如何在 Magento 核心 API 之外获取订单的送货/账单地址 ID?

    我想从 Magento 刚刚完成的订单中获取送货 帐单地址 ID 我已经尝试过以下代码 但它不起作用 Mage getModel 销售 订单 gt load array data order id gt getShippingAddress
  • PHP 可以选几门课?

    我在 Google 搜索中没有看到很多关于运行时 PHP 最大类处理的问题 假设我有一个自定义的 arrayaccess 类 它可以容纳最多 8k 个 User 类型的对象 自从arrayaccess类不允许我做 d 0 gt userna
  • 如何计算转换规范 %.*f 的精度以保持浮点值的精度?

    注 此问题源自this https stackoverflow com a 19897395 1778275 answer 如何计算转换规范的精度 f保持浮点值的精度 注意 这里的 保持精度 是指读回打印值后 例如 通过strtod or