C语言中怎么让100000000000.00+0.000000000001=100000000000.000000000001

什么叫直接做?
int main(int argc, char *argv[]) {
float a = 10000000000.00;
float b = 0.00000000001;
printf("%f\n",a+b);//10000000000.000000
printf("%lf\n",a+b);//10000000000.000000
printf("%.12f\n",a+b);//10000000000.12个0
return 0;
}
我用的GCC环境 Dev C++ 测试的结果都不是

这个单纯的C 和标准库是无法做到的,IEEE定义的浮点数中最长的也只有16个字节,目前是无法放下

100000000000.000000000001

的所有的有效数字的。


可以使用一些其它的科学运算的库来做到。但是呢,最后这个尾数真的这么重要?

#include<stdio.h>

int main()
{

        long double a,b,c;

        a = 100000000000.00;
        b = 0.000000000001;
        c = a + b;

        printf("%.13Lf\n",c);
        printf("sizeof(long double)=%d\n",sizeof(long double));
        return 0;
        //输出:
        //100000000000.0000000000000
        //sizeof(long double)=16



}

追问

好吧。。。我想知道怎么能做到 而且是用简单的方法
我测试了你的 这个程序 结果好夸张

追答

如果是在Linux 有GMP可以用

#include <stdio.h>
#include <stdlib.h>
#include <gmp.h>
 
int main()
{
 mpf_t x;
 mpf_t y;
 mpf_t result;
 
 mpf_init2(x,800);
 mpf_init2(y,800);
 mpf_init2(result,800);
 
 mpf_set_str(x, "1e11", 10);
 mpf_set_str(y, "1e-11", 10);
 
 mpf_add(result, x, y);
 gmp_printf("\n    %.12Ff\n+\n    %.12Ff\n--------------------\n%.12Ff\n\n", x, y, result);
 
 /* free used memory 释放内存 */ 
 mpf_clear(x);
 mpf_clear(y);
 mpf_clear(result);
 return EXIT_SUCCESS;
}
//输出:
//    100000000000.000000000000
//+
//    0.000000000010
//--------------------
//100000000000.000000000010

 

编译时记得加上  -lgmp,比如文件名是  gmp_mpf_test.c

就这么搞

gcc  gmp_mpf_test.c -lgmp  -o gmp_mpf_test

追问

我编译后提示找不到gmp.h文件?是不是要安装什么库

温馨提示:答案为网友推荐,仅供参考
第1个回答  2013-11-26
用long float定义上述浮点型变量试试;追问

GCC环境下没有long float !!!

追答

......
好吧

第2个回答  2013-11-26
在8字节int平台下直接做就是了;在4字节int平台下无法直接做了,只能用字符串自己一位一位做……追问

什么叫直接做?

追答

直接做就是很普通地做呀,不用犯愁,+就+,-就-,x就x,÷就÷,就你你3+5/4*10一样写表达式就行了!

追问

做给我看看