【作者: zhxm_teacher】
为什么会出现floating point error:domain?
今天,一个朋友给了我这样一道程序:
#include <stdio.h>
float add(float a,float b)
{
float sum;
sum=a+b;
printf("%f",sum);
}
float sub(float a,float b)
{
float result;
result=a-b;
printf("%f",result);
}
int main()
{
float i,j;
scanf("%f%f",&i,&j);
add(i,j);
sub(i,j);
return(0);
}
于是理直气壮的问我,"看嘛,这个哪里错了嘛...".咋一看,确实没什么大错,运行结果后面跟个
floating point error:domain
这是编译器提示说,float指针指的区域不正确,于是我便分析.
首先看这个程序:
float add(float a,float b);是做加法运算
float sub(float a,float b);是做减法运算
可是主函数里面并不需要返回值呀,所以这是一个,还有一个具有返回值的函数也没有return来返回一个float这又是一个.于是我就把上面程序改成如下:
#include <stdio.h>
void add(float a,float b)
{
float sum;
sum=a+b;
printf("%f",sum);
}
void sub(float a,float b)
{
float result;
result=a-b;
printf("%f",result);
}
int main()
{
float i,j;
scanf("%f%f",&i,&j);
add(i,j);
sub(i,j);
return(0);
}
结果正确.
我把程序翻来覆去看了,觉得还是碍眼,于是只用一个函数,程序修改如下:
#include <stdio.h>
float add(float a,float b)
{
float sum;
sum=a+b;
printf("%f",sum);
}
int main()
{
float i,j;
scanf("%f%f",&i,&j);
add(i,j);
return(0);
}
结果也没有出现floating point error:domain,这下就奇怪了,我开始怀疑是这两个函数返回的float指针冲突.
于是我再做修改如下:
#include <stdio.h>
float add(float a,float b)
{
float sum;
sum=a+b;
printf("%f",sum);
}
float sub(float a,float b)
{
float result;
result=a-b;
printf("%f",result);
}
int main()
{
float i,j;
scanf("%f%f",&i,&j);
if(i<j)
add(i,j);
else
sub(i,j);
return(0);
}
OK,结果也正确.这里如果我们输入的i比j大就执行减法函数,如果i比j小舅执行加法函数.哈哈~ 这下我们可以初步判断是两个float函数返回冲突了.这样还不行,为什么冲突呢?
于是我又试,修改如下:
#include <stdio.h>
float add(float a,float b)
{
float sum;
sum=a+b;
printf("%f",sum);
}
float sub(float a,float b)
{
float result;
result=a-b;
printf("%f",result);
}
int main()
{
float i,j;
scanf("%f%f",&i,&j);
if(i<j)
add(i,j);
if(i>j)
sub(i,j);
return(0);
}
别看到只变了这么一点点,可是当我们输入i<j时又会出现floating point error:domain,但是我们输入i>j时就不会.这下我就不太明白了,怎么会出现这种情况呢?
这时,我就猜想,是不是因为函数调用时就返回一个float指针,如果两个float函数都调用,返回两个指针都未明确指定区域,那么就产生冲突,从而导致这种情况发生.猜想毕竟是猜想,偶们还是要拿点实际的东西来证明一下,才能体现科学的严密性.
于是我又给我的猜想做了个试验,修改程序如下:
#include <stdio.h>
float add(float a,float b)
{
float sum;
sum=a+b;
return(sum);
}
float sub(float a,float b)
{
float result;
result=a-b;
return(result);
}
int main()
{
float i,j;
float sum,result;
scanf("%f%f",&i,&j);
if(i<j)
sum=add(i,j);
if(i>j)
result=sub(i,j);
printf("i+j=%f\ni-j=%f",sum,result);
return(0);
}
结果正确!
总结,这就是我研究这个简单的问题的步骤,虽然我不敢说我这是正确的,但是目前能够通过大量的例子来解释这个问题.大家学任何一个东西也要有这种研究精神,那样才能把知识真正掌握.好了,今天就写到这里,等我下来再查些资料,进一步把这个问题阐述明白.明眼的朋友也会发现,其实这里还有很多问题,比如说照我这种解释那么if语句不管条件正确与否都要去返回后面的float指针?为什么else后面的编译程序就没返回float指针?等等....
好了,现在都要天亮了,今晚熬通宵太累了,休息一下,下次接到探讨.
【作者: zhxm_teacher】【访问统计:】【2005年09月13日 星期二 14:25】【 加入博采】【打印】
Trackback
你可以使用这个链接引用该篇文章 http://publishblog.blogchina.com/blog/tb.b?diaryID=2905370
[此贴子已经被作者于2006-2-27 21:00:42编辑过]
----------------解决方案--------------------------------------------------------
可能
----------------解决方案--------------------------------------------------------