【问题标题】:What is the definition of Convert_Single_Precision_To_Double_Precision_Floating_Point() in the Intel software developer manuals?英特尔软件开发人员手册中 Convert_Single_Precision_To_Double_Precision_Floating_Point() 的定义是什么?
【发布时间】:2015-11-11 14:17:12
【问题描述】:

Intel® 64 and IA-32 Architectures Software Developer Manuals 中,CVTPS2PDCVTSS2SD 指令的操作使用 Convert_Single_Precision_To_Double_Precision_Floating_Point() 伪代码函数来描述。

这个伪代码函数的定义是什么?

我搜索了合并的软件开发人员手册 (325462-056US),“操作”部分的 CVTPS2PDCVTSS2SD 是唯一提到此特定伪代码函数的两个地方。

编辑:特别是,如何处理单精度浮点数表示 SNaN、QNaN 或 ±Infinity 的极端情况?

【问题讨论】:

  • 它是伪的,只是一个占位符。实际实施可能是在英特尔内部开发的定制逻辑电路设计工具中完成的,而且肯定不会与任何人共享。你需要一个非常高倍的显微镜来观察硅结果:)
  • 将单精度转换为双精度并不是什么秘密。顺便说一句,该过程已经在 StackOverflow 上的某处进行了描述
  • 另一个方向(类似,只是更难):stackoverflow.com/questions/16737615/…
  • @PascalCuoq 我可能应该在我的问题中提到我对极端案例感兴趣。当前有一个活跃的pull request to the .NET CoreFX project,其中一个问题是当转换为double 时,代表NaN 或Infinity 的float 是否仍代表NaN 或Infinity。
  • 用我对会发生什么的最佳猜测更新了我的答案。如果您真的很偏执,那么在真实硬件上进行测试很容易。只需使用调试器并运行指令。我认为可以安全地假设每个 x86 CPU 都会为任何给定的输入提供相同的输出。

标签: floating-point x86


【解决方案1】:

据我了解,每个 32b 浮点数都可以用 64b 双精度数精确表示,因此不需要四舍五入或任何需要的东西,这使得这个函数太琐碎,英特尔懒得记录细节。

位如何移动/转换的实际细节相当复杂。我不会尝试总结,但请参阅 njuffa 的评论作为开始。关键是每个 32b 输入都有一个唯一的正确结果,因此您不需要知道它是如何实现的。结果将匹配所有其他正确的实现。

这不是英特尔 insn 参考手册中唯一使用函数而不定义函数的地方,如果名称足够长且描述性足够强以至于他们不需要的话。


Re:+/-Inf 和 NaN:我想不出任何充分的理由为什么 +/-Inf 会映射到 +/-Inf 以外的任何东西。

NaN has many unused bits,所以 IDK 是如何转换的。我假设 NaN 映射到 NaN,但唯一的问题是“有效载荷”会发生什么。我假设 SNaN -> SNaN 和 QNaN -> QNaN。

将这些浮点数映射到任何特定数字根本没有意义。您可以想象将float +Inf 映射到FLT_MAX 之后的下一个double,但这似乎是一个糟糕的想法,如果有人曾经以这种方式实现转换,我会感到震惊。

【讨论】:

  • “零填充”在谈论所需的指数操作时可能不是正确的术语。由于在 IEEE-754 浮点格式中,指数字段是有偏差的,所以从 binary32binary64 的转换涉及重新偏置指数。在这方面澄清答案可能是有利的。
  • @njuffa:谢谢,我不是 FP 专家。我知道这可能不会像零填充那么简单,但无论如何感谢您发现我的错误陈述。
猜你喜欢
  • 1970-01-01
  • 2014-08-02
  • 2018-08-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多