浮点数越界或者无效-1.#IND000

float acos(float x)

参数x的范围为-1.0f到1.0f之间,返回值范围在0.0f到3.141592653f之间,值得注意的是:当x超出[-1.0f, 1.0f]这个范围时此函数将返回一个-1.#IND000值,代表无穷小而编译器会不给出任何提示,通常此将会导致程序错误或崩溃,所以以后要注意数学函数的参数范围了.

可以通过以下代码进行调试:

 float test = acos(1.0001f)
 if (test != test)
 {
       cout << "错误出现" << endl;
 }

昨天遇到的-1.#IND000,问余衍炳师兄,告诉我这是无穷小。但是我想用if(a==-1.#IND000)去判断,编译不过,呵呵 。

现在找到方法了   ,不过方法有点怪,astone指出,b!=b应该是恒为false,但在这个情况下竟然是true

 float a=10;
 float b=a/0;
 if( b > 0.0f ||b != b)
  printf("%f",b);

这个可以判断1.#INF000

 float a=-10;
 float b=a/0;
 if( b < 0.0f ||b != b)
  printf("%f",b);

这个可以判断-1.#IND000

加b!=b只用于.net 2003,在vC++6.0下不用。

       使用类似于pow, exp等等函数时常会产生一个无效数字1.#IND00,在VC下可以通过与一个确定数字比较大小来判断是否产生了无效数字,但这个方法在DEV-CPP下却是行不通的。

其实解决办法很简单,使用   float.h中一个函数_isnan即可:

int _isnan(double x);  
  
当x是一个无效值(NaN, Not a Number) 时,返回非零值
否则返回0.

一般可能是除数为零,使用数组时也经常出现这种情况

  • 2
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
首先,我们需要将-6.625转换为二进制数。这可以通过以下步骤完成: 1. 将6转换为二进制数:110 2. 将0.625转换为二进制数:0.101 现在我们将这两个二进制数组合起来,得到-6.625的二进制表示:110.101 接下来,我们需要将这个二进制数转换为科学计数法。首先,我们将小数点向左移动,直到只剩下一个非零数字。在这种情况下,我们需要将小数点向左移动两个位置,得到1.10101。 现在,我们需要将这个二进制数标准化,即将小数点移动到第一个非零数字前面。在这种情况下,我们需要将小数点向右移动一位,得到11.0101。 最后,我们需要将这个二进制数转换为科学计数法。在这种情况下,指数为1,因为我们将小数点向右移动了一位。因此,我们的科学计数法表示为:-1.10101 x 2^1。 现在,我们可以将这个科学计数法表示为IEEE 754单精度浮点数。首先,我们需要确定符号位。因为这是一个负数,符号位为1。 接下来,我们需要将指数位表示为8位二进制数。指数为1,加上偏移量127,得到128。因此,指数位为10000000。 最后,我们需要将尾数位表示为23位二进制数。我们将11.0101转换为二进制数,得到1.10101000000000000000000。 现在,我们可以将这些位组合起来,得到IEEE 754单精度浮点数表示为:1 10000000 10101000000000000000000。 因此,用IEEE 754 32位单精度浮点数表示-6.625的结果为:11000000110101000000000000000000。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值