我读过关于双精度和单精度的区别。然而,在大多数情况下,float和double似乎可以互换,即使用其中一种似乎不会影响结果。真的是这样吗?浮子和双浮子什么时候可以互换?它们之间有什么区别
差别很大
顾名思义,double的精度是浮点的2倍。通常,double的精度为15位小数,而float的精度为7位
以下是计算位数的方法:
double有52个尾数位+1个隐藏位:log(253)÷log(10)=15.95位
float有23个尾数位+1个隐藏位:log(224)÷log(10)=7.22位
这种精度损失可能导致重复计算时累积更大的截断误差,例如:
浮动a=1.f/81;
浮动b=0;
对于(整数i=0;i<;729;++i)
b+=a;
printf(";%.7g\n";,b);//打印9.000023
当
双a=1.0/81;
双b=0;
对于(整数i=0;i<;729;++i)
b+=a;
printf(";%.15g\n";,b);//打印8.9999999996
此外,浮点的最大值约为3e38,而double约为1.7e308,因此使用float可以命中";“无限”;(即一个特殊的浮点数)对于一些简单的事情,例如计算60的阶乘,比双精度容易得多
在测试过程中,可能有一些测试用例包含这些巨大的数字,如果使用浮点,可能会导致程序失败
当然,有时,即使是double也不够准确,因此我们有时会使用长double[1](上面的例子在Mac上给出了9.0000000000000000066),但所有浮点类型都会出现舍入错误,因此如果精度非常重要(例如,货币处理)您应该使用int或分数类
此外,不要使用+=对大量浮点数求和,因为错误积累得很快。如果您使用的是Python,请使用fsum。否则,尝试实现Kahan求和算法
(1):C和C++标准没有指定“代码>浮标、双和 long double 。有可能所有三个都实现为IEEE双精度。然而,对于大多数体系结构(gcc、MSVC;x86、x64、ARM)float实际上是IEEE单精度浮点数(binary32),double是IEEE双精度浮点数(binary64)。