鱼C论坛

 找回密码
 立即注册
查看: 2154|回复: 2

如何解决计算器程序中浮点数不能准确存储的问题

[复制链接]
发表于 2014-8-26 23:17:05 | 显示全部楼层 |阅读模式
5鱼币
写了一个计算器,可是有些浮点数不能准确存储如何解决这个问题?求大神指教。
  1. #include<stdio.h>
  2. #include<stdlib.h>
  3. #include<ctype.h>
  4. #include<string.h>
  5. #include<math.h>

  6. #define MAX 100

  7. void  shu(char *p,float *s, int n) //取出z数组中的数字存放到s数组。
  8. {
  9.         int i, k = 0, j = 0;
  10.         char temp[MAX] = {0};         //用来临时存放要计算的数字字符
  11.        
  12.     for(i = 0;i < n;i++)
  13.         {
  14.                 if(isalnum(p[i])||p[i]=='.')
  15.                 {
  16.                         temp[k] = p[i];
  17.                         k++;
  18.                 }
  19.                 else
  20.                 {
  21.                         s[j] = atof(temp);
  22.                         memset(temp, 0, k);
  23.                         k = 0;
  24.                         j++;
  25.                        
  26.                 }
  27.         }
  28.         s[j] = atof(temp);
  29. }



  30. void fu(char *p,char *f,int n)  //取出z数组中的运算符放到f数组。
  31. {
  32.         int i, j = 0;
  33.        
  34.         for(i = 0;i < n;i++)
  35.         {
  36.                 if(p[i] == '+' || p[i] == '-' || p[i] == '*' || p[i] == '/')
  37.                 {
  38.                         f[j] = p[i];
  39.                         j++;
  40.                 }
  41.                
  42.         }
  43.        
  44. }



  45. void ji(float *s, char *f,char *z)   //计算表达式。
  46. {
  47.         int len, i = 0, k;
  48.        
  49.         len = strlen(f);
  50.     while(f[i] != '\0')
  51.         {
  52.                 if(f[i] == '*' || f[i] == '/')
  53.                 {
  54.                         if(f[i] == '*')
  55.                                 s[i] = s[i] * s[i+1];
  56.                         else
  57.                                 s[i] = s[i] / s[i+1];
  58.                         for(k = i+1;k <= len;k++)
  59.                         {
  60.                                 s[k] = s[k+1];
  61.                                 f[k-1] = f[k];
  62.                         }
  63.                         i = 0;
  64.                 }
  65.                 else
  66.                         i++;
  67.         }
  68.        
  69.         i = 0;
  70.         len = strlen(f);
  71.         while(f[i] != '\0')
  72.         {
  73.                 if(f[i] == '+')
  74.                         s[i] = s[i] + s[i+1];
  75.                 else if(f[i] == '-')
  76.                         s[i] = s[i] - s[i+1];
  77.                 for(k=i+1;k <= len;k++)
  78.                 {
  79.                         s[k] = s[k+1];
  80.                         f[k-1] = f[k];
  81.                 }
  82.         }
  83.        
  84.         printf("%s = %0.2f", z , s[0]);
  85.        
  86.         getchar();
  87.        
  88.        
  89.        
  90. }



  91. int main(void)
  92. {
  93.         int i, len;
  94.         char ch;
  95.         char z[MAX] = {0};  //用来存放用户输入的运算式。
  96.         char f[MAX] = {0};  //用来存放z数组中的运算符。
  97.         float s[MAX] = {0}; //用来存放z数组中的数字。

  98.        
  99.         printf("请输入要计算的式子:\n");
  100.        
  101.        
  102.         ch=getchar();
  103.         for(i = 0; ch !='\n'; i++)
  104.         {
  105.                 z[i] = ch;
  106.                 ch = getchar();
  107.         }
  108.        
  109.        
  110.         len=strlen(z);   //计算用户输入字符数组长度
  111.         shu (z, s, len); //取数字
  112.         fu (z, f, len);  //去运算符
  113.         ji (s, f, z);    //计算结果并输出
  114.        
  115.        
  116.         return 0;
  117. }
复制代码


最佳答案

查看完整内容

浮点数的表示范围是负无穷,到正无穷,而浮点数要么是4字节,要么是8字节。用有限字节表示无限的数,就不可能准确表示。所以要准确表示,就不能用float和double,而要用多个int(火int数组)来模拟浮点数
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2014-8-26 23:17:06 | 显示全部楼层
浮点数的表示范围是负无穷,到正无穷,而浮点数要么是4字节,要么是8字节。用有限字节表示无限的数,就不可能准确表示。所以要准确表示,就不能用float和double,而要用多个int(火int数组)来模拟浮点数
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2014-8-27 19:33:50 | 显示全部楼层
没有人么?
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-5-21 06:49

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表