如果double
是64位IEEE-754类型且long double
是80或128位IEEE-754类型,那么硬件(或编译器)使用的算法是什么? )为了执行转换:
double d = 3.14159;
long double ld = (long double) d;
此外,如果有人可以列出算法的来源,那将是一件非常棒的事情,因为到目前为止,我找不到任何运气。
答案 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,调整标准化数字的指数并移动尾数位到正确的位置,添加隐式最高尾数位,将非规范化数字转换为规范化数字,并将零转换为长双零。