0

当我在最多 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.
4

4 回答 4

3

如果它是垃圾值,那么对于不同的编译器它应该是不同的,但是当我在我的书中看到输出并实际尝试时,它们都是相同的结果。

很有可能您的编译器和您使用的书都使用IEEE 754浮点数标准,并且有类似的机制来处理这些值。因此,他们可能会得到相同的答案,就像许多其他编译器和系统一样。

主要问题在于浮点值如何存储和运行。32 位浮点值没有足够的精度来准确表示您的 12 位小数,因此您得到的输出与您输入的不同。

于 2012-08-06T17:18:30.970 回答
1

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

如果您需要更高的精度,请使用 double,它使用 52 位作为数字并为您提供 34 位精度。

于 2012-08-06T17:24:36.553 回答
1

如果您使用的是浮点数,您可能还会发现这篇文章很有启发性,让您免于许多惊喜:What Every Computer Scientist Should Know About Floating-Point Arithmetic

请记住,与数学不同,0.1 的 10 倍几乎永远不会是 1。

于 2012-08-06T17:27:00.777 回答
0

浮点数(在大多数系统上)将其值存储在 32 位中,这些位分为符号、指数和“有效数”(值的主要部分),这为大多数值提供了 7 到 8 位的十进制精度,很短您正在查看的 12 位数字。

double 使用 64 位并为大多数值提供 15-16 位的精度。

您在第 7-9 位附近获得奇数值,因为您的编译器必须舍入该值才能存储它。舍入方法几乎是标准的,因此编译器通常会给出相同的舍入结果。

请注意,C/C++ 通常要求编译器提供“最小”大小,但是这些值可能存储在更大的存储空间中,例如 CPU 寄存器中,因此您的里程会因低有效位而异。

于 2012-08-06T17:16:41.983 回答