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"库,尽管它比本机类型慢一些,所以请确保你理解权衡.