2013-02-16 27 views
-3

如果我有这样的事情:执行代码只有一个变量的总和等于1

double a = 1.0f; 
double b = 1.0f; 
double c = 1.0f; 
double d = 1.0f; 

a /= 3.0f; // 0.3333... 
b /= 3.0f; 
c /= 3.0f; 

if ((a+b+c) == 1) 
    puts("sum equals 1"); 
if (3*a == 1) 
    puts("product equals 1"); 
if (d == 1) 
    puts("d equals 1"); 

不出所料,只有第三一个执行。如果一些自变量的总和等于1,是否有简单的方法来执行代码?编辑:我真的知道为什么(1/3.0)+(1/3.0)+(1/3.0)不是1.但我不知道另一种方式来问它。

+0

请参阅http://stackoverflow.com/questions/4858531/double-equals-0-problem-in-c – 2013-02-16 07:41:19

+0

[每个程序员需要知道什么关于浮点](http:// floating-point-gui。德/)。 (1/3.0)+(1/3.0)+(1/3.0)**在任何有限表示二进制浮点系统中都不会**等于1.0。你可以做的最好的事情是询问它们是否在一个微小的阈值内大致等于1。 – nneonneo 2013-02-16 07:41:48

+0

我知道它为什么不起作用。问题是我怎么能这样做,所以总和工作 – Cn00b 2013-02-16 07:44:04

回答

0

尝试打印a + b + c以及a + b + c-1并比较结果。您会注意到a + b + c-1的结果不完全是0.这一直是个问题,因为浮点运算不能提供无限精度。

一个可能的解决方案是测试abs(a + b + c-1)较小的某个阈值。另一种解决方案是切换到没有浮点的实现,例如用分子,编号表示法。另一个解决方案是实现intervall算术,并检查结果中是否包含零。

您的案例中的最佳解决方案取决于您实际尝试实现的目标。

+0

谢谢。按照您的建议,我使用了一种使用伪分数和分母的方法。 – Cn00b 2013-02-17 03:00:40