除法问题:将int返回类型转换为float,返回0

问题描述

这是作业的一部分,该作业与演员表无关,这是我自己尝试做的事情。

我在将int返回类型强制转换为除法函数中的float时遇到问题。尽管除法函数中的值正确,它仍然返回0。我已经阅读了很多有关int除法注意事项和四舍五入的文章,并且尝试了各种不同的解决方案,但无济于事。

我有一个可行的解决方案,可以仅从函数中进行打印,但是我试图在整个程序中保持一致并处理返回的值。

编辑(声明): 函数具有返回类型int,因为我试图使其返回类型与其他具有返回类型int的其他计算器函数保持一致(在调度表中)。我正在尝试查看是否有可能通过强制转换从具有int返回类型的函数中返回分数浮点数。

以下是相关的截断代码以重现该问题:

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <ctype.h>

#define MAXARGS 15
#define min(a,b) ((a) < (b) ? (a) : (b))

struct argList {
  int count;
  char *args[MAXARGS];
} argList;

//Division function
int divide(int c,struct argList l){
  float a = (strtol(l.args[0],NULL,0));
  float b = (strtol(l.args[1],0));
  printf("\nIn Func = %f\n",a/b);
  return (float)(a/b);
}

int main(int argc,char **argv) {

  int argCount = min(argc-1,MAXARGS); 

  int i = 0;
  for (i = 0,argv++; i<argCount; i++) {
    argList.args[i] = malloc(strlen(argv[i]+1));
    strncpy(argList.args[i],argv[i],strlen(argv[i])+1);
  }
  argList.count = i;


  printf("Out of Func = %f\n",(float)divide(argList.count,argList));
  
  return 0;
}

样本输出

./main 2 5

In Func = 0.400000
Out of Func = 0.000000


./main 10 5

In Func = 2.000000
Out of Func = 2.000000

第二个输入有效的事实使我相信它仍然是经常提到的整数除法/舍入问题。但是我认为函数调用和返回类型的转换可以避免该问题。

让我知道是否有人有解决此问题的想法。

编辑:尝试的解决方案:

使用strtofstrtod而不是强制转换为strol,投射一个操作数,同时转换两个操作数,创建一个单独的变量,乘以100.0f。

解决方法

至少这些问题:

代码正在查找某些参数的长度。由于分配的内存不足,此错误稍后会在以后的代码中导致不确定的行为(UB)。

// argList.args[i] = malloc(strlen(argv[i]+1));
argList.args[i] = malloc(strlen(argv[i]) + 1);

为什么要转换为整数,然后转换为float?转到float

// float a = (strtol(l.args[0],NULL,0));
float a = strtod(l.args[0],NULL);
// or better
float a = strtof(l.args[0],NULL);
,

如果将浮点数转换为int然后转换为浮点数。您可能永远都不会得到原始的浮动。

您需要的是获取内存中存在的内容并将其视为整数。要执行这种操作,您可以使用并集:

例如,您添加:

typedef union {
  float f;
  int   i;
} IF_t;

在除法功能中,您将打印和退货替换为:

IF_t r;
r.f = a/b;
printf("\nIn Func = %f\n",r.f);
return r.i;

,您将main中的printf替换为:

res.i = divide(argList.count,argList);
printf("Out of Func = %f\n",res.f);

当然您在主体中声明了IF_t res;