如何用c++编写可移植的浮点运算?

2024-03-24

假设您正在编写一个执行大量浮点运算的 C++ 应用程序。假设此应用程序需要在合理范围的硬件和操作系统平台上进行移植(例如 32 和 64 位硬件、32 和 64 位版本的 Windows 和 Linux...)。

您如何确保您的浮点运算在所有平台上都相同?例如,如何确保 32 位浮点值在所有平台上确实都是 32 位?

对于整数我们有stdint.h http://en.wikipedia.org/wiki/Stdint.h但似乎不存在等效的浮点。


[EDIT]

我得到了非常有趣的答案,但我想为这个问题添加一些精确性。

对于整数,我可以写:

#include <stdint>
[...]
int32_t myInt;

并确保无论我使用什么(C99 兼容)平台,myInt 都是 32 位整数。

如果我写:

double myDouble;
float myFloat;

我确定这会在所有平台上分别编译为 64 位和 32 位浮点数吗?


非 IEEE 754

一般来说,你不能。一致性和性能之间总是需要权衡,而 C++ 将其交给了您。

对于没有浮点运算的平台(例如嵌入式和信号处理处理器),您不能使用 C++“本机”浮点运算,至少不能移植。虽然软件层是可能的,但这对于此类设备来说肯定是不可行的。

对于这些,您可以使用 16 位或 32 位定点算术(但您甚至可能发现仅支持基本的 long - 而且 div 通常非常昂贵)。然而,这会比内置的定点运算慢得多,并且在基本的四个操作之后变得痛苦。

我还没有遇到过支持不同格式浮点的设备IEEE 754 http://en.wikipedia.org/wiki/IEEE_754。根据我的经验,最好的选择是希望有标准,因为否则您通常最终会围绕设备的功能构建算法和代码。什么时候sin(x)突然成本增加了 1000 倍,你最好选择一个不需要它的算法。

IEEE 754 - 一致性

我在这里发现的唯一不可移植性是当您期望跨平台获得相同的结果时。影响最大的是优化器。同样,您可以牺牲准确性和速度来换取一致性。大多数编译器都有一个选项 - 例如Visual C++ 中的“浮点一致性”。但请注意,这始终是准确性beyond标准的保证。

为什么结果变得不一致?首先,FPU 寄存器通常具有比双精度寄存器更高的分辨率(例如 80 位),因此只要代码生成器不存储回值,中间值就会以更高的精度保存。

其次,等价物如a*(b+c) = a*b + a*c由于精度有限,并不准确。尽管如此,如果允许的话,优化器可以使用它们。

另外 - 我从惨痛的教训中学到的 - 打印和解析功能在不同平台上不一定一致,可能也是由于数字不准确。

float

人们普遍误解浮点运算本质上比双精度运算快。通常,仅通过较少的缓存未命中,处理大型浮点数组就会更快。

请注意浮动精度。它可以在很长一段时间内“足够好”,但我经常看到它失败的速度比预期的要快。由于 SIMD 支持,基于浮点的 FFT 可以快得多,但在音频处理中很早就会产生显着的伪影。

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

