假设浮点数在 C 中使用 IEEE754 浮点数表示是否安全?

2024-01-08

浮点是在 C 中定义的实现。因此没有任何保证。

我们的代码需要可移植,我们正在讨论是否可以在我们的协议中使用 IEEE754 浮点。出于性能原因,如果我们在发送或接收数据时不必在定点格式之间来回转换,那就太好了。

虽然我知道平台和架构之间在大小方面可能存在差异long or wchar_t。但我似乎找不到任何具体的float and double.

到目前为止我发现字节顺序可能在大端平台上颠倒。虽然有些平台不支持浮点,但其中的代码包含float and double甚至不会链接。否则平台似乎坚持 IEEE754 单精度和双精度。

那么可以安全地假设浮点在 IEEE754 中可用吗?

编辑:回应评论:

你对“安全”的定义是什么?

我所说的安全是指,一个系统上的位模式在另一个系统上意味着相同的位模式(在字节旋转处理字节序之后)。


基本上当前非打孔卡使用的所有架构,包括嵌入式架构和奇异信号处理架构,都提供以下两种浮点系统之一:

  • IEEE-754。
  • IEEE-754除了废话。也就是说,他们mostly实现 754,但在一些更昂贵和/或复杂的位上便宜。

最常见的低价促销:

  • 刷新非规格化为零。这使得某些有时有用的定理(特别是以下定理)无效:a-b可以精确地表示,如果a and b都在 2 的范围内),但实际上这通常不会成为问题。
  • 无法识别inf and NaN作为特别的。这些架构将无法遵循有关的规则inf and NaN作为操作数,并且可能不会饱和inf,而不是产生大于FLT_MAX,通常会被其他架构识别为NaN.
  • 除法和平方根的正确舍入。保证结果在准确结果的 1-3 ulp 范围内比在 1/2 ulp 范围内要容易得多。一个特别常见的情况是将除法实现为倒数+乘法,这会损失一点精度。
  • 更少或没有保护数字。这是一个不同寻常的便宜,但意味着其他操作可以节省 1-2 ulps。

但是……即使是那些除了废话架构仍然使用 IEEE-754 的数字表示形式。除了字节顺序问题之外,描述一个float or double架构 A 上的含义本质上保证在架构 B 上具有相同的含义。

因此,只要您关心的是价值观的表达,就完全没问题。如果您关心操作的跨平台一致性,您可能需要做一些额外的工作。

EDIT:正如 Chux 在评论中提到的,平台之间不一致的一个常见额外来源是使用扩展精度,例如 x87 的 80 位内部表示。这与廉价相反,并且(经过适当处理)完全符合 IEEE-754 和 C 标准,但它同样会导致架构之间、甚至编译器版本之间以及以下明显次要且不相关的代码之间的结果不同变化。但是:由于扩展的精度,特定的 x86/x64 可执行文件不会在不同的处理器上产生不同的结果。

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

假设浮点数在 C 中使用 IEEE754 浮点数表示是否安全? 的相关文章

