2014-04-21 67 views
0

如果double是64位IEEE-754类型,而long double是80位或128位IEEE-754类型,那么硬件(或编译器)使用的算法是什么?为了执行转换:将double转换为long double的算法

double d = 3.14159; 
long double ld = (long double) d; 

而且,这将是惊人的,如果有人能列出源的算法,因为我已经没有运气找到一个迄今。

+4

看看你的编译器的汇编代码输出。 – OldProgrammer

+0

@OldProgrammer:无法弄清硬件是如何做到的。 –

+0

你没有找到解释可能是因为它类似于简单的操作,如扩大整数。查看想法的格式规范。取决于归一化和非规格化,只要将尾数和指数与0相加即可,或者确保它们具有相同的最终值(例如,正确的偏差)。你可能会过度复杂化它。 –

回答

3

对于像3.14159正常数字,步骤如下:

separate the number into sign, biased exponent, and significand 
add the difference in the exponent biases for long double and double 
    (0x3fff - 0x3ff) to the exponent. 
assemble the sign, new exponent, and significand (remembering to make the 
    leading bit explicit in the Intel 80-bit format). 

在实践中,在带有Intel的80位格式通用的硬件中,“转化率”是只是一个加载指令到x87堆栈(FLD)。除非在没有硬件支持的情况下定位平台,否则很少需要仔细研究实际的表示细节。

1

它在C标准中定义 - 谷歌N1570找到最新免费草稿的副本。由于所有“double”值都可以用“long double”表示,因此结果是具有相同值的长双倍值。我不认为你会找到硬件使用的算法的精确描述,但如果你看看数据格式,它是非常直接和明显的:

检查指数和尾数位以查找数字是否是无穷大,NaN,归一化数字,非规格化数字或零,在需要时产生长双倍Infinity或NaN,调整归一化数字的指数并将尾数位移到正确位置,添加隐式最高尾数位,将非规格化数字归一化数字,并且归零到长双零。

相关问题