除法问题:将 int return 类型转换为 float,returning 0
Issues with division: casting an int return type to float, returning 0
这是作业的一部分,作业与选角无关,这是我自己想做的事情。
我在将除法函数中的 int return 类型转换为 float 时遇到问题。它保持 returning 0,尽管在除法函数中有正确的值。我已经阅读了很多关于 int 除法注意事项和四舍五入的不同帖子,并且我尝试实施各种不同的解决方案都无济于事。
我有一个仅从函数内部打印的可行解决方案,但我试图在整个程序中保持一致并处理 returned 值。
编辑(清晰度): 除法函数有一个 return 类型的 int 因为我试图保持它的 return类型与具有 return 类型 int 的一堆其他计算器函数一致(在调度 table 中)。我正在尝试查看是否有可能通过转换从具有 int return 类型的函数 return 小数浮点数。
这里是重现问题的相关截断代码:
#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], NULL, 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
第二个输入有效的事实让我相信它仍然是经常提到的整数 division/rounding 的问题。但我认为通过函数调用和 return 类型的转换可以避免该问题。
如果有人有任何解决此问题的想法,请告诉我。
编辑:尝试的解决方案:
转换一个操作数,转换两个操作数,创建一个单独的变量,乘以 100.0f,使用 strtof
和 strtod
而不是转换为 strol
.
至少这些问题:
代码正在寻找一些参数的长度。由于分配的内存不足,此错误随后会在以后的代码中导致 未定义的行为 (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;
在 divide 函数中,您将 print 和 return 替换为:
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;
。
这是作业的一部分,作业与选角无关,这是我自己想做的事情。
我在将除法函数中的 int return 类型转换为 float 时遇到问题。它保持 returning 0,尽管在除法函数中有正确的值。我已经阅读了很多关于 int 除法注意事项和四舍五入的不同帖子,并且我尝试实施各种不同的解决方案都无济于事。
我有一个仅从函数内部打印的可行解决方案,但我试图在整个程序中保持一致并处理 returned 值。
编辑(清晰度): 除法函数有一个 return 类型的 int 因为我试图保持它的 return类型与具有 return 类型 int 的一堆其他计算器函数一致(在调度 table 中)。我正在尝试查看是否有可能通过转换从具有 int return 类型的函数 return 小数浮点数。
这里是重现问题的相关截断代码:
#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], NULL, 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
第二个输入有效的事实让我相信它仍然是经常提到的整数 division/rounding 的问题。但我认为通过函数调用和 return 类型的转换可以避免该问题。
如果有人有任何解决此问题的想法,请告诉我。
编辑:尝试的解决方案:
转换一个操作数,转换两个操作数,创建一个单独的变量,乘以 100.0f,使用 strtof
和 strtod
而不是转换为 strol
.
至少这些问题:
代码正在寻找一些参数的长度。由于分配的内存不足,此错误随后会在以后的代码中导致 未定义的行为 (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;
在 divide 函数中,您将 print 和 return 替换为:
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;
。