当我在最多6个小数位后存储12个小数位的浮点值时它显示固定值。如果它是垃圾值,那么对于不同的编译器它应该是不同的但是当我看到我的书中的输出并且实际上尝试了它它们都是相同的结果。
#include <stdio.h>
int main(void)
{
float a = 1.234567890000;
printf("%.12f\n", a);
return 0;
}
输出:
1.234567880630 // In my book it also represents same output.
答案 0 :(得分:3)
如果它是垃圾值,那么对于不同的编译器它应该是不同的但是当我在我的书中看到输出并且几乎尝试它们时它们都是相同的结果。
您的编译器和您使用的书籍很可能都使用IEEE 754标准来表示浮点数,并且具有类似的处理值的机制。因此,他们可能会得到相同的答案,许多其他编译器和系统也会如此。
主要问题在于how floating point values are stored和功能。 32位浮点值的精度不足以准确表示12位小数,因此输出的输出与输入的输出不同。
答案 1 :(得分:1)
期望编译器为浮点数实现IEEE 754标准。对于float(binary32位),数字有23位,符号有1位。这给你7.x十进制数字。所以你看到的是正确的。
如果您需要更高的精度,请使用双精度数字,它使用52位数字,并为您提供34位精度。
答案 2 :(得分:1)
如果您使用的是浮点数,您可能会发现这是一篇具有启发性的文章,可以避免许多意外:What Every Computer Scientist Should Know About Floating-Point Arithmetic。
请记住,与数学不同,10次0.1几乎不会是1。
答案 3 :(得分:0)
浮点数(在大多数系统上)以32位存储它的值,这些位在符号,指数和&#34之间分配;有效和&#34; (值的主要部分)这给出了大多数值的7到8位小数精度,远远低于你正在看的12位数。
double使用64位,并为大多数值提供15-16位精度。
你得到的奇数值在第7-9位左右,因为你的编译器必须对值进行舍入以存储它。舍入方法几乎是标准的,因此编译器通常会给出相同的舍入结果。
请注意,C / C ++通常要求编译器提供&#34; minimal&#34;但是,这些值可能存储在较大的存储空间中,例如存储在CPU寄存器中,因此您的里程数会因低有效位而异。