如何用c++编写可移植的浮点运算? 的相关文章

  • 使用来自本地对象的消息的 std::Exception

    以下代码是否可以安全地抛出带有自定义消息的异常 include
  • HttpResponseMessage 的内容为 JSON

    我有一个 ASP NET MVC WEB API 由于多种原因 由于没有授权而重定向 我不能只使用一个简单的对象并在我的控制器方法中返回它 因此我需要 HttpResponseMessage 类来允许我重定向 目前我正在这样做 var re
  • 使用 QTextCursor 选择一段文本

    使用 Qt 框架选择文本片段时遇到问题 例如 如果我有这个文件 没有时间休息 我想选择 ime for r 并从文档中删除这段文本 我应该如何使用 QTextCursor 来做到这一点 这是我的代码 QTextCursor cursor n
  • 无法在更新面板中找到上传的文件

    aspx
  • C++17 中带有 noexcept 的 std::function

    在 C 17 中noexcept 已添加到类型系统中 http www open std org jtc1 sc22 wg21 docs papers 2015 p0012r1 html void r1 void f noexcept f
  • NUnit 测试运行顺序

    默认情况下 nunit 测试按字母顺序运行 有谁知道有什么方法可以设置执行顺序吗 是否存在这样的属性 我只是想指出 虽然大多数受访者认为这些是单元测试 但问题并没有具体说明它们是 nUnit 是一个很棒的工具 可用于各种测试情况 我可以看到
  • 使用 boost::iterator_facade<>

    我有一个链表结构 struct SomeLinkedList const char bar int lots of interesting stuff in here DWORD foo SomeLinkedList pNext 它是现有
  • ResourceDictionary 源中的 Uri 语法(通用 Windows 平台)

    我正在迁移我的Windows 8 1项目到Windows 10 通用 Windows 平台 这时我被拦住了ResourceDictionary改变在UWP 为了简单起见 我有包含 2 个项目的 Windows 8 1 解决方案 App pr
  • 了解 MVC-5 身份

    我创建了一个新的ASP NET MVC 5申请与Individual User Accounts然后更新了所有的Nuget packages在解决方案中 现在我尝试遵循一些教程中显示的一些指南 但遇到了一些问题 第一个是一个名为Applic
  • “volatile void function( ... )” 做了什么?

    我见过从语法角度来看 C 函数中 volatile 关键字有多少种用法 https stackoverflow com questions 7643528 how many usage does volatile keyword have
  • 最小对的总和

    Given 2N点 in a 2D plane 你必须将它们分组为N pairs使得所有对的点之间的距离的总和是最小可能值 所需的输出只是总和 换句话说 如果a1 a2 an分别是第一对 第二对 和第 n 对点之间的距离 则 a1 a2 a
  • 在标准库中静态链接时如何支持动态插件?

    假设一个应用程序myapp exe是使用构建的g 它使用标志 static libstdc 这样就可以安装在没有环境的情况下libstdc so myapp exe还添加了对某些功能的插件支持plugf可以通过动态加载dlopen来自共享库
  • 使用 for 循环创建链表

    这是我的结构 struct ListItem int data struct ListItem next 假设链表的第一个节点的 data 0 我想编写一个 for 循环来创建大小为 5 的链表 但我不知道如何工作 我尝试了以下方法 int
  • 带有 Unicode 字符的主机名在 Windows 8 中有效

    Uri CheckHostName 回报UriHostNameType Unknown到处都是 但在 Windows 8 上 它又回来了UriHostNameType Dns 为什么突然间带有 Unicode 西里尔字符的主机名在 Wind
  • 如何从句柄确定进程是 32 位还是 64 位?

    如何从使用 OpenProcess 获取的进程句柄中获取信息 无论进程是 32 位还是 64 位 是的 IsWow64Process 毫无用处 令人烦恼 它的真正意思是 启用了 32 位模拟 如果您在 32 位操作系统上运行 则返回 fal
  • 如何最好地为 Visual Studio 2017 构建的 CMake C++ 项目设置输出目录?

    我使用 Visual Studio 2017 使用 vcxproj 文件构建 C 桌面项目 我喜欢默认行为 其中输出目录是项目下面的子目录 例如 myproj sln myproj vcxproj x64 myproj release my
  • 在 C++ 中将大型数据向量写入/读取到二进制文件

    我有一个 C 程序 它通过将 ascii 文件中的网格人口数据读取到大型 8640x3432 元素双精度向量中来计算给定半径内的人口 将 ascii 数据读入向量大约需要 30 秒 循环每列和每行 而程序的其余部分只需要几秒钟 我被要求通过
  • 即使对于新上下文,OnModelCreating 也仅调用一次

    我有多个相同但内容不同的 SQL Server 表 在编写代码优先 EF6 程序时 我尝试为每个程序重用相同的数据库上下文 并将表名称传递给上下文构造函数 然而 虽然每次都会调用构造函数 但尽管每次都是从 new 创建数据库上下文 但 On
  • 字符串常量之前应有非限定 ID

    我目前正在编写一个 C 应用程序 它与 math h 结合实现了振荡器 我拥有的代码应该可以很好地用于该应用程序 尝试编译目标文件 但是我遇到编译器错误 很可能与语法 等有关 我认为这与命名空间有关 错误 终端输出 User Name Ma
  • 为什么 32 位 .NET 进程的引用类型的最小大小为 12 字节

    我正在读专业 Net 性能 https rads stackoverflow com amzn click com 1430244585本书有关参考类型内部结构的部分 它提到 对于 32 位 net 进程 引用类型具有 4 字节的对象头和

