这是ANSI C代码:
float x = 3.14159264351134890172; double y = 3.14159264351134890172; long double z = 3.14159264351134890172; printf("%f\n",x); printf("%f\n",y); printf("%f\n",z); printf("%.20f\n",x); printf("%.20f\n",y); printf("%.20f\n",z);
此代码的输出是:
3.141593 3.141593 3.141593 3.14159274101257324219 3.14159264351134881466 3.14159264351134881466
见最后一行输出.我读过,long double
给出了小数点后19位的准确度.但是在这里我得到小数点后的15位精度.所以在我的电脑double
和long double
电脑之间没有区别.我在2.6.32-358.el6.x86_64
CentOS上使用linux内核.我的C编译器是gcc version 4.4.7 20120313 (Red Hat 4.4.7-4) (GCC)
为什么会这样?如果它取决于计算机硬件/架构,我如何购买我的linux机器,其中long double比double更精确?它还依赖于我的C编译器吗?如果是,我如何选择我的C编译器?
对于float
价值范围是1.2E-38 to 3.4E+38
.我不明白.从上面的例子我们看到我们无法在float
变量中正确存储分数十进制数,例如3.1415926 .我的机器只能在该float
变量中正确存储3.141592 .所以我丢失了最后7位数,这是6.那为什么我们说float
范围是1.2*10 ^ -38?
是不是我们不能存储到10 ^ -38但是我们可以float
在C中存储最多10 ^ -6的变量?
首先,你应该打印long double
值%Lf
.
其次,如果您希望long double
变量包含无法表示为a的值,则double
不应使用double
常量对其进行初始化.3.14159264351134890172
具有类型double
,如果您的编译器定义FLT_EVAL_METHOD
为0或1,则使用long double z = 3.14159264351134890172;
集合z
为double
值,即使该类型long double
可以在您的平台上更紧密地表示该常量.相反,该行应为:
long double z = 3.14159264351134890172L;
在"浮动值范围是1.2E-38到3.4E + 38 ......"之后,您的问题的简短答案是您的机器上的浮点格式是基数2,并且这些格式中的可表示值不相同就像它们在基数10中表示一样.float
平台上的类型提供了精确的24 位二进制数字.类型double
提供53,你应该能够long double
提供64.对于StackOverflow格式,长答案太长了,但你可以从阅读http://floating-point-gui.de开始.