C语言计算器中的大数
我用C语言编写了一个计算器,除了我尝试将9999999*9999999[八个9乘以八个9]相乘外,其他一切都很好。它会自动将它们四舍五入到100000.0,显然,我不希望发生这种情况。我使用浮点数,精度高达.1。我试着把float改成double,但无论如何都不行。我听说了一些关于%g的事情,但是我没有找到关于它的信息,我不知道如何使它工作。非常感谢您的帮助 编辑 这是我的代码:C语言计算器中的大数,c,calculator,C,Calculator,我用C语言编写了一个计算器,除了我尝试将9999999*9999999[八个9乘以八个9]相乘外,其他一切都很好。它会自动将它们四舍五入到100000.0,显然,我不希望发生这种情况。我使用浮点数,精度高达.1。我试着把float改成double,但无论如何都不行。我听说了一些关于%g的事情,但是我没有找到关于它的信息,我不知道如何使它工作。非常感谢您的帮助 编辑 这是我的代码: #include<stdio.h> #include<math.h> int main()
#include<stdio.h>
#include<math.h>
int main()
{
char op;
float numberone,numbertwo;
printf("Enter the operation: ");
scanf("%f%c%f\n", &numberone, &op, &numbertwo);
switch(op) {
case '+':
printf("%.1f + %.1f = %.1f",numberone, numbertwo, numberone+numbertwo);
break;
case '-':
printf("%.1f - %.1f = %.1f",numberone, numbertwo, numberone-numbertwo);
break;
case '*':
printf("%.1f * %.1f = %.1f",numberone, numbertwo, numberone*numbertwo);
break;
case '/':
if(numbertwo==0){
printf("You cannot divide by zero.");
}
else{
printf("%.1f / %.1f = %.1f",numberone, numbertwo, numberone/numbertwo);}
break;
case'^':
printf("%f ^ %f = %f", numberone, numbertwo, pow(numberone,numbertwo));
break;
default:
printf("Error! operator is not correct");
break;
}
return 0;
}
当我乘以99999999*9999999,结果是:100000.0*100000.0=10000.0
#include <stdio.h>
int main(void)
{
float x, y;
scanf("%f %f", &x, &y);
printf("%f\n", x*y);
return 0;
}
你是说数值不准确吗?浮点数总是这样。32位浮点数的精度仅为~6位十进制数字,而双精度浮点数的精度为~15位十进制数字
例如,浮点数浮点数、双精度或长精度双精度将数字存储为尾数和指数,如3x10^15,但与二进制稍有不同。因此,如果存储的整数太大,将其转换回,则肯定会丢失大于小数=不同整数的精度
如果您想处理非常大的数字,可以使用任意精度的算术库,如。您遇到了所有标准类型固有的精度问题。它们以定义的位数表示。对于整数char、short、int、long、long-long,当溢出时,传递负数或0表示无符号。字符8位的Ex:126+3给出-127 对于浮点数float、double、long double,它可能更微妙,因为它们表示为有效位部分的许多位,而指数部分的一些其他位请参阅更多详细信息。实际上,单浮点数可以表示1038大的数字,但精度不超过7或8位小数
如果您真的想用大数字进行精确计算,您应该使用多精度技术或直接使用优秀的库。您的程序将使用这些值,只需使用双精度,在这种情况下,scanf必须使用%lf格式说明符。如果您想要更大的值,您必须学习其他答案中提到的内容。正如建议的那样,如果您需要处理大量数据,您可以使用libgmp。基于您的代码的简化示例:
#include <stdio.h>
#include <stdlib.h>
#include <gmp.h>
int main(void){
char op;
mpz_t x;
mpz_t y;
mpz_t result;
printf("Enter the operation: ");
scanf("%c\n", &op);
char x_str[256];
char y_str[256];
fgets(x_str, sizeof(x_str), stdin);
fgets(y_str, sizeof(y_str), stdin);
mpz_init(x);
mpz_init(y);
mpz_init(result);
mpz_set_str(x, x_str, 10);
mpz_set_str(y, y_str, 10);
switch(op) {
case '+':
mpz_add(result, x, y);
break;
case '*':
mpz_mul(result, x, y);
break;
default:
printf("Error! operator is not correct");
break;
}
gmp_printf("%Zd", x);
printf(" %c ", op);
gmp_printf("%Zd", y);
gmp_printf(" = %Zd\n", result);
mpz_clear(x);
mpz_clear(y);
mpz_clear(result);
return EXIT_SUCCESS;
}
然后运行:
/tmp$ ./big
Enter the operation: *
99999999
99999999
99999999 * 99999999 = 9999999800000001
long-long如何?您能显示对数字进行四舍五入的代码吗?您能发布代码吗?float和double都没有足够的有效小数来包含正确的和99999980000001。这与舍入无关。@SouravGhosh我尝试了long-long,但仍然不起作用。为了好玩,我尝试了long-double,但我目前的gcc似乎有问题——或者我只是做错了什么。你能试试吗?这甚至可能是OP想要的答案。非常感谢你,我想它终于起作用了!这太神奇了,因为安装整个图书馆对我来说太难了。谢谢
/tmp$ gcc big.c -lgmp -o big
/tmp$ ./big
Enter the operation: *
99999999
99999999
99999999 * 99999999 = 9999999800000001