随机推荐

  • 运行yarn install时,如果一个模块不提供另一个模块,这意味着什么?

    当我跑步时yarn在我使用 firebase 的 React 应用程序上 我会收到几个警告 例如 firebase auth npm 0 14 5 c52f6 doesn t provide firebase email protected
  • 带冒号的 Javascript 内部函数

    我知道你可以写以下内容 var obj test something 但在这段代码中 内部函数引用的不是变量 而是函数 还有其他方法可以编写 调用内部函数吗 function outer var a Outerfunction consol
  • 如何制作可点击的 CSS3DObject

    我正在使用三个 JS CSS3DRenderer 尝试使 CSS3DObject 在单击时更新其position z 这是我的代码 var element document createElement div element style w
  • 使用 C# 执行 SSIS 包时出错

    我尝试执行一个非常简单的SSIS封装使用C 直接在 Visual Studio 2015 中启动时 此包运行良好 SSIS 包的名称是 Lesson 1 dtsx 我尝试使用开始这个过程C 使用以下代码 using System using
  • 搜索循环后网络抓取表格

    该表的 HTML 为 table border 1 width 100 tr class row0 td style width 30 strong TITLE strong td td style width 40 UNIQUE td t
  • 使用 RxJS 和 Angular2 限制并发 http 请求

    我以前见过这个问题 但回答总是让我不满意 所以我会尽量准确 我在用着https www npmjs com package rxjs https www npmjs com package rxjs想要对大量的 http 请求进行排队 并且
  • Pandas - 按行交错/压缩两个 DataFrame

    假设我有两个数据框 gt gt df1 0 1 2 0 a b c 1 d e f gt gt df2 0 1 2 0 A B C 1 D E F 如何交错行 即得到这个 gt gt interleaved df 0 1 2 0 a b c
  • 将文本添加到图像并保存

    在我的程序中 我允许用户输入一些文本 然后使用graphics DrawString 方法 当我然后去保存该图像时 它会保存没有文本的图像 如何将两者保存为一张图像 我看过一些例子 但没有一个有帮助 private void txtTool
  • 如何在 Ruby on Rails 中实现 Active Record 继承?

    如何实现活动记录的继承 例如 我想要一个动物类 狗类和猫类 模型和数据库表映射如何 Rails 支持单表继承 来自AR docs http api rubyonrails org classes ActiveRecord Base html
  • 构建服务器 (TFS2010) 需要安装 BizTalk 2010?

    是否需要 完整 BizTalk 2010 安装才能让生成服务器 TFS2010 生成 BizTalk 2010 解决方案 项目 据我所知 不需要安装 BizTalk 2010 您只需要以下组件 项目构建组件可在附加软件下使用 用于构建项目
  • Scala 中难以理解的语法

    我在本文中找到了以下代码 http hseeberger wordpress com 2010 11 25 introduction to category theory in scala http hseeberger wordpress
  • 为什么我在 Python 中的负切片不起作用?

    我是 Python 新手 已经阅读了一些有关切片的教程 但是我在空闲状态下运行的示例似乎没有返回我期望的结果 例如 我已将以下列表分配给变量a a 0 1 2 3 4 5 6 7 8 9 现在我明白切片是 number I want to
  • 用于检测文件在不同运行之间是否发生更改的Python库?

    假设我有一个程序 A 我运行它 并从文件 foo txt 开始执行一些操作 现在A终止 新运行 A 它检查文件 foo txt 是否已更改 如果文件发生变化 A 再次运行其操作 否则退出 是否存在这样的库函数 外部库 当然可以用md5 包含
  • 如何使用marklogic数据库进行数据实时处理

    我正在尝试评估数据实时处理的标记逻辑 早些时候 我使用 kafka 和 Storm 来实时处理数据 并在处理后插入到数据库中 我是 marklogic 的新手 所以有人可以告诉我 marklogic 中是否有任何可用的东西 我可以使用它来实
  • 将提交推送到已打开拉取请求的另一个用户的分支

    我在 github 上有一个存储库 我的存储库是由另一个用户分叉的 现在他提出了拉取请求 我想将一个提交从我的一端推送到他的功能分支 他已为此提出了 PR 这可能吗 这是我所做的 git pull remote ref other user
  • Powershell 重命名和压缩

    需要使用powershell重命名同一目录中的所有文件 源文件 1234 56789abc t1 20201 0 4 0 pdf 1234 56788def t2 20200 0 4 1 pdf 重命名的文件 1000 56789abc t
  • “while (true)”通常用于永久线程吗?

    我对编码还比较陌生 我的大部分 工作 只是简单的 GUI 应用程序 只能完成一件事 所以我不需要太多线程 不管怎样 关于线程 我想知道的一件事是 如果你想让线程永远保持活动状态以完成它正在执行的任何工作 处理 等待输入等 那么将其格式化是否
  • 交换字符串中的字符

    我是 python 新手 我想知道如何交换字符串中的两个字符 我知道字符串是不可变的 所以我需要找到一种方法来创建一个交换字符的新字符串 具体来说 一般方法采用字符串和两个索引 i j 并将 i 上的字符与 j 交换 正如您正确指出的那样
  • 运行 Fish shell 时,“pandas”导入 (Mac OS X) 时出现“未知区域设置:UTF-8”错误 [重复]

    这个问题在这里已经有答案了 我最近升级到 Python 3 5 和最新版本的 pandaspandas 0 17 1 但这对我来说打破了包裹 我使用的是 Mac OS X 10 9 5 使用 Fish shell 我能做些什么 cls cl
  • 如何用c++编写可移植的浮点运算?

    假设您正在编写一个执行大量浮点运算的 C 应用程序 假设此应用程序需要在合理范围的硬件和操作系统平台上进行移植 例如 32 和 64 位硬件 32 和 64 位版本的 Windows 和 Linux 您如何确保您的浮点运算在所有平台上都相同