Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/design-patterns/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C语言计算器中的大数_C_Calculator - Fatal编程技术网

C语言计算器中的大数

C语言计算器中的大数,c,calculator,C,Calculator,我用C语言编写了一个计算器,除了我尝试将9999999*9999999[八个9乘以八个9]相乘外,其他一切都很好。它会自动将它们四舍五入到100000.0,显然,我不希望发生这种情况。我使用浮点数,精度高达.1。我试着把float改成double,但无论如何都不行。我听说了一些关于%g的事情,但是我没有找到关于它的信息,我不知道如何使它工作。非常感谢您的帮助 编辑 这是我的代码: #include<stdio.h> #include<math.h> int main()

我用C语言编写了一个计算器,除了我尝试将9999999*9999999[八个9乘以八个9]相乘外,其他一切都很好。它会自动将它们四舍五入到100000.0,显然,我不希望发生这种情况。我使用浮点数,精度高达.1。我试着把float改成double,但无论如何都不行。我听说了一些关于%g的事情,但是我没有找到关于它的信息,我不知道如何使它工作。非常感谢您的帮助

编辑 这是我的代码:

#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