怎么算GCC中long double的值范围

friendmine 2005-07-06 04:34:00
我想知道怎么计算gcc中long double的值的范围.
在VC中对应的long double是一个80Bits长的浮点数.
但是在GCC中可以指定为96或128Bits,那么对应的值范围是多少呢.
高手请指点.
...全文
1071 7 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
7 条回复
切换为时间正序
请发表友善的回复…
发表回复
friendmine 2005-07-12
  • 打赏
  • 举报
回复
谢谢.
newbiestar 2005-07-07
  • 打赏
  • 举报
回复
根据Intel的文档的描述,双精度浮点的精度是53位,去掉1位,还有52位,总共还有12位可以给符号位以及指数位使用,符号位占据1位,剩下11位给指数位使用。而范围则是从2^(-1022)到2^(1023),换算成十进制,是2.23*10^(-308)到1.79*10^(308)

而long double本来的长度是80位,有效精度64位(实际63位),15位指数位,加上1符号位,中间还要加上一个integer bit(Intel的文档里面这么描述的,具体没有深入探究……),范围是2^(-16382)到2^(16383),十进制的为3.37*10(-4932)到1.18*10^(4932)

但是再一次强调,gcc下,long double就是double,真的需要long double只能靠汇编了……
newbiestar 2005-07-07
  • 打赏
  • 举报
回复
按照我这个程序的输出,gcc 3.4.2也是把long double直接当作double计算的……

不过到了Intel的CPU里面还是会被扩展到80位然后计算……

如果楼主不急的话,我可以帮你查查64位到底是怎么安排的(这样就不要自己算了……)
newbiestar 2005-07-07
  • 打赏
  • 举报
回复
IEEE float-point居然被变成了整数……

因为某些原因,GCC的long double在IA32上面必然是64位的(至少2.9.3是这样)。IA32的FPU实现的最大的浮点数长度是80bit的,如果真的成了96bit/128bit的话,就只能靠软件模拟计算了(又回到了不带FPU的80386时代……)。但是对于long double的使用sizeof操作符得到的大小是12,这个是byte alignment的问题。

安排起来的话还是按照双精度的安排……

具体的参考我这个程序的输出算吧……
#include <stdio.h>

int main(void)
{
long double val = 0xfffffff;
int sz = sizeof(val);
int i;
for(i = 0; i < sz; i++)
{
printf("%2.2x ", *((unsigned char*)&val + i));
}
printf("\n");
}
friendmine 2005-07-07
  • 打赏
  • 举报
回复
这个是不对的.如果是long long 当然可以这么算,不过long double 这么算是错的.
它里边有指数位,小数位与符号位.
而且还有些没有用到的添填位.
所以这是不正确的.
firstdreamer 2005-07-06
  • 打赏
  • 举报
回复
pow(2,96)=79228162514264337593543950336L
pow(2,128)=340282366920938463463374607431768211456L
考虑到正负数,剩下的问题就不用说了吧:)
  • 打赏
  • 举报
回复
帮顶

70,023

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