c语言浮点数的一个问题 20
#include<stdio.h>voidmain(){printf("%.30f",0.8*0.8*0.8*0.8*0.8);}以上代码执行的结果居然是0.327680...
#include<stdio.h>
void main()
{
printf("%.30f",0.8*0.8*0.8*0.8*0.8);
}
以上代码执行的结果居然是0.327680000000000140
谁能告诉我为什么?
这个问题我是在做狄拉克的猴子分桃时出现的代码如下
#include <stdio.h>
#include <math.h>
#include <conio.h>
void main()
{
double x;//未分之前的桃子数
double y,z;//分完5次以后的结果
x=1.0;
do
{
x+=5;
y=(((((x-1)/5*4-1)/5*4-1)/5*4-1)/5*4-1)/5*4;
z=x*1024/3125-1024.00/3125-256.00/625-64.00/125-16.00/25-4.00/5;//就是上一步展开计算的结果
} while(ceil(y)!=floor(y));//如果这里用z作为判断,就不能得到正确的结果x=3121,y=1020
printf("\n分之前%.2f 最后剩%.2f",x,y);
getch();
}
为什么采用y的写法就不会出错,而使用z的写法就要出错呢?
当x=3121时,
y的结果是1020.0000000000000
z的结果是1020.0000000000002
再说了,z这个表达式的小数位最多才5位,不会这样就开始有误差了吧!
呵呵,搞明白了,表达式z=是多次浮点数相加计算产生误差。不过还是谢谢大家! 展开
void main()
{
printf("%.30f",0.8*0.8*0.8*0.8*0.8);
}
以上代码执行的结果居然是0.327680000000000140
谁能告诉我为什么?
这个问题我是在做狄拉克的猴子分桃时出现的代码如下
#include <stdio.h>
#include <math.h>
#include <conio.h>
void main()
{
double x;//未分之前的桃子数
double y,z;//分完5次以后的结果
x=1.0;
do
{
x+=5;
y=(((((x-1)/5*4-1)/5*4-1)/5*4-1)/5*4-1)/5*4;
z=x*1024/3125-1024.00/3125-256.00/625-64.00/125-16.00/25-4.00/5;//就是上一步展开计算的结果
} while(ceil(y)!=floor(y));//如果这里用z作为判断,就不能得到正确的结果x=3121,y=1020
printf("\n分之前%.2f 最后剩%.2f",x,y);
getch();
}
为什么采用y的写法就不会出错,而使用z的写法就要出错呢?
当x=3121时,
y的结果是1020.0000000000000
z的结果是1020.0000000000002
再说了,z这个表达式的小数位最多才5位,不会这样就开始有误差了吧!
呵呵,搞明白了,表达式z=是多次浮点数相加计算产生误差。不过还是谢谢大家! 展开
展开全部
未定义变量,直接运算的结果
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
你是说后面的140么?计算机计算是有误差的,这个是正常的,比如有些地方判断一个数是不是等于0,不是用(a==0)而是判断这个数的绝对值是不是小于10的-6次方,如果比这个小,就认为是0,这个在清华大学出版社,潭浩强,的那本C语言上有讲解
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
float 浮点数精度只有 有效数字 7到8 位
.32768000 以后的数字 不可靠,它是计算机截断误差产生的。
double 浮点数精度也只有 14-15位
.32768000 以后的数字 不可靠,它是计算机截断误差产生的。
double 浮点数精度也只有 14-15位
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询