将double转换为long double的算法

时间:2014-04-21 21:04:35

标签: c++ algorithm floating-point ieee-754

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

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

此外,如果有人可以列出算法的来源,那将是一件非常棒的事情,因为到目前为止,我找不到任何运气。

2 个答案:

答案 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 :(得分:1)

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

检查指数和尾数位以查找数字是无穷大,NaN,标准化数字,非规范化数字还是零,在需要时产生长双无穷大或NaN,调整标准化数字的指数并移动尾数位到正确的位置,添加隐式最高尾数位,将非规范化数字转换为规范化数字,并将零转换为长双零。