浮点数乘除法.docVIP

  1. 1、本文档共8页,可阅读全部内容。
  2. 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
  3. 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  4. 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
  5. 5、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
  6. 6、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们
  7. 7、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
  8. 8、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
浮点数乘除法

浮点数乘除法 主页 技术资源库 学习 下载 支持 社区 登录 | Colombia - Espa?ol | 首选项 MSDN Library 技术文章 Visual Studio 2003 Microsoft Visual C++ 浮点优化 Microsoft Visual C++ 浮点优化 Visual Studio .NET 2003 发布日期 : 7/8/2004 | 更新日期 : 7/8/2004 Eric Fleegal Microsoft Corporation 适用于:Microsoft Visual C++ 摘要:了解如何使用 Microsoft Visual C++ 2005(以前称为 Visual C++“Whidbey”)的浮点语义管理方法来优化浮点代码。创建快速程序,同时确保仅对浮点代码执行安全优化。 本页内容 C++ 中的浮点代码优化 浮点语义的 fp:precise 模式 浮点语义的 fp:fast 模式 浮点语义的 fp:strict 模式 fenv_access 杂注 fp_contract 杂注 float_control 杂注 启用浮点异常语义 相关书籍 C++ 中的浮点代码优化 C++ 优化编译器不仅能够将源代码转换为机器码,而且能够对机器指令进行适当的排列以便改善性 能和/或减小大小。遗憾的是,许多常用的优化在应用于浮点计算时未必安全。在下面的求和算法 [1] 中,可以看到这方面的一个恰当的示例: float KahanSum( const float A[], int n ) { float sum=0, C=0, Y, T; for (int i=0; in; i++) { Y = A[i] - C; T = sum + Y; C = T - sum - Y; sum = T; } return sum; } 该函数将数组向量 A 中的 n 个浮点值相加。在循环体中,算法计算 一个“修正”值,然后将其应用于求和的下一步。与简单的求和相比,该方法大大减小了累积性舍入 误差,同时保持了 O(n) 时间复杂性。 一个不完善的 C++ 编译器可能假设浮点算法遵循与实数算法相同的代数规则。这样的编译器可能 继而错误地断定 C = T - sum - Y == (sum+Y)-sum-Y == 0; 也就是说,C 得到的值总是常量零。如果随后将该常量值传播到后续表达式中,循环体将化简为简 单的求和。更准确地说,就是 Y = A[i] - C == Y = A[i] T = sum + Y == T = sum + A[i] sum = T == sum = sum + A[i] 因此,对于不完善的编译器而言,KahanSum 函数的逻辑转换将是: float KahanSum( const float A[], int n ) { float sum=0; // C, Y T are now unused for (int i=0; in; i++) sum = sum + A[i]; return sum; } 尽管转换后的算法更快,但它根本没有准确表达程序员的意图。精心设计的误差修正已经 被完全消除,只剩下一个具有所有其关联误差的简单的直接求和算法。 当然,完善的 C++ 编译器知道实数算法的代数规则通常并不适用于浮点算法。然而,即使是完善 的 C++ 编译器,也可能错误地解释程序员的意图。 考虑一种常见的优化措施,它试图在寄存器中存放尽可能多的值(称为“登记”值)。在 KahanSum 示例中,这一优化可能试图登记变量 C、Y 和 T,因为这些变量仅在循环体内使用。如果寄存器精度为 52 位(双精度)而不是 23 位(单精度),这一优化可以有效地将 C、Y 和 T 的类 型提升为 double。如果没有以同样的方式登记 sum 变量,则它仍将编 码为单精度。这会将 KahanSum 的语义转换为下面的语义 float KahanSum( const float A[], int n ) { float sum=0; double C=0, Y, T; // now held in-register for (int i=0; in; i++) { Y = A[i] - C; T = sum + Y; C = T - sum - Y; sum = (float) T; } return sum; } 尽管现在 Y、T 和 C

文档评论(0)

ah82299 + 关注
实名认证
文档贡献者

该用户很懒,什么也没介绍

1亿VIP精品文档

相关文档