Floating point “英特尔软件开发人员手册”中“将单精度转换为双精度浮点”的定义是什么?

Floating point “英特尔软件开发人员手册”中“将单精度转换为双精度浮点”的定义是什么?,floating-point,x86,Floating Point,X86,在中,使用Convert_Single_Precision_To_Double_Precision_Floating_Point()伪代码函数描述CVTPS2PD和CVTSS2SD指令的操作 这个伪代码函数的定义是什么 我搜索了组合软件开发人员手册(325462-056US),而CVTPS2PD和CVTSS2SD的“操作”部分是唯一提到此特定伪代码功能的两个地方 编辑:特别是,如何处理单精度浮点数表示SNaN、QNaN或±无穷大的角点情况?据我所知,每个32b浮点可以精确地表示为64b双精度,因

在中,使用Convert_Single_Precision_To_Double_Precision_Floating_Point()伪代码函数描述
CVTPS2PD
CVTSS2SD
指令的操作

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

我搜索了组合软件开发人员手册(325462-056US),而
CVTPS2PD
CVTSS2SD
的“操作”部分是唯一提到此特定伪代码功能的两个地方


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

据我所知,每个32b浮点可以精确地表示为64b双精度,因此不需要进行舍入或任何操作,使此函数过于琐碎,英特尔无法记录详细信息

位如何移动/转换的实际细节相当复杂。我不打算做总结,但先看看njuffa的评论。关键是每个32b输入都有一个唯一正确的结果,所以您不需要知道它是如何实现的。结果将与其他每一个正确的实现相匹配

“英特尔insn ref”手册中,如果函数名足够长且描述性强,他们不需要定义函数,那么这并不是唯一一个使用函数的地方


Re:+/-Inf和NaN:我想不出任何好的理由来解释+/-Inf映射到+/-Inf之外的任何东西

,所以我想知道这些是如何转变的。我假设NaN映射到NaN,但唯一的问题是“有效载荷”会发生什么变化。我假设SNaN->SNaN和QNaN->QNaN


将这些浮动映射到任何特定的数字都毫无意义。您可以想象将
float
+Inf映射到
FLT\u MAX
之后的下一个
double
,但这似乎是一个糟糕的想法,如果有人以这种方式实现转换,我会感到震惊。

它是伪的,只是一个占位符。实际实现很可能是在英特尔内部开发的自定义逻辑电路设计工具中完成的,而且肯定不会与任何人共享。你需要一个相当高倍的显微镜来观察硅的结果:)把单精度转换成双精度并没有什么秘密。顺便说一句,StackOverflow上的某个地方已经从另一个方向描述了该程序(类似,只是更难):@PascalCuoq我可能应该在我的问题中提到,我对拐角案例感兴趣。目前有一个活跃的问题,其中一个问题是,当转换为
双精度
时,代表NaN的
浮点
或无穷大是否仍然代表NaN或无穷大。更新了我的答案,并给出了我对所发生情况的最佳猜测。如果你真的有妄想症,在真正的硬件上测试是很容易的。只需使用调试器并运行指令。我认为可以安全地假设每个x86 CPU都会为任何给定的输入提供相同的输出。“零填充”在谈论所需的指数操作时可能不是正确的术语。由于在IEEE-754浮点格式中,指数字段是有偏差的,因此从
binary32
binary64
的转换涉及到重新偏置指数。澄清这方面的答案可能有好处。@njuffa:谢谢,我不是FP专家。我知道这可能不会像零填充那么简单,但无论如何,谢谢你抓住了我的错误陈述。