2012-08-06 39 views
0

当我存储12位小数的浮点值后高达6小数地方它是表示固定值。如果它是垃圾值那么它应该是为不同的编译器不同,但是当我看到的输出在我的书,几乎都尝试过,两者都是相同的结果。浮点值

#include <stdio.h> 

int main(void) 
{ 
    float a = 1.234567890000; 

    printf("%.12f\n", a); 
    return 0; 
} 

OUTPUT:

1.234567880630 // In my book it also represents same output. 
+3

你的问题是什么?为什么你的输出与你的输入不符?因为你输入的是10进制数,但是计算机将它存储为2进制数,并且'float'中没有足够的分辨率来准确地获得所有12位小数。 – 2012-08-06 17:13:35

+1

请注意,您从'double'文字开始,将其转换为'float'进行存储,然后将其转换回'double'进行打印。 – 2012-08-06 17:23:03

回答

0

浮子(在大多数系统)存储它在32位的值,对这些位符号,指数和“有效数字”(该值的主要部分)之间划分这会给大多数值提供7到8位数的小数精度,远远低于您所看到的12位数字。

double使用64位,并给出大多数值的15-16位精度。

你周围的7-9th数字越来越奇数值,因为你的编译器有舍入到存储它的价值。舍入方法非常标准,因此编译器通常会给出相同的舍入结果。请注意,C/C++通常要求编译器提供“最小”尺寸,但是这些值可能存储在较大的存储器中,例如在CPU寄存器中,所以您的里程在低有效位上会有所不同。

3

如果它是垃圾值,那么它应该是不同的编译器,但当我看到我的书中的输出,并尝试几乎他们都是相同的结果。

有一个非常好的机会,你的编译器和你正在使用的书都使用IEEE 754标准浮点数,并具有类似mechansims处理的值。因此,他们可能会得到与其他许多编译器和系统相同的答案。

的主要问题是在how floating point values are stored和功能。 32位浮点值没有足够的精度来精确地表示12位小数位,因此您得到的输出与输入的不同。

1

期望编译器实现IEEE 754标准的浮点数。对于float(binary32位),数字有23位,符号有1位。这给你7.x十进制数字。所以你看到的是正确的。

如果你需要它采用52位的数字,并为您提供了34位精度更精确使用双。