修复双减法的结果值

时间:2014-05-17 14:15:15

标签: c++ double

在没有制作分数类的情况下,C ++中是否有任何方法可以修复错误的结果,例如0.1-0.06-0.04=6.9388e-180.8-0.6-0.2=5.5511151e-17http://ideone.com/ZYx1PB)? 我的意思是:

double val=.1-.06-.04;
unsigned long long hv=*(unsigned long long*)&val;
if((hv&0xFF0FFFFFFFFFFFFF)==0x3C00000000000000ULL)
    val=0;

但是当数字像2 ^ -48时,这当然会出错。

1 个答案:

答案 0 :(得分:4)

0.1-0.06-0.04中的减法没有错。两者都是准确的:

$ cat t.c
#include <stdio.h>

main(){
  printf("%.60f\n", 0.10);
  printf("%.60f\n", 0.06);
  printf("%.60f\n\n", 0.04);
  printf("%.60f\n", 0.1-0.06-0.04);
}
$ gcc t.c && ./a.out 
0.100000000000000005551115123125782702118158340454101562500000
0.059999999999999997779553950749686919152736663818359375000000
0.040000000000000000832667268468867405317723751068115234375000

0.000000000000000006938893903907228377647697925567626953125000

你的程序出了什么问题,你写0.06认为这个数字是6/100。二进制浮点不能以这种方式工作。没有6/100的确切表示。减法有时也是近似值,但在您的示例中不是。