当数据精度要求不超过15位有效数字时,可以使用double;
当数据精度要求不超过19位有效数字时,可以使用long double;
如果有更高的精度要求,C语言并没有能直接解决这个问题的定义,应当使用数组,采用“高精度”算法。
扩展资料:
C语言中,双精度浮点(double)型,占8 个字节(64位)内存空间。其数值范围为-1.7E308~1.7E+308,双精度完全保证的有效数字最高是15位,变量定义时,可以简写为double。
long double
C 还提供了 long double 类型,目的是提供一种比 double 更加精确的类型。然而,C 标准仅仅规定 long double 至少要和 double 一样精确。
参考资料来源:百度百科-双精度浮点型
在C语言中,对于数值类型只有通过printf类函数输出这一种方式,比如printf, sprintf, fprintf等。这类函数输出时要求有格式符号,其中long double的格式符号为%llf以下是一个简单的参考代码,输出到标准输出设备。关于long double, 需要说明的是,在原始的C标准中是没有这个类型的,C99中才添加了该类型。而在C99及后续的规范中,对于该类型规定的也并不详细,只是要求long double类型在精度上需要不少于double的精度。于是就出现了有的编译器不支持long double, 而支持的编译器在实现上也有所区别,目前常见的long double有占用8字节,10字节,12字节和16字节四种,但输出格式都是相同的%llf。 如果想知道使用的编译器是如何实现的,可以用printf("%d", sizeof(long double));输出long double占用的空间值。1、float 单精度浮点,8个点,也就是32位数据。double 双精度浮点, 16个点,也就是64位数据。64个大小的东西往32个大小的位置放,肯定是放不下的,肯定就溢出了。2、float,数据以32位二进制形式存入内存单元双精度型:double,数据以64位二进制形式存入内存单元当一个变量的值超过了变量所能表示的范围时,将产生溢出。一个变量只能赋给与之类型相匹配的变量。基本上所有支持类型转换的语言,在高精度向低精度转换时会直接截取高位,所以低位会丢失另外你的第二个printf里边的输出格式控制符是%f(正确的应该是%lf),而变量是long double,在截掉低位之后发生数据丢失,所以会产生第一个结果.你把long去掉当然是正确的结果,至于在mac上和其他电脑的区别,只是机器的问题,但是值并没有改变C语言中float , double , long double三种类型的输入输出格式是有差别的,如果不正确使用,则会造成数据输入或输出的不正常,导致程序运行错误。printf函数在输出浮点数时,控制符可以一律用%f。比如:long double 是C99新出关键字,要使用,需要先确认编译器是否支持C99。如果编译不出错,则支持。否则可能不支持。支持情况下,可以如上进行定义,赋值运算操作与其它基本类型相同。输入输出时,使用格式字符%llf。2. float ,double ,long double默认输出都是小数点后6位,double 和long double 想要输出多的话,可以用格式符来输出printf("x=%.10lf\n",x); 这样就能输出小数点后10位。你的需求是什么,这是一个你想的需求,还是一个其他需求的抽象?