为什么这个浮点数的值会改变它的设置?

use*_*312 8 c floating-point floating-accuracy

为什么这个C程序输出"错误"?

#include<stdio.h>

void main()
{
    float f = 12345.054321;

    printf("%f", f);

    getch();
}
Run Code Online (Sandbox Code Playgroud)

输出:

12345.054688
Run Code Online (Sandbox Code Playgroud)

但输出应该是,12345.054321.

我在VS2008中使用VC++.

pax*_*blo 10

它给出了"错误的"答案,因为并非所有真实值都可以通过浮点数表示(或双重表示).你会得到的是基于底层编码的近似值.

为了表示每个实际值,即使在1.0x10 -100和1.1x10 -100之间(真正的微小范围),您仍然需要无限数量的位.

单精度IEEE754值只有32位可用(其中一些用于其他指令,如指数和NaN/Inf表示),因此无法为您提供无限精度.它们实际上有23位可用,精度约为2 24(有一个额外的隐含位)或仅超过7位十进制数(log 10(2 24)大约为7.2).

我在引号中加上"错误"这个词,因为它实际上并没有错.你对计算机如何代表数字的理解是错的(不要被冒犯,你并不孤单于这种误解).

转到http://www.h-schmidt.net/FloatApplet/IEEE754.html并在"十进制表示"框中键入您的号码以查看此操作.

如果你想有一个更准确的数字,用加倍的,而不是花车 - 这些有双重供较值的比特数(假设你的C实现分别使用IEEE754单精度和双精度数据类型float和double).

如果你想要任意精度,你需要使用像GMP这样的"bignum"库,尽管它比本机类型慢一些,所以请确保你理解权衡.