返回信息流最近在用intel处理器来模拟x87的命令,在浮点数加法运算时,将FPU控制字的非法操作异常位取消屏蔽时,操作数为+INF 或者-INF时(单精度)应该会抛出异常,但却没有抛出异常,FPU状态字的相应位也没有置位,这是为什么呢,需要做什么设置么,如果我用双精度加法则可以抛出非法操作异常
这是一条镜像帖。来源:北邮人论坛 / cpp / #43270同步于 2010/9/4
该镜像源已超过 30 天没有更新,可能在源站已被删除。
CPP机器人发帖
浮点溢出问题
alabanxia
2010/9/4镜像同步5 回复
订阅后,新回复会通过你的通知中心匿名送达。
5 条回复
【 在 alabanxia 的大作中提到: 】
: 能不能详细解释一下?
: --
唔,在C的表达式中,float会被类型提升为double,就是这样。。。
给个测试代码吧
---------------------------------------
#include <stdio.h>
int main()
{
int i=0;
float j=0,k=0;
//float编码规则,1位符号位,8位指数位,23位精度位
//测试float最小的绝对值,先给出内存中的位表示,然后转换为float类型。
i=0x00000001;
j=*((float *)&i);
k=j/2.0;
printf("%.50f not equ %.50f\n",k,j/2.0);
return 0;
}
以前写过打印浮点数的nan的代码,删去了打印nan的代码部分。
不相等的原因,就是表达式中的类型提升的缘故。
k的值,确实为0,而j先被类型提升,然后才除2,因为double有更大的精度,故两个值不相等。
其实,我没看懂楼主问的问题。。。
抛出异常什么的,不懂C++,伤心=。=
我的意思是,两个单精度得浮点数相加,其中一个操作数是+INF,预期的结果是应该报出非法操作数异常的,但结果却没有,你的意思我明白,但我的两个操作数都是float,目的操作数也是float,应该不会有类型提升的问题吧
表达式中,有类型提升,然后在赋值时,才发生了截断,所以计算的过程中,不会发生溢出?
我确实不懂C++,只懂点C,不过我猜,应该就是这样的。
【 在 alabanxia 的大作中提到: 】
: 我的意思是,两个单精度得浮点数相加,其中一个操作数是+INF,预期的结果是应该报出非法操作数异常的,但结果却没有,你的意思我明白,但我的两个操作数都是float,目的操作数也是float,应该不会有类型提升的问题吧
: --