随机推荐

  • 提起过滤器以强制 ssl

    在 struts 应用程序中 我有一个过滤器 强制只能通过重定向通过 https 访问某些页面 我正在考虑将其移植为 lift 所以我的问题是 在这种环境中 是否有一种 lift 方式来实现此类过滤器 或者它与 struts 中的类似 相同
  • Android:文本视图数组

    我正在制作一个应用程序 我想在其中更改字符串数组中文本视图的文本 为此 我需要制作文本视图数组 如何做到这一点 谁能帮我解决这个问题 您可以像这样创建 TextView int textViewCount 10 TextView textV
  • 使用 ActivityLifecycleCallbacks 自动记录 Android 生命周期事件?

    我正在尝试使用 ActivityLifecycleCallbacks 自动捕获和记录 Android 生命周期事件 但是至少可以说 有关此问题的文档很少 public void registerActivityLifecycleCallba
  • 通知系统设计

    我需要为我们自制的 ERP 系统设计通知系统 当不同的事情发生时 它会向用户发送通知 当前的系统很简单 如果发生了某些事情 例如 用户更改了用户个人资料中的电话号码 则会向会计师发送一封电子邮件 这里有一些缺点 如果用户更改了两次 会计师将
  • Java可扩展枚举

    有没有办法编写一个可以扩展的枚举 我希望有几种方法始终可用于我的枚举 例如 我对数据库字段使用枚举 我在数据库中包含实际的字段名称 public enum ORDERFIELDS OrderID Order ID private Strin
  • 如何在GWT中删除jsarray中的值?

    我有两个问题 1 是否可以使用 pop 方法删除 jsarray 中的任何值或仅删除最后一个值 2 如何从 jsarray 中删除或删除一个值 有人可以发布一个例子吗 这里是这样的 public JsArray
  • Gradle 任务将 Maven 存储库中的 jar 放入项目 lib 文件夹中

    http blog jonasbandi net 2014 03 running nodejs applications on jvm with html http blog jonasbandi net 2014 03 running n
  • 如何从 Android Studio 构建所有产品风格?

    我的 gradle 文件有很多风格 def versionName 1 19 def applicationId com site app productFlavors CafebazarPro applicationId applicat
  • 摆脱 ATLTRACE 输出中显示的 atlTraceGeneral 类别

    升级到 VS2013 后 我开始以 atlTraceGeneral 我的输出 格式接收所有 ATLTRACE2 消息 e g ATLTRACE T This is my data d n 124 显示为 dllmain cpp 1121 a
  • 用于记录方法调用和异常的 WCF 服务属性

    我需要记录 WCF 服务中的每个方法调用以及引发的任何异常 这导致了很多冗余代码 因为每个方法都需要包含类似于这样的样板 OperationContract public ResultBase
  • 用户点击我的 EditText 后如何执行某些操作

    我有一个EditText这显示了时间 用户点击后EditText我想展示一个TimePickerDialog 所以我设置了一个View OnClickListener to my EditText But the OnClickListen
  • git 如何跟踪远程存储库中的版本?

    我的理解是 当进行推送时 远程存储库中的代码会更新 git 实际上如何跟踪发布的版本 在 git flow 的上下文中 远程存储库是否还会随我的代码一起提取任何元数据 还是仅提取代码 我对使用 git flow 比较陌生 它更新远程跟踪分支
  • Jetpack Compose - 文本居中

    我正在使用 Jetpack Compose 创建一个简单的闪存卡 这个想法是 你点击闪存卡 它就会给你答案 但是 我陷入了一个基本问题 不幸的是 我什至找不到官方文档 所以我的学习风格一直信任自动更正系统 无论如何 我认为问题出在 Box
  • 如何正确分割这个字符串列表?

    我有一个这样的字符串列表 z 2 44 4 55 z 88 我怎样才能在列表中拆分这个字符串 使其类似于 z 2 44 4 55 z 88 我尝试过使用split然而 已经有方法将 44 分成 4 和 4 我不知道还能尝试什么 您可以使用正
  • 如何编写Linux驱动模块调用/使用另一个驱动模块?

    我正在开发一个 Linux 驱动程序可加载模块 我必须在我的驱动程序中使用另一个设备 某种驱动程序堆叠在另一个驱动程序上 如何在我的驱动程序中调用 使用其他驱动程序 我认为它们都在内核中 所以可能有一种方法可以直接使用另一个驱动程序 您将需
  • FileStream.close() 不会为其他进程释放文件

    我在 Page Load 调用的函数中有以下代码 启动 Visual Studio 后首次加载页面时 一切正常 但此后对文件的任何其他打开调用都会返回IOException File is in use by another process
  • Expo EAS:如何将eas更新分支与构建通道链接?

    我有一个带有 EAS 的 expo v 46 0 0 项目 具有以下构建配置 eas json cli version gt 1 1 0 build production channel production env APP ENV pro
  • 找不到 Flyway maven 插件

    在我的 pom xml 中 我有
  • 一般填充不同的类成员

    我正在开发一个具有多个 11 Web 服务调用的 Web 服务应用程序 对于每个 Web 服务 我需要从字符串数组填充 Soap Body 如下所示 if aMessage int DCSSCustomerUpdate V3 Branch
  • 假设浮点数在 C 中使用 IEEE754 浮点数表示是否安全?

    浮点是在 C 中定义的实现 因此没有任何保证 我们的代码需要可移植 我们正在讨论是否可以在我们的协议中使用 IEEE754 浮点 出于性能原因 如果我们在发送或接收数据时不必在定点格式之间来回转换 那就太好了 虽然我知道平台和架构之间在